LEAVE

高级程序退出

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
C9LEAVEZO有效有效设置 SP 到 BP, 然后流行 BP.
C9LEAVEZO不可编码有效设置 ESP 到 EBP, 然后流行 EBP.
C9LEAVEZO有效不可编码设置 RSP 到 RBP, 然后流行 RBP.

实测开销

正在从 arch-data 加载实测数据...

说明

释放由较早的 ENTER 指令设置的堆栈框架 。 LEAVE指令将帧指针(在EBP寄存器中)复制到栈指针寄存器(ESP)中,释放分配给堆栈帧的堆栈空间. 旧的帧指针(ENTER指令保存的调用程序的帧指针)然后从堆栈中弹出到EBP寄存器,恢复调用程序的堆栈帧.

一个RET指令通常按照一个LEAVE指令执行,以将程序控制返回呼叫程序.

参见英特尔(R)64和IA-32架构软件开发者手册第1卷第6章中的"程序要求 block-Structured languages",关于使用ENTER和LEAVE指令的详细信息.

在64位模式下,指令的默认操作大小为64位;32位操作无法编码. 参见本节开头的汇总图,用于编码数据和限制.

行动

IF StackAddressSize = 32

    THEN
          ESP := EBP;

   ELSE IF StackAddressSize = 64

          THEN RSP := RBP; FI;

   ELSE IF StackAddressSize = 16

          THEN SP := BP; FI;
FI;

IF OperandSize = 32

    THEN EBP := Pop();

   ELSE IF OperandSize = 64

          THEN RBP := Pop(); FI;

   ELSE IF OperandSize = 16

          THEN BP := Pop(); FI;
FI;

受影响的旗帜

None.

异常

保护模式
#SS(0)如果 EBP 寄存器指向一个不在当前堆栈段范围内的位置. #PF(fault-code) 如果 页面错误 发生的话.
#AC(0)如果启用了对齐检查,并且在当前特权级别为3时会给出不对齐的内存引用.
#UD如果使用 LOCK 前缀 。
实地址模式
#GP如果 EBP 寄存器将有效地址空间以外的位置从 0 到 FFFFH 。
#UD如果使用 LOCK 前缀 。
虚拟 8086 模式
#GP(0)如果 EBP 寄存器指向有效地址空间以外的位置从 0 到 FFFFH. #PF(fault-code) 如果 页面错误 发生.
#AC(0)如果启用对齐检查, 并使用不对齐的内存引用 。
#UD如果使用 LOCK 前缀 。
兼容模式
与保护模式中的例外相同.
64 位模式
#SS(0)如果堆栈地址是非冠状的.
#AC(0)如果启用了对齐检查,并且在当前特权级别为3时会给出不对齐的内存引用.
#UD如果使用 LOCK 前缀 。

来源