PUSHA, PUSHAD

推动全部 通用寄存器

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
60PUSHAZO无效有效推AX,CX,DX,BX,原SP,BP,SI,和DI.
60PUSHADZO无效有效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 and

IA-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位模式下.

来源