組合語言的運算式
這個主題適用於:
版本 |
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) |