我是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个字节
答案 0 :(得分: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]
答案 1 :(得分:0)
push ebp
la la la la la la la la la la
pop ebp
ret
所以没关系。
一推
一个流行