24531904_j
24531904_j 24531904_j
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
- Seite 648 und 649: LGS—Load Full Pointer 「LDS/LES/
- Seite 650 und 651: LLDT—Load Local Descriptor Table
- Seite 652 und 653: LMSW—Load Machine Status Word オ
- Seite 654 und 655: LOCK—Assert LOCK# Signal Prefix
- Seite 656 und 657: LODS/LODSB/LODSW/LODSD—Load Strin
- Seite 658 und 659: LODS/LODSB/LODSW/LODSD—Load Strin
- Seite 660 und 661: LOOP/LOOPcc—Loop According to ECX
- Seite 662 und 663: LSL—Load Segment Limit ( 続き )
- Seite 664 und 665: LSS—Load Full Pointer 「LDS/LES/
- Seite 666 und 667: LTR—Load Task Register ( 続き )
- Seite 668 und 669: MOV—Move ( 続き ) デスティ
- Seite 670 und 671: MOV—Move ( 続き ) #GP( セレ
- Seite 672 und 673: MOV—Move to/from Control Register
- Seite 674 und 675: MOV—Move to/from Debug Registers
- Seite 676 und 677: MOVS/MOVSB/MOVSW/MOVSD—Move Data
- Seite 678 und 679: MOVSX—Move with Sign-Extension
- Seite 680 und 681: MOVZX—Move with Zero-Extend オ
- Seite 682 und 683: MUL—Unsigned Multiplication of AL
- Seite 684 und 685: NEG—Two's Complement Negation オ
- Seite 686 und 687: NOP—No Operation オペコード
- Seite 688 und 689: NOT—One's Complement Negation (
- Seite 690 und 691: OR—Logical Inclusive OR ( 続き
- Seite 692 und 693: OUT—Output to Port ( 続き ) 操
- Seite 694 und 695: OUTS/OUTSB/OUTSW/OUTSD—Output Str
- Seite 696 und 697: OUTS/OUTSB/OUTSW/OUTSD—Output Str
- Seite 700 und 701: POP—Pop a Value from the Stack (
- Seite 702 und 703: POP—Pop a Value from the Stack (
- Seite 704 und 705: POPA/POPAD—Pop All General-Purpos
- Seite 706 und 707: POPF/POPFD—Pop Stack into EFLAGS
- Seite 708 und 709: PUSH—Push Word or Doubleword onto
- Seite 710 und 711: PUSH—Push Word or Doubleword onto
- Seite 712 und 713: PUSHA/PUSHAD—Push All General-Pur
- Seite 714 und 715: PUSHF/PUSHFD—Push EFLAGS Register
- Seite 716 und 717: RCL/RCR/ROL/ROR-—Rotate ( 続き
- Seite 718 und 719: RCL/RCR/ROL/ROR-—Rotate ( 続き
- Seite 720 und 721: RDMSR—Read from Model Specific Re
- Seite 722 und 723: RDPMC—Read Performance-Monitoring
- Seite 724 und 725: RDTSC—Read Time-Stamp Counter (
- Seite 726 und 727: REP/REPE/REPZ/REPNE /REPNZ—Repeat
- Seite 728 und 729: RET—Return from Procedure オペ
- Seite 730 und 731: RET—Return from Procedure ( 続
- Seite 732 und 733: RET—Return from Procedure ( 続
- Seite 734 und 735: ROL/ROR—Rotate 「RCL/RCR/ROL/ROR
- Seite 736 und 737: SAHF—Store AH into Flags オペ
- Seite 738 und 739: SAL/SAR/SHL/SHR—Shift ( 続き )
- Seite 740 und 741: SAL/SAR/SHL/SHR—Shift ( 続き )
- Seite 742 und 743: SBB—Integer Subtraction with Borr
- Seite 744 und 745: SCAS/SCASB/SCASW/SCASD—Scan Strin
- Seite 746 und 747: SETcc—Set Byte on Condition オ
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 基本命令リファレンス