実アドレスモードでは、PUSH命令が実行されるときに、ESPレジスタまたはSPレジ スタが1である場合、プロセッサはスタックスペースの不足によってシャットダウン する。この状態を示す例外は生成されない。
IA-32アーキテクチャにおける互換性
インテル® 286プロセッサ以降のIA-32プロセッサでは、PUSH ESP命令は、命令が実 行される前にESPレジスタの値が存在していたようにその値をプッシュする。(この ことは、実アドレスモードまたは仮想8086モードでも同じである。)インテル® 8086 プロセッサでは、PUSH SP命令は、(2デクリメントされた後の値である)SPレジス タの新しい値をプッシュする。
操作
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セグメントの範囲外の場合。
PUSH—Push Word or Doubleword onto the Stack(続き)
#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) アライメント・チェックがイネーブルにされていて、アライメントが
合わないメモリ参照が行われた場合。
説明
汎用レジスタの内容をスタックにプッシュする。レジスタがスタックにストアされる 順番は、(現在のオペランド・サイズ属性が32である場合は)EAX、ECX、EDX、 EBX、ESP(元の値)、EBP、ESI、EDIであり、(オペランド・サイズ属性が16である 場合は)AX、CX、DX、BX、SP(元の値)、BP、SI、DIである。これらの命令は、
POPA/POPAD命令の逆の操作を実行する。ESPレジスタまたはSPレジスタとしてプッ シュされる値は、最初のレジスタをプッシュする前のその値である(下記の「操作」
の項を参照)。
PUSHA(すべてをプッシュ)ニーモニックおよびPUSHAD(すべてのダブルをプッ
シュ)ニーモニックは、同じオペコードを参照する。PUSHA命令は、オペランド・サ イズ属性が16であるときに使用するためのものであり、PUSHAD命令は、オペラン ド・サイズ属性が32であるときに使用するためのものである。一部のアセンブラは、
PUSHAが使用されるときはオペランド・サイズを16に、PUSHADが使用されるとき は32に強制する。他のアセンブラは、これらのニーモニックをシノニム
(PUSHA/PUSHAD)として取り扱い、オペランド・サイズ属性の現在の設定を使用し て、使用されるニーモニックに関係なく、スタックにプッシュする値のサイズを決定 することができる。
実アドレスモードでは、PUSHA/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);
オペコード 命令 説明
60 PUSHA AX、CX、DX、BX、元のSP、BP、SI、およびDIをプッ
シュする。
60 PUSHAD EAX、ECX、EDX、EBX、元の ESP、EBP、ESI、およ
びEDIをプッシュする。