操作碼 |
指令 |
說明 |
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) 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 暫存器的新值超出了堆疊段的限制。
#GP(0) - 如果記憶體運算元有效地址超出 CS、DS、ES、FS 或 GS 段限制。
#SS(0) - 如果記憶體運算元有效地址超出 SS 段限制。
#PF(錯誤程式碼) - 如果發生頁錯誤。
#AC(0) - 如果在啟用對齊檢查的情況下進行未對齊的記憶體引用。