• 検索結果がありません。

PUSH—Push Word or Doubleword onto the Stack(続き)

実アドレスモードでは、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をプッシュする。