为什么编译器不使用 ENTER 和 LEAVE 指令?

Why are the instructions ENTER and LEAVE not used by compilers?

阅读程序的反汇编时,我注意到了一种模式。在设置函数的框架时,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

Why are the instructions ENTER and LEAVE not used by compilers?

这些指令在i286 and i386时代已经使用,所以在1999年之前。

今天,这些机器指令一般 比简单的等价物慢。编译器编写者确实知道这一点,因此请避免发出这些机器指令。