它是汇编中的正确代码吗?

时间:2013-06-12 10:46:45

标签: assembly x86

我是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个字节

2 个答案:

答案 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

所以没关系。

一推

一个流行