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;
}
尽管优化编译器选择了一些捷径。