PUSH - 將字或雙字壓入堆疊

操作碼

指令

說明

FF /6

PUSH r/m16

壓入 r/m16

FF /6

PUSH r/m32

壓入 r/m32

50+rw

PUSH r16

壓入 r16

50+rd

PUSH r32

壓入 r32

6A

PUSH imm8

壓入 imm8

68

PUSH imm16

壓入 imm16

68

PUSH imm32

壓入 imm32

0E

PUSH CS

壓入 CS

16

PUSH SS

壓入 SS

1E

PUSH DS

壓入 DS

06

PUSH ES

壓入 ES

0F A0

PUSH FS

壓入 FS

0F A8

PUSH GS

壓入 GS

說明

遞減堆疊指針,然後將源運算元儲存到棧頂。堆疊段的地址大小屬性確定堆疊指針大小(16 位或 32 位),目前程式碼段的運算元大小屬性確定堆疊指針的遞減量(2 位元組或 4 位元組)。例如,如果這些地址大小屬性與運算元大小屬性為 32,則 32 位 ESP 暫存器(堆疊指針)遞減 4,如果這些屬性為 16,則 16 位 SP 暫存器遞減 2。(堆疊段的段描述符中的 B 標誌確定堆疊的地址大小屬性,目前程式碼段的段描述符中的 D 標誌與字首確定源運算元的運算元大小屬性與地址大小屬性)。堆疊地址大小屬性為 32 時,壓入 16 位運算元可能會導致堆疊指針未對齊(即堆疊指針未與雙字邊界對齊)。

PUSH ESP 指令將 ESP 暫存器按執行此指令之前的值壓入。這樣,在 PUSH 指令使用記憶體運算元,而此運算元的地址計算將 ESP 暫存器用作基址暫存器時,運算元的有效地址可以在 ESP 暫存器遞減之前進行計算。

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

英特爾(R) 體系結構相容性

對於英特爾(R) 286 之後的“英特爾(R) 體系結構”處理器,PUSH ESP 指令將 ESP 暫存器按執行此指令之前的值壓入。(在實地址與虛 8086 模式中也是如此)。對於英特爾(R) 8086 處理器,PUSH SP 指令壓入 SP 暫存器的新值(即將它遞減 2 之後的值)。

操作

IF StackAddrSize 32
THEN
IF OperandSize 32
THEN
ESP ESP - 4;
SS:ESP SRC; (* push doubleword *)
ELSE (* OperandSize 16*)
ESP ESP - 2;
SS:ESP SRC; (* push word *)
FI;
ELSE (* StackAddrSize 16*)
IF OperandSize 16
THEN
SP SP - 2;
SS:SP SRC; (* push word *)
ELSE (* OperandSize 32*)
SP SP - 4;
SS:SP SRC; (* push doubleword *)
FI;
FI;

影響的標誌

無。

保護模式異常

#GP(0) - 如果記憶體運算元有效地址超出 CS、DS、ES、FS 或 GS 段限制。如果 DS、ES、FS、或 GS 暫存器用於訪問記憶體,並且它包含空的段選擇器。

#SS(0) - 如果記憶體運算元有效地址超出 SS 段限制。

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

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

實地址模式異常

#GP - 如果記憶體運算元有效地址超出 CS、DS、ES、FS 或 GS 段限制。

#SS - 如果記憶體運算元有效地址超出 SS 段限制。如果 SP 或 ESP 暫存器的新值超出了堆疊段的限制。

虛 8086 模式異常

#GP(0) - 如果記憶體運算元有效地址超出 CS、DS、ES、FS 或 GS 段限制。

#SS(0) - 如果記憶體運算元有效地址超出 SS 段限制。

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

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