組合語言的運算式

這個主題適用於:

版本

Visual Basic

C#

F#

C++

Web Developer

Express

標題不適用於 標題不適用於 標題不適用於

僅適用原生

標題不適用於

Pro、Premium 和 Ultimate

標題不適用於 標題不適用於 標題不適用於

僅適用原生

標題不適用於

偵錯工具可正確地評估組合語言的運算式,不過有一些限制。 一些用於組合語言運算式的語法和用於組合語言開發系統 (例如 Microsoft Macro Assembler,MASM) 的語法不同。

記憶體運算子

記憶體運算子為一元運算子,傳回直接記憶體運算的結果。 這些運算子主要用來偵錯組合語言程式碼。

{BY | WO | DW} address

BY 運算子會傳回包含第一個位元組位址值的短整數 (Short Integer)。 這個運算子會模擬 BYTE PTR。

WO 運算子會傳回包含字元組 (兩個位元組) 位址值的短整數。 這個運算子會模擬 Microsoft Macro Assembler WORD PTR 運算。 DW 運算子會傳回包含前四個位元組位址值的長整數 (Long Integer)。 這個運算子會模擬 DWORD PTR。

用於以下一些範例中的 x 格式規範,將會使結果以十六進位顯示。

範例

  • 若要顯示變數 sum 位址的第一個位元組:

    BY sum

  • 若要顯示變數 new_set 位址的第一個字元組:

    WO new_set

  • 若要顯示 sum 位址的 Doubleword:

    DW sum

  • 若要顯示加上位移 6 的 EBP 暫存器所指到的位元組:

    BY ebp+6,x

  • 若要顯示堆疊指標所指到的字元組,也就是推入堆疊中的最後字元組:

    WO esp,x

  • 若要顯示 ESI 暫存器所指到的 Doubleword:

    DW esi,x

暫存器間接定址

偵錯工具無法辨識以角括弧 ([ ]) 來指出暫存器所指到的記憶體位置。 請改用 BY、WO 和 DW 運算子來參考對應的位元組、字元組或 Doubleword 值。

MASM 運算式

偵錯工具運算式

C++ 運算式

BYTE PTR [bx]

BY ebx

*(unsigned char) ebx

WORD PTR [bp]

WO ebp

*(unsigned short *) ebp

DWORD PTR [bp]

DW ebp

*(unsigned long *) ebp

加上位移的暫存器間接定址

若要執行加上位移的基底、索引或基底索引間接模式運算,請使用帶有加號運算子的 BY、WO 和 DW 運算子。

MASM 運算式

偵錯工具運算式

BYTE PTR [edi+6]

BY edi+6

BYTE PTR Test[ebx]

BY &Test+ebx

WORD PTR [esi][ebp+6]

WO esi+ebp+6

DWORD PTR [ebx][esi]

DW ebx+esi

變數的位址

請使用 C 傳址運算子 (&),而非 MASM OFFSET 運算子。

MASM 運算式

偵錯工具運算式

OFFSET Var

&Var

PTR 運算子

使用型別轉換 (Type Cast) 或帶有傳址運算子 (&) 的 BY、WO 和 DW 運算子,來取代組合語言的 PTR 運算子。

MASM 運算式

偵錯工具運算式

BYTE PTR Var

BY &Var

*(unsigned char*)

&Var

WORD PTR Var

WO &Var

DWORD PTR Var

DW &Var

*(unsigned long*)

&Var

組合語言的字串

在變數名稱後面加入字串格式規範 ,s。

MASM 運算式

偵錯工具運算式

String

String,s

因為 C 字串是以 Null (ASCII 0) 字元來結尾,所以當您要求顯示一個字串時,偵錯工具將從變數的第一個位元組顯示到記憶體中的下個 Null 位元組之間的所有字元。 如果您想要偵錯組合語言程式,並想在 [監看式] 視窗內檢視字串,您應該以 null 字元來分隔字串變數。 要輕鬆地檢視 null 結尾或未結束的字串,就是使用 [記憶體] 視窗。

陣列和結構元素

在陣列名稱前面加上傳址運算子 (&),並加入需要的位移 (Offset)。 位移可以是運算式、數值、暫存器名稱或變數。

下列範例顯示如何針對位元組、字元組或 Doubleword 的陣列進行此處理。

MASM 運算式

偵錯工具運算式

String[12]

BY &String+12*(&String+12)

aWords[bx+di]

WO &aWords+bx+di*(unsigned*)(&aWords+bx+di)

aDWords[bx+4]

DW &aDWords+bx+4*(unsigned long*)(&aDWords+bx+4)

請參閱

其他資源

原生 C++ 中的運算式