共用方式為


混合運算式範例

本主題包含各種命令中使用的 MASM 和 C++ 運算式範例。

本說明文件的所有其他部分在範例中使用 MASM 運算式語法 (除非另有說明)。 C++ 表達式語法對於操作結構和變數非常有用,但它不能很好地解析偵錯器命令的參數。

如果您將偵錯工具命令用於一般用途或使用偵錯工具延伸模組,您應該將 MASM 運算式語法設定為預設語法,例如使用 .expr (選擇運算式評估器)。 如果您必須有特定參數才能使用 C++ 運算式語法,請使用 @@( ) 語法。

如果 myInt 是ULONG32值,而且您使用 MASM 運算式評估器,下列兩個範例會顯示 MyInt 的值。

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

不過,下列範例顯示 myInt位址

0:000> ? myInt 

條件式中斷點

您可以使用比較運算子來建立 條件式岔斷點。 下列程式碼範例使用 MASM 運算式語法。 因為目前的預設基數是 16,所以範例使用 0n 字首,以便將數字 20 理解為十進位數。

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

在上一個範例中, MyVar 是 C 來源中的整數。 因為 MASM 剖析器會將所有符號視為位址,所以範例必須具有 poi 運算子才能解參考 MyVar

條件表達式

下列範例會列印 ecx 的值,如果 eax 大於 ebx,則列印 7 如果 eax 小於 ebx,則列印 3 如果 eax 等於 ebx。 此範例使用 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++ 運算式中使用原始程式碼行運算式。 下列範例會使用 @@( ) 替代評估器語法,將 MASM 運算式巢狀化在 C++ 運算式內。 此範例會將 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++表達式

符號擴展