24531904_j

24531904_j 24531904_j

16.02.2013 Aufrufe

POP—Pop a Value from the Stack オペコード 命令 説明 8F /0 POP m16 スタックのトップを m16 にポップし、スタック・ポインタをインク リメントする。 8F /0 POP m32 スタックのトップを m32 にポップし、スタック・ポインタをインク リメントする。 58+ rw POP r16 スタックのトップを r16 にポップし、スタック・ポインタをインク リメントする。 58+ rd POP r32 スタックのトップを r32 にポップし、スタック・ポインタをインク リメントする。 1F POP DS スタックのトップを DS にポップし、スタック・ポインタをインク リメントする。 07 POP ES スタックのトップを ES にポップし、スタック・ポインタをインク リメントする。 17 POP SS スタックのトップを SS にポップし、スタック・ポインタをインク リメントする。 0F A1 POP FS スタックのトップを FS にポップし、スタック・ポインタをインク リメントする。 0F A9 POP GS スタックのトップを GS にポップし、スタック・ポインタをインク リメントする。 説明 値をスタックのト ップからデスティネーション ・ オペランドで指定されたロケーション にロー ドし、 スタック ・ ポインタをインク リメン トする。 デスティネーション ・ オペラ ンドには、 汎用レジスタ、 メモリ ・ロケーション、 またはセグメント ・レジスタを使用 できる。 スタック・セグメントの現在のアドレス・サイズ属性と、 オペランド ・サイズ属性に よって、 スタック ・ ポインタをインク リ メン トする量( 「操作」 の項を参照 ) が決ま る。 例えば、 32 ビッ トのアドレス指定とオペランドが使用されている場合は、 ESP レジスタ ( スタック ・ ポインタ ) が 4 ずつイン ク リ メン ト される。 16 ビッ トのアドレス指定とオ ペラン ドが使用されている場合は、 SP レジスタ (16 ビッ ト ・アドレス指定のスタック ・ ポインタ ) が 2 ずつインク リ メン ト される。 スタ ッ ク ・ セグメン ト のセグメン ト ・ デ ィ スクリプタのB フラグによって、 スタックのアドレス ・サイズ属性が決まる。 デスティネーション ・ オペランドがセグメント ・ レジスタ DS、 ES、 FS、 GS、 または SS の 1 つである場合は、 レ ジ ス タ に ロ ー ド さ れる値は、 有効なセグ メ ン ト ・ セレ ク タ でな ければならない。 保護モー ドでは、 セグメン ト ・ セレクタをセグメン ト ・ レジスタに ポップすると、 そのセグメン ト ・ セレクタに関連するディスクリプタ情報がセグメン ト・レジスタの見えない( シャ ドー ) 部分に自動的に ロ ー ド さ れ、 セレ ク タ お よ びデ ィ ス ク リ プ タ の情報が有効に さ れる ( 下記の 「操作」 を参照 )。 一般保護フ ォ ル ト を発生 さ せずに NULL 値 (0000 ~ 0003) を DS、 ES、 FS、 または GS レ ジスタにポップできる。 ただし、 対応するセグメント ・ レジスタに NULL 値がロ ー ド さ れてい る セグ メ ン ト を その後で参照し よ う と す る と 、 一般保護例外 (#GP) が発生する。 こ の状況では、 メモ リ 参照は行われず、 セグメン ト ・ レ ジスタのセーブ された値は NULL である。 POP 命令では、 値を CS レジスタにポップできない。 CS レジスタにロードするには、 RET 命令を使用す る。 3:686 第 3 巻 : IA-32 基本命令リファレンス

POP—Pop a Value from the Stack ( 続き ) IA-32 システム環境では、 POP SS 命令を実行する と、 次の命令の実行が完了する ま で、 NMI 割 り 込みを含むすべての外部割 り 込みお よ び ト ラ ッ プが禁止 さ れる。 Itanium ベー ス・システム環境では、POP SS 命令を実行すると、命令の完了後に IA-32_Intercept (SystemFlag) トラップが発生する。 こ の操作に よ っ て、 割 り 込みが発生す る前に、 次の 命令 (MOV ESP, スタック ・ ポインタ値) で ESP レジスタにスタック ・ ポインタをロード するこ とができる。 ただし、 SS レジスタと ESP レジスタをロードするには、 LSS 命令を 使用す る方が効率的である。 こ の動作に よ っ て、 割 り 込みの間に無効なス タ ッ ク が発生しない よ う に、 POS SS 命令 と MOV ESP, EBP 命令をシ ー ケンシ ャ ルに実行で き る。 ただし、 SS レジスタと ESP レジス タをロードするときは、 LSS 命令を使用す る方が望 ま しい。 メモリ内のデスティネーション・オペランドのアドレスを指定するベース・レジスタと して ESP レジスタを使用すると、 POP 命令は、 ESP レジスタをインク リメントした後に オペランドの実効アドレスを計算する。 POP ESP 命令は、 スタックの古いト ップにあるデータをデスティネーションに書き込む 前に、 スタ ッ ク ・ ポインタ (ESP) をインク リメントする。 操作 IF StackAddrSize = 32 THEN IF OperandSize = 32 THEN DEST ← SS:ESP; (* copy a doubleword *) ESP ← ESP + 4; ELSE (* OperandSize = 16*) DEST ← SS:ESP; (* copy a word *) ESP ← ESP + 2; FI; ELSE (* StackAddrSize = 16* ) IF OperandSize = 16 THEN DEST ← SS:SP; (* copy a word *) SP ← SP + 2; ELSE (* OperandSize = 32 *) DEST ← SS:SP; (* copy a doubleword *) SP ← SP + 4; FI; FI; 保護モ ー ド の間にセグ メ ン ト ・ レ ジ ス タ を ロ ー ド する と 、 以下の リ ス ト で説明してい る よ う に特殊なチ ェ ッ ク と 処置が行われる。 これら のチェ ッ ク は、 セグメ ン ト ・ セレ ク タ と それが指しているセグメ ン ト ・ デ ィ ス ク リ プタに対して行われる。 IF SS is loaded; THEN IF segment selector is null THEN #GP(0); FI; IF segment selector index is outside descriptor table limits OR segment selector's RPL ≠ CPL OR segment is not a writable data segment OR DPL ≠ CPL THEN #GP(selector); 第 3 巻 : IA-32 基本命令リファレンス 3:687

POP—Pop a Value from the Stack<br />

オペコード 命令 説明<br />

8F /0 POP m16 スタックのトップを m16 にポップし、スタック・ポインタをインク<br />

リメントする。<br />

8F /0 POP m32 スタックのトップを m32 にポップし、スタック・ポインタをインク<br />

リメントする。<br />

58+ rw POP r16 スタックのトップを r16 にポップし、スタック・ポインタをインク<br />

リメントする。<br />

58+ rd POP r32 スタックのトップを r32 にポップし、スタック・ポインタをインク<br />

リメントする。<br />

1F POP DS スタックのトップを DS にポップし、スタック・ポインタをインク<br />

リメントする。<br />

07 POP ES スタックのトップを ES にポップし、スタック・ポインタをインク<br />

リメントする。<br />

17 POP SS スタックのトップを SS にポップし、スタック・ポインタをインク<br />

リメントする。<br />

0F A1 POP FS スタックのトップを FS にポップし、スタック・ポインタをインク<br />

リメントする。<br />

0F A9 POP GS スタックのトップを GS にポップし、スタック・ポインタをインク<br />

リメントする。<br />

説明<br />

値をスタックのト ップからデスティネーション ・ オペランドで指定されたロケーション<br />

にロー ドし、 スタック ・ ポインタをインク リメン トする。 デスティネーション ・ オペラ<br />

ンドには、 汎用レジスタ、 メモリ ・ロケーション、 またはセグメント ・レジスタを使用<br />

できる。<br />

スタック・セグメントの現在のアドレス・サイズ属性と、 オペランド ・サイズ属性に<br />

よって、 スタック ・ ポインタをインク リ メン トする量( 「操作」 の項を参照 ) が決ま る。<br />

例えば、 32 ビッ トのアドレス指定とオペランドが使用されている場合は、 ESP レジスタ<br />

( スタック ・ ポインタ ) が 4 ずつイン ク リ メン ト される。 16 ビッ トのアドレス指定とオ<br />

ペラン ドが使用されている場合は、 SP レジスタ (16 ビッ ト ・アドレス指定のスタック ・<br />

ポインタ ) が 2 ずつインク リ メン ト される。 スタ ッ ク ・ セグメン ト のセグメン ト ・ デ ィ<br />

スクリプタのB フラグによって、 スタックのアドレス ・サイズ属性が決まる。<br />

デスティネーション ・ オペランドがセグメント ・ レジスタ DS、 ES、 FS、 GS、 または SS<br />

の 1 つである場合は、 レ ジ ス タ に ロ ー ド さ れる値は、 有効なセグ メ ン ト ・ セレ ク タ でな<br />

ければならない。 保護モー ドでは、 セグメン ト ・ セレクタをセグメン ト ・ レジスタに<br />

ポップすると、 そのセグメン ト ・ セレクタに関連するディスクリプタ情報がセグメン ト・レジスタの見えない( シャ ドー ) 部分に自動的に ロ ー ド さ れ、 セレ ク タ お よ びデ ィ<br />

ス ク リ プ タ の情報が有効に さ れる ( 下記の 「操作」 を参照 )。<br />

一般保護フ ォ ル ト を発生 さ せずに NULL 値 (0000 ~ 0003) を DS、 ES、 FS、 または GS レ<br />

ジスタにポップできる。 ただし、 対応するセグメント ・ レジスタに NULL 値がロ ー ド さ<br />

れてい る セグ メ ン ト を その後で参照し よ う と す る と 、 一般保護例外 (#GP) が発生する。<br />

こ の状況では、 メモ リ 参照は行われず、 セグメン ト ・ レ ジスタのセーブ された値は<br />

NULL である。<br />

POP 命令では、 値を CS レジスタにポップできない。 CS レジスタにロードするには、<br />

RET 命令を使用す る。<br />

3:686 第 3 巻 : IA-32 基本命令リファレンス

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!