混在する式の例

このトピックには、さまざまなコマンドで使用される MASM 式と C++ 式の例が含まれています。

このヘルプ ドキュメントの他のすべてのセクションでは、例として MASM 式の構文を使用します (特に明記されていない限り)。 C++ 式の構文は、構造体と変数を操作する場合に非常に便利ですが、デバッガー コマンドのパラメーターの解析にはあまり適しません。

一般的な目的でデバッガー コマンドを使用する場合、またはデバッガー拡張機能を使用する場合は、MASM 式の構文を既定の構文として設定する必要があります。たとえば、 .expr (式エバリュエーターの選択) を使用します。 特定のパラメーターに C++ 式構文を使用する必要がある場合は、 @@( ) 構文を使用します。

myInt が ULONG32 値であり、MASM 式エバリュエーターを使用している場合、次の 2 つの例は MyInt の値を示しています。

0:000> ?? myInt 
0:000> dd myInt L1 

ただし、次の例は myIntアドレス を示しています。

0:000> ? myInt 

条件付きブレークポイント

比較演算子を使用して、 条件付きブレークポイントを作成できます。 次のコード例では、MASM 式の構文を使用します。 現在の既定の基数は 16 であるため、この例では 0n プレフィックスを使用して、数値 20 を 10 進数として認識します。

0:000> bp MyFunction+0x43 "j ( poi(MyVar)>0n20 ) ''; 'gc' " 

前の例では、 MyVar は C ソースの整数です。 MASM パーサーはすべてのシンボルをアドレスとして扱うため、 MyVarを逆参照するには poi 演算子が必要です。

条件式

次の例は、 eaxebxより大きければ ecx の値を、 eaxebxより小さければ7の値を、 eaxebxと等しければ3の値を表示する。 この例では MASM 式エバリュエーターを使用するため、等号 (=) は代入演算子ではなく比較演算子です。

0:000> ? ecx*(eax>ebx) + 7*(eax<ebx) + 3*(eax=ebx) 

C++ 構文では、 @ 符号はレジスタを示し、二重等号 (==) は比較演算子であり、コードは BOOL から intに明示的にキャストする必要があります。したがって、C++ 構文では、前のコマンドは次のようになります。

0:000> ?? @ecx*(int)(@eax>@ebx) + 7*(int)(@eax<@ebx) + 3*(int)(@eax==@ebx) 

MASM および C++ が混在する式の例

C++ 式でソース行式を使用することはできません。 次の例では、 @@( ) 代替評価構文を使用して、C++ 式内に MASM 式をネストします。 この使用例は、 MyPtr を Myfile.c ファイルの 43 行目のアドレスに設定します。

0:000> ?? MyPtr = @@( `myfile.c:43` )

次の例では、既定の式エバリュエーターを MASM に設定し、 Expression2 を C++ 式として評価し、 Expression1Expression3 を MASM 式として評価します。

0:000> .expr /s masm 
0:000> bp Expression1 + @@( Expression2 ) + Expression3 

myInt が ULONG64 値であり、この値の後にメモリ内で別の ULONG64 が続くことがわかっている場合は、次の例のいずれかを使用して、その場所にアクセス ブレークポイントを設定できます。 (ポインター算術の使用に注意してください)。

0:000> ba r8 @@( &myInt + 1 ) 
0:000> ba r8 myInt + 8 

関連項目

MASM の数値と演算子

C++ の数値と演算子

MASM 式 vs. C++ 式

署名拡張機能