PUSHA/PUSHAD - 压入所有通用寄存器
操作码 | 指令 | 说明 |
60 | PUSHA | 压入 AX、CX、DX、BX、原始 SP、BP、SI 及 DI |
60 | PUSHAD | 压入 EAX、ECX、EDX、EBX、原始 ESP、EBP、ESI 及 EDI |
说明
将通用寄存器的内容压入堆栈。这些寄存器按以下顺序存储到堆栈:EAX、ECX、EDX、EBX、ESP(原始值)、EBP、ESI 及 EDI(如果当前操作数大小属性为 32);AX、CX、DX、BX、SP(原始值)、BP、SI 及 DI(如果操作数大小属性为 16)。这些指令执行 POPA/POPAD 指令的逆操作。ESP 或 SP 寄存器压入的值是它在第一个寄存器压入之前的值(请参阅下面的“操作”部分)。
PUSHA(全部压入)与 PUSHAD(压入所有双字)助记符引用相同的操作码。当操作数属性为 16 时,使用 PUSHA 指令,而当操作数属性为 32 时,使用 PUSHAD 指令。某些汇编器可能在使用 PUSHA 时将操作数大小强制为 16,而在使用 PUSHAD 时将操作数大小强制为 32。其它汇编器可能会将这些助记符看作同义词 (PUSHA/PUSHAD),并使用操作数大小属性的当前设置来确定要压入堆栈的值的大小,而不管使用哪一个助记符。
在实地址模式中,如果执行 PUSH/PUSHAD 指令时,ESP 或 SP 寄存器为 1、3 或 5,则处理器会由于堆栈空间不足而关闭。不会生成指示此情况的异常。
操作
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;
影响的标志
无。
保护模式异常
#SS(0) - 如果起始或结束堆栈地址超出堆栈段限制。
#PF(错误代码) - 如果发生页错误。
#AC(0) - 如果在当前特权级别为 3 且启用对齐检查的情况下进行未对齐的内存引用。
实地址模式异常
#GP - 如果 ESP 或 SP 寄存器包含 7、9、11、13 或 15。
虚 8086 模式异常
#GP - 如果 ESP 或 SP 寄存器包含 7、9、11、13 或 15。
#PF(错误代码) - 如果发生页错误。
#AC(0) - 如果在启用对齐检查的情况下进行未对齐的内存引用。