跳轉到內容

x86 反彙編/函式和堆疊幀示例

來自華夏公益教科書

示例:引數數量

[編輯 | 編輯原始碼]

給定以下反彙編函式(在 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;
 }

示例:標準入口序列

[編輯 | 編輯原始碼]

以下函式是否遵循標準入口和退出序列?如果不是,它在何處不同?

_Question2:
  call _SubQuestion2
  mov ecx, 2
  mul ecx
  ret

該函式不遵循標準入口序列,因為它沒有使用 ebp 和 esp 設定適當的堆疊幀。該函式基本上執行以下 C 指令

 int Question2()
 {
    return SubQuestion2() * 2;
 }

儘管最佳化編譯器選擇了一些捷徑。

華夏公益教科書