共用方式為


混合表達式範例

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

本說明檔的其他所有章節都會在範例中使用MASM表達式語法(除非另有註明)。 C++ 表達式語法非常適用於操作結構和變數,但不會非常妥善地剖析調試程式命令的參數。

如果您將調試程式命令用於一般用途或使用調試程式擴充功能,您應該將MASM表達式語法設定為預設語法,例如使用 .expr (Choose Expression 評估工具)。 如果您必須有特定參數才能使用 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

條件運算式

如果 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++ 運算式,並將 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++ 運算式

簽署延伸模組