操作碼 |
指令 |
說明 |
60 |
PUSHA |
壓入 AX、CX、DX、BX、原始 SP、BP、SI 及 DI |
60 |
PUSHAD |
壓入 EAX、ECX、EDX、EBX、原始 ESP、EBP、ESI 及 EDI |
將通用暫存器的內容壓入堆疊。這些暫存器按以下順序儲存到堆疊:EAX、ECX、EDX、EBX、EBP、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。
#GP - 如果 ESP 或 SP 暫存器包含 7、9、11、13 或 15。
#PF(錯誤程式碼) - 如果發生頁錯誤。
#AC(0) - 如果在啟用對齊檢查的情況下進行未對齊的記憶體引用。