混在する式の例
このトピックには、さまざまなコマンドで使用される 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 演算子が必要です。
条件式
次の例は、 eax が ebxより大きければ ecx の値を、 eax が ebxより小さければ7の値を、 eax が ebxと等しければ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++ 式として評価し、 Expression1 と Expression3 を 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