PUSHA, PUSHAD
推动全部 通用寄存器
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
60 | PUSHA | ZO | 无效 | 有效 | 推AX,CX,DX,BX,原SP,BP,SI,和DI. |
60 | PUSHAD | ZO | 无效 | 有效 | Push EAX,ECX,EDX,EBX,原ESP,EBP,ESI,以及EDI. |
实测开销
未实测:不在 64 位处理器上运行。
说明
将 通用寄存器 的内容推到堆栈上。 登记册按以下顺序存放在堆栈上: EAX,ECX,EDX,EBX,ESP(原值),EBP,ESI,以及EDI(如果当前操作数的大小属性为32)和AX,CX,DX,BX,SP(原值),BP,SI,和DI(如果操作数的大小属性为16). 这些指令执行POPA/POPAD指令的反向操作. ESP或SP寄存器的推值是在推动第一个寄存器之前的值(见下文"操作"部分).
PUSHA(全部推)和PUSHAD(全部推双)mnemonics参考了相同的操作码. PUSHA指令用于操作数大小属性为16,PUSHAD指令用于运行大小属性为32时. 一些组装器在使用PUSHA时可能会将操作数大小强制至16,在使用PUSHAD时可能会强制至32. 其他人可能将这些mnemonics作为同义词(PUSHA/PUSHAD)处理,并使用操作数大小属性的当前设置来确定从堆栈中推出的值大小,而不管使用的mnemonic.
在实地址模式中,如果ESP或SP寄存器在PUSHA/PUSHAD执行时为1,3或5:生成#SS例外但未交付(所报告的堆栈错误阻止#SS交付). 接下来,处理器生成一个
#DF exception and enters a shutdown state as described in the #DF discussion in Chapter 7 of the Intel(R) 64 andIA-32 架构软件开发者手册,第3A卷.
此指令以兼容模式和遗留模式执行 。 在64位模式下无效 。
行动
IF 64-bit Mode
THEN #UD
FI;
IF OperandSize = 32 (* PUSHAD instruction *)
THEN
Temp := (ESP);
Push(EAX);
Push(ECX);
Push(EDX);
Push(EBX);
Push(Temp);
Push(EBP);
Push(ESI);
Push(EDI);
ELSE (* OperandSize = 16, PUSHA instruction *)
Temp := (SP);
Push(AX);
Push(CX);
Push(DX);
Push(BX);
Push(Temp);
Push(BP);
Push(SI);
Push(DI);
FI;受影响的旗帜
None.
异常
保护模式
#SS(0) | 如果开始或结束的堆栈地址在堆栈段限制之外。 #PF(fault-code) 如果发生 页面错误 。 |
#AC(0) | 如果在当前特权级别为3时引用不匹配的内存,并启用对齐检查. |
#UD | 如果使用 LOCK 前缀 。 |
实地址模式
#GP | 如果 ESP 或 SP 登记册包含 7、9、11、13 或 15 个。 |
#UD | 如果使用 LOCK 前缀 。 |
虚拟 8086 模式
#GP(0) | 如果 ESP 或 SP 寄存器包含 7,9,11,13 或 15. #PF(fault-code) 如果 页面错误 发生. |
#AC(0) | 如果在启用对齐检查时进行了不匹配的内存引用 。 |
#UD | 如果使用 LOCK 前缀 。 |
兼容模式
| 与保护模式中的例外相同. |
64 位模式
#UD | 如果在64位模式下. |