首页 > 解决方案 > 为什么编译器不使用 ENTER 和 LEAVE 指令?

问题描述

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

标签: assemblyx86x86-64compiler-optimization

解决方案


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

这些指令在i286i386时代已经使用过,所以在 1999 年之前。

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


推荐阅读