跳转到内容

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;
 }

尽管优化编译器选择了一些捷径。

华夏公益教科书