为什么要在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, ebp
和pop ebp
具有相同的行为。