次の方法で共有


混合表現の例

このトピックには、さまざまなコマンドで使用される 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、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 式と C++ 式

拡張機能に署名する