阅读程序的反汇编代码后,我注意到一个模式。当设置函数的框架时,指令
为什么没有使用
enter
很少使用。我还使用了最新的GCC编译器 - GCC不使用enter
,而是使用leave
。为什么没有使用
enter
指令?为什么编译器使用两个或多个指令来执行可以用一个指令完成的操作(推动rbp,保存rsp,并使用sub rsp
在堆栈上分配内存,而不是使用enter 0x20,0
)?但是使用了leave
... 还有其他leave
执行的操作吗?就我所知,leave
等同于mov ebp, esp
pop ebp
GCC 使用 leave
,而 MSVC 不使用。我不明白为什么从不使用 enter
,有时会使用 leave
。
leave
做了什么,而是enter
做了什么。enter
是疯狂的,它应该为块结构化高级语言中的嵌套堆栈帧提供汇编支持。由于现代处理器无法使enter
的一般形式变得快速,即使是仅为当前堆栈帧保留堆栈空间的较不疯狂版本也被处理器实现者所忽视。如果您查看 Agner Fog 的指令表,您会发现enter a, 0
比push; mov; sub
慢约3-4倍,而enter a,b
实际上需要很长时间。 - EOFleave
的解释 @EOF - Arush Agarampur