操作碼 |
指令 |
說明 |
61 |
POPA |
彈出 DI、SI、BP、BX、DX、CX 及 AX |
61 |
POPAD |
彈出 EDI、ESI、EBP、EBX、EDX、ECX 及 EAX |
將雙字 (POPAD) 或字 (POPA) 從堆疊彈入通用暫存器。這些暫存器按以下順序載入:EDI、ESI、EBP、EBX、EDX、ECX 及 EAX(如果運算元大小屬性為 32);DI、SI、BP、BX、DX、CX 及 AX(如果運算元大小屬性為 16)。(這些指令執行 PUSHA/PUSHAD 指令的逆操作)。忽略堆疊上 ESP 或 SP 暫存器的值。相反,每次載入暫存器之後,ESP 或 SP 暫存器將遞增。
POPA(全部彈出)與 POPAD(彈出所有雙字)助記符引用相同的操作碼。POPA 指令旨在用於運算元大小屬性為 16 時;POPAD 指令旨在用於運算元大小屬性為 32 時。某些彙編器會在使用 POPA 時將運算元大小強制變成 16,在使用 POPAD 時將運算元大小強制變成 32(必要時使用運算元大小覆蓋字首 [66H])。其它彙編器可能會將這些助記符看作同義詞 (POPA/POPAD),並使用運算元大小屬性的當前設定來確定要從堆疊彈出的值的大小,而不管使用哪一個助記符。(目前程式碼段的段描述符中的 D 標誌確定運算元大小屬性)。
IF OperandSize 32 (* instruction POPAD *)
THEN
EDI Pop();
ESI Pop();
EBP Pop();
increment ESP by 4 (* skip next 4 bytes of stack *)
EBX Pop();
EDX Pop();
ECX Pop();
EAX Pop();
ELSE (* OperandSize 16, instruction POPA *)
DI Pop();
SI Pop();
BP Pop();
increment ESP by 2 (* skip next 2 bytes of stack *)
BX Pop();
DX Pop();
CX Pop();
AX Pop();
FI;
無。
#SS(0) - 如果堆疊的起始或結束地址不在堆疊段內。
#PF(錯誤程式碼) - 如果發生頁錯誤。
#AC(0) - 如果在目前特權級別為 3 且啟用對齊檢查的情況下進行未對齊的記憶體引用。
#SS - 如果堆疊的起始或結束地址不在堆疊段內。
#SS(0) - 如果堆疊的起始或結束地址不在堆疊段內。
#PF(錯誤程式碼) - 如果發生頁錯誤。
#AC(0) - 如果在啟用對齊檢查的情況下進行未對齊的記憶體引用。