LEAVE
高级程序退出
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
C9 | LEAVE | ZO | 有效 | 有效 | 设置 SP 到 BP, 然后流行 BP. |
C9 | LEAVE | ZO | 不可编码 | 有效 | 设置 ESP 到 EBP, 然后流行 EBP. |
C9 | LEAVE | ZO | 有效 | 不可编码 | 设置 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 前缀 。 |