PUSHF/PUSHFD - 將 EFLAGS 暫存器壓入堆疊

操作碼

指令

說明

9C

PUSHF

壓入 EFLAGS 的低 16 位

9C

PUSHFD

壓入 EFLAGS

說明

將堆疊指針遞減 4(如果目前運算元大小屬性為 32),並將 EFLAGS 暫存器的全部內容壓入堆疊;或將堆疊指針遞減 2(如果目前運算元大小屬性為 16),並將 EFLAGS 暫存器的低 16 位(即 FLAGS 暫存器)壓入堆疊。(這些指令執行 POPF/POPFD 指令的逆操作)。將整個 EFLAGS 暫存器複製到堆疊時,不會複製 VM 與 RF 標誌(位 16 與 17);相反,在儲存到堆疊的 EFLAGS 映像中,這些標誌的值會被清除。如需有關 EFLAGS 暫存器的詳細資訊,請參閱“IA-32 英特爾(R) 體系結構軟件開發人員手冊”第 1 卷第 3 章中標題為“EFLAGS 暫存器”的部分。

PUSHF(壓入標誌)與 PUSHFD(壓入標誌雙字)助記符引用相同的操作碼。當運算元屬性為 16 時,使用 PUSHF 指令,而當運算元屬性為 32 時,使用 PUSHFD 指令。某些彙編器可能在使用 PUSHF 時將運算元大小強制為 16,而在使用 PUSHFD 時將運算元大小強制為 32。其它彙編器可能會將這些助記符看作同義詞 (PUSHF/PUSHFD),並使用運算元大小屬性的當前設定來確定要壓入堆疊的值的大小,而不管使用哪一個助記符。

在虛 8086 模式中且 I/O 特權級別 (IOPL) 小於 3 時,PUSHF/PUSHFD 指令會導致一般保護性異常 (#GP)。

在實地址模式中,如果執行 PUSH/PUSHAD 指令時,ESP 或 SP 暫存器為 1、3 或 5,則處理器會由於堆疊空間不足而關閉。不會產生指示此情況的異常。

操作

IF (PE=0) OR (PE=1 AND ((VM=0) OR (VM=1 AND IOPL=3)))
(* Real-Address Mode, Protected mode, or Virtual-8086 mode with IOPL equal to 3 *)
THEN
IF OperandSize 32
THEN
push(EFLAGS AND 00FCFFFFH);
(* VM and RF EFLAG bits are cleared in image stored on the stack*)
ELSE
push(EFLAGS); (* Lower 16 bits only *)
FI;
ELSE (* In Virtual-8086 Mode with IOPL less than 0 *)
#GP(0); (* Trap to virtual-8086 monitor *)
FI;

影響的標誌

無。

保護模式異常

#SS(0) - 如果 ESP 暫存器超出堆疊段的邊界。

#PF(錯誤程式碼) - 如果發生頁錯誤。

#AC(0) - 如果在目前特權級別為 3 且啟用對齊檢查的情況下進行未對齊的記憶體引用。

實地址模式異常

無。

虛 8086 模式異常

#GP(0) - 如果 I/O 特權級別小於 3。

#PF(錯誤程式碼) - 如果發生頁錯誤。

#AC(0) - 如果在啟用對齊檢查的情況下進行未對齊的記憶體引用。