PUSHA/PUSHAD

http://124.16.151.186/docs/optimization/VTune(TM) User's Guide/mergedProjects/analyzer_ec/mergedProjects/reference_olh/instruct32_hh/vc267.htmide

 

说明

将通用寄存器的内容压入堆栈。这些寄存器按如下顺序存储到堆栈:EAX、ECX、EDX、EBX、EBP、ESP(原始值)、EBP、ESI 及 EDI(若是当前操做数大小属性为 32);AX、CX、DX、BX、SP(原始值)、BP、SI 及 DI(若是操做数大小属性为 16)。这些指令执行 POPA/POPAD 指令的逆操做。ESP 或 SP 寄存器压入的值是它在第一个寄存器压入以前的值(请参阅下面的“操做”部分)。ui

PUSHA(所有压入)与 PUSHAD(压入全部双字)助记符引用相同的操做码。当操做数属性为 16 时,使用 PUSHA 指令,而当操做数属性为 32 时,使用 PUSHAD 指令。某些汇编器可能在使用 PUSHA 时将操做数大小强制为 16,而在使用 PUSHAD 时将操做数大小强制为 32。其它汇编器可能会将这些助记符看做同义词 (PUSHA/PUSHAD),并使用操做数大小属性的当前设置来肯定要压入堆栈的值的大小,而无论使用哪个助记符。htm

在实地址模式中,若是执行 PUSH/PUSHAD 指令时,ESP 或 SP 寄存器为 一、3 或 5,则处理器会因为堆栈空间不足而关闭。不会生成指示此状况的异常。get

操做

IF OperandSize PUSHA/PUSHAD 32 (* PUSHAD instruction *)
THEN
Temp PUSHA/PUSHAD (ESP);
Push(EAX);
Push(ECX);
Push(EDX);
Push(EBX);
Push(Temp);
Push(EBP);
Push(ESI);
Push(EDI);
ELSE (* OperandSize PUSHA/PUSHAD 16, PUSHA instruction *)
Temp PUSHA/PUSHAD (SP);
Push(AX);
Push(CX);
Push(DX);
Push(BX);
Push(Temp);
Push(BP);
Push(SI);
Push(DI);
FI;it

本站公众号
   欢迎关注本站公众号,获取更多信息