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

据说leave指令与以下内容相同:

mov esp,ebp
pop ebp

但是什么是mov esp,ebp在这里? 这对我来说似乎并不合适......


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


我认为你的问题是有两种不同的编写x86汇编的方式。 一个是AT&T符号,另一个是Intel符号。 英特尔符号与AT&T相反,指令参数的顺序颠倒过来。 您的程序集版本显示为英特尔符号,这意味着mov esp, ebp地将ebp的值移至esp 。 在更符合逻辑的(在我看来)AT&T符号中,它将是mov %ebp, %esp


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

链接地址: http://www.djcxy.com/p/85889.html

上一篇: Why does leave do "mov esp,ebp" in x86 assembly?

下一篇: What does MOV EAX, DWORD PTR DS:[ESI] mean and what does it do?