0

我是 Assembly 的新手,正在阅读有关 x86 中的调用约定的信息。

在以下示例之一中。

cdecl int MyFunction1(int a, int b)
{
 return a + b;
}


 x = MyFunction1(2, 3);


_MyFunction1:
push ebp
mov ebp, esp
mov eax, [ebp + 8]
mov edx, [ebp + 12]
add eax, edx
pop ebp
ret

push 3
push 2
call _MyFunction1
add esp, 8

我能够理解给定代码的大部分内容,但对 pop ebp 已完成的一行有疑问。

我认为正确的调用将是“pop [ebp+4]”,因为在 push ebp 之后,执行 mov ebp,esp 导致 ebp 指针减 4,因此要到达原始位置必须向 ebp 添加 4 个字节。

4

2 回答 2

3

典型的结语如下:

mov esp, ebp
pop ebp
ret

旧的 ebp 存储在当前 ebp 指向的地址。因此mov esp, ebp将堆栈指针放在此地址,因此pop ebp将正确恢复 ebp(和 esp)。

碰巧您可以放弃mov esp, ebp函数中的指令,因为您从不使用堆栈并且 ebp 和 esp 已经指向相同的地址。

pop [ebp+4]将是不正确的,因为这会将堆栈顶部的值放入[ebp+4]

于 2013-06-12T10:52:58.493 回答
0
push ebp
la la la la la la la la la la 
pop ebp
ret

所以没关系。

一推

一个流行音乐

于 2013-06-12T10:58:51.670 回答