据说leave
指令与以下内容相同:
mov esp,ebp
pop ebp
但是这里的mov esp,ebp
是做什么的?它对我来说似乎不是有效的...
mov esp, ebp
指令将栈指针设置为基帧地址,有效释放整个栈帧。(不要忘记这是Intel语法,目的地在前面。)如果你没有执行此操作,在调用ret
之后,你仍会使用被调用函数的栈帧与你的调用函数一起使用,可能会导致崩溃。
mov esp, ebp
不是将基指针设置为堆栈指针的地址吗?mov ebp, esp
才会更新堆栈指针以指向基础框架。 - Byte Labmovl %ebp,%esp
。 - zneakmov esp, ebp
实际上将ebp
中的值移动到了esp
中。在更合理(我个人认为)的AT&T符号中应该是mov %ebp, %esp
。movd
而不是 mov
。 - zneakmovd
实际上是一个MMX指令。如果你想要包含一个大小后缀(在这种情况下是可选的),你应该使用movl
。 - bugesp = ebp
- phuclvleave
指令与mov esp, ebp
和pop ebp
具有相同的行为。请注意保留HTML标签。enter
和 leave
不能 同时 用于释放堆栈上的已使用空间吧? - Pascal Cuoq