为什么在x86程序集中执行“mov esp,ebp”?

时间:2011-03-29 14:41:32

标签: assembly x86

据说leave指令与:

相同
mov esp,ebp
pop ebp

但这里的mov esp,ebp是什么?这对我来说似乎没有用......

3 个答案:

答案 0 :(得分:89)

mov esp,ebp将堆栈指针设置为基本帧地址,有效地释放整个帧。 (不要忘记这是英特尔语法,目的地是第一位的。)如果你没有这样做,一旦你调用ret,你仍然会使用被调用函数的堆栈帧和你的调用函数,崩溃的后果。

答案 1 :(得分:4)

我认为你的问题是有两种不同的编写x86程序集的方法。一种是AT& T表示法,另一种是Intel表示法。与AT& T相反,指令的参数顺序在Intel表示法中相反。您的程序集版本似乎采用英特尔表示法,这意味着mov esp, ebp会将ebp中的值移动到esp。在更合乎逻辑的(在我看来)AT& T表示法中,它将是mov %ebp, %esp

答案 2 :(得分:1)

编译器使用此指令通过堆栈中的函数释放已用空间,leave指令与mov esp, ebp具有pop ebp的行为相同。