x86 反彙編/函式和堆疊幀示例
外觀
< X86 反彙編
| 此程式碼示例使用 MASM 語法 |
給定以下反彙編函式(在 MASM 語法中),此函式接收多少個 4 位元組引數?在堆疊上建立了多少個變數?此函式做什麼?
_Question1:
push ebp
mov ebp, esp
sub esp, 4
mov eax, [ebp + 8]
mov ecx, 2
mul ecx
mov [esp + 0], eax
mov eax, [ebp + 12]
mov edx, [esp + 0]
add eax, edx
mov esp, ebp
pop ebp
ret
上面的函式接受 2 個 4 位元組引數,分別透過 ebp 的偏移量 +8 和 +12 訪問。該函式還在堆疊上建立了 1 個變數,透過 esp 的偏移量 +0 訪問。該函式幾乎與以下 C 程式碼相同
int Question1(int x, int y)
{
int z;
z = x * 2;
return y + z;
}
| 此程式碼示例使用 MASM 語法 |
以下函式是否遵循標準入口和退出序列?如果不是,它在何處不同?
_Question2:
call _SubQuestion2
mov ecx, 2
mul ecx
ret
該函式不遵循標準入口序列,因為它沒有使用 ebp 和 esp 設定適當的堆疊幀。該函式基本上執行以下 C 指令
int Question2()
{
return SubQuestion2() * 2;
}
儘管最佳化編譯器選擇了一些捷徑。