24531904_j
24531904_j 24531904_j
ENTER—Make Stack Frame for Procedure Parameters オペコード 命令 説明 C8 iw 00 ENTER imm16,0 プロシージャのスタック・フレームを作成する。 C8 iw 01 ENTER imm16,1 プロシージャのネストされたスタック・フレームを作成する。 C8 iw ib ENTER imm16,imm8 プロシージャのネストされたスタック・フレームを作成する。 説明 プロシージャのためのスタック ・ フレームを作成する。 第1 オペラン ド ( サイズ ・ オペ ランド ) は、 スタ ッ ク ・ フ レームのサイズ ( すなわち、 プロシージ ャのスタ ッ クに割り 当てられる動的記憶域のバイ ト 数 ) を指定する。 第 2 オペラン ド ( ネスティング ・ レベ ル・オペランド ) は、 プロシージ ャのレキシカル ・ ネステ ィ ング ・ レベル (0 から 31 ま で ) を指定する。 ネスティ ング ・ レベルによ って、 以前のスタック ・ フレームから新し いスタック・フレームの 「表示エリア」 にコピーされるスタック・フレーム・ポインタ の数が決ま る。 これら のオペラ ン ド は と も に即値である。 スタック ・サイズ属性によって、 BP (16 ビット )、 EBP (32 ビッ ト ) のどちらのレジスタ で現在のフ レ ーム ・ ポ イ ンタ を指定するか、 SP (16 ビッ ト )、 ESP (32 ビッ ト ) のどちら のレジスタでスタッ ク ・ ポインタを指定するかが決まる。 対をなす ENTER 命令 と LEAVE 命令は、 ブ ロ ッ ク 構造言語をサポ ー ト す る ために設け ら れた も のである。 これらの命令は、 他のプロ シ ー ジ ャ へのジ ャ ンプやコ ールを実行でき ない。 これらの命令は、 すでにコールされたプロシージャの新しいスタック ・ フレーム をセッ ト アップするだけである。 ENTER 命令の後に、 通常は CALL、 JMP、 または Jcc 命令が続き、 プ ロ グ ラ ムの制御を コ ー ル先のプ ロ シ ー ジ ャ に渡す。 ネスティ ング ・ レベルが 0 の場合は、 プロセ ッ サはフ レ ー ム ・ ポ イ ン タ を EBP レジスタ からスタックにプッシュし、 現在のスタック ・ ポインタを ESP レジスタから EBP レジス タにコピーし、 ESP レジスタに現在のスタック ・ ポインタ値からサイズ ・ オペランドの 値を引いた値をロー ド する。 ネステ ィ ング ・ レベルが 1 以上の場合は、 プ ロセ ッ サはス タック ・ ポインタを調整する前に追加フレーム ・ ポインタをスタックにプッシュする。 それ ら の追加フ レ ー ム ・ ポ イ ン タ に よ っ て、 コ ー ル先プ ロ シ ー ジ ャ にス タ ッ ク 上の他の ネス ト されたフレームへのアクセス ・ ポイン トが与えられる。 操作 NestingLevel ← NestingLevel MOD 32 IF StackSize = 32 THEN Push(EBP) ; FrameTemp ← ESP; ELSE (* StackSize = 16*) Push(BP); FrameTemp ← SP; FI; IF NestingLevel = 0 THEN GOTO CONTINUE; FI; IF (NestingLevel > 0) FOR i ← 1 TO (NestingLevel − 1) DO IF OperandSize = 32 THEN IF StackSize = 32 EBP ← EBP − 4; Push([EBP]); (* doubleword push *) 3:454 第 3 巻 : IA-32 基本命令リファレンス
ENTER—Make Stack Frame for Procedure Parameters ( 続き ) ELSE (* StackSize = 16*) BP ← BP − 4; Push([BP]); (* doubleword push *) FI; ELSE (* OperandSize = 16 *) IF StackSize = 32 THEN EBP ← EBP − 2; Push([EBP]); (* word push *) ELSE (* StackSize = 16*) BP ← BP − 2; Push([BP]); (* word push *) FI; FI; OD; IF OperandSize = 32 THEN Push(FrameTemp); (* doubleword push *) ELSE (* OperandSize = 16 *) Push(FrameTemp); (* word push *) FI; GOTO CONTINUE; FI; CONTINUE: IF StackSize = 32 THEN EBP ← FrameTemp ESP ← EBP − Size; ELSE (* StackSize = 16*) BP ← FrameTemp SP ← BP − Size; FI; END; 影響を受けるフラグ なし。 第 3 巻 : IA-32 基本命令リファレンス 3:455
- Seite 416 und 417: BTR ─ Bit Test and Reset オペ
- Seite 418 und 419: BTS ─ Bit Test and Set オペコ
- Seite 420 und 421: CALL ─ Call Procedure オペコ
- Seite 422 und 423: CALL ─ Call Procedure ( 続き )
- Seite 424 und 425: CALL ─ Call Procedure ( 続き )
- Seite 426 und 427: CALL ─ Call Procedure ( 続き )
- Seite 428 und 429: CALL ─ Call Procedure ( 続き )
- Seite 430 und 431: CBW/CWDE ─ Convert Byte to Word/C
- Seite 432 und 433: CLC ─ Clear Carry Flag オペコ
- Seite 434 und 435: CLI ─ Clear Interrupt Flag オペ
- Seite 436 und 437: CLTS—Clear Task-Switched Flag in
- Seite 438 und 439: CMOVcc—Conditional Move オペコ
- Seite 440 und 441: CMOVcc—Conditional Move ( 続き
- Seite 442 und 443: CMP—Compare Two Operands オペ
- Seite 444 und 445: CMPS/CMPSB/CMPSW/CMPSD—Compare St
- Seite 446 und 447: CMPS/CMPSB/CMPSW/CMPSD—Compare St
- Seite 448 und 449: CMPXCHG—Compare and Exchange (
- Seite 450 und 451: CMPXCHG8B—Compare and Exchange 8
- Seite 452 und 453: CPUID—CPU Identification オペ
- Seite 454 und 455: CPUID—CPU Identification ( 続き
- Seite 456 und 457: CPUID—CPU Identification ( 続き
- Seite 458 und 459: CWDE—Convert Word to Doubleword
- Seite 460 und 461: DAS—Decimal Adjust AL after Subtr
- Seite 462 und 463: DEC—Decrement by 1 ( 続き ) #AC
- Seite 464 und 465: DIV—Unsigned Divide ( 続き ) FI
- Seite 468 und 469: ENTER—Make Stack Frame for Proced
- Seite 470 und 471: F2XM1—Compute 2 x -1 ( 続き )
- Seite 472 und 473: FADD/FADDP/FIADD—Add オペコー
- Seite 474 und 475: FADD/FADDP/FIADD—Add ( 続き )
- Seite 476 und 477: FBLD—Load Binary Coded Decimal
- Seite 478 und 479: FBSTP—Store BCD Integer and Pop
- Seite 480 und 481: FBSTP—Store BCD Integer and Pop (
- Seite 482 und 483: FCLEX/FNCLEX—Clear Exceptions オ
- Seite 484 und 485: FCMOVcc—Floating-Point Conditiona
- Seite 486 und 487: FCOM/FCOMP/FCOMPP—Compare Real (
- Seite 488 und 489: FCOMI/FCOMIP/FUCOMI/FUCOMIP—Compa
- Seite 490 und 491: FCOMI/FCOMIP/ FUCOMI/FUCOMIP—Comp
- Seite 492 und 493: FCOS—Cosine ( 続き ) 追加の
- Seite 494 und 495: FDIV/FDIVP/FIDIV—Divide オペコ
- Seite 496 und 497: FDIV/FDIVP/FIDIV—Divide ( 続き
- Seite 498 und 499: FDIVR/FDIVRP/FIDIVR—Reverse Divid
- Seite 500 und 501: FDIVR/FDIVRP/FIDIVR—Reverse Divid
- Seite 502 und 503: FFREE—Free Floating-Point Registe
- Seite 504 und 505: FICOM/FICOMP—Compare Integer (
- Seite 506 und 507: FILD—Load Integer オペコード
- Seite 508 und 509: FINCSTP—Increment Stack-Top Point
- Seite 510 und 511: FIST/FISTP—Store Integer オペ
- Seite 512 und 513: FIST/FISTP—Store Integer ( 続き
- Seite 514 und 515: FLD—Load Real ( 続き ) 浮動
ENTER—Make Stack Frame for Procedure Parameters<br />
オペコード 命令 説明<br />
C8 iw 00 ENTER imm16,0 プロシージャのスタック・フレームを作成する。<br />
C8 iw 01 ENTER imm16,1 プロシージャのネストされたスタック・フレームを作成する。<br />
C8 iw ib ENTER imm16,imm8 プロシージャのネストされたスタック・フレームを作成する。<br />
説明<br />
プロシージャのためのスタック ・ フレームを作成する。 第1 オペラン ド ( サイズ ・ オペ<br />
ランド ) は、 スタ ッ ク ・ フ レームのサイズ ( すなわち、 プロシージ ャのスタ ッ クに割り<br />
当てられる動的記憶域のバイ ト 数 ) を指定する。 第 2 オペラン ド ( ネスティング ・ レベ<br />
ル・オペランド ) は、 プロシージ ャのレキシカル ・ ネステ ィ ング ・ レベル (0 から 31 ま<br />
で ) を指定する。 ネスティ ング ・ レベルによ って、 以前のスタック ・ フレームから新し<br />
いスタック・フレームの 「表示エリア」 にコピーされるスタック・フレーム・ポインタ<br />
の数が決ま る。 これら のオペラ ン ド は と も に即値である。<br />
スタック ・サイズ属性によって、 BP (16 ビット )、 EBP (32 ビッ ト ) のどちらのレジスタ<br />
で現在のフ レ ーム ・ ポ イ ンタ を指定するか、 SP (16 ビッ ト )、 ESP (32 ビッ ト ) のどちら<br />
のレジスタでスタッ ク ・ ポインタを指定するかが決まる。<br />
対をなす ENTER 命令 と LEAVE 命令は、 ブ ロ ッ ク 構造言語をサポ ー ト す る ために設け ら<br />
れた も のである。 これらの命令は、 他のプロ シ ー ジ ャ へのジ ャ ンプやコ ールを実行でき<br />
ない。 これらの命令は、 すでにコールされたプロシージャの新しいスタック ・ フレーム<br />
をセッ ト アップするだけである。 ENTER 命令の後に、 通常は CALL、 JMP、 または Jcc<br />
命令が続き、 プ ロ グ ラ ムの制御を コ ー ル先のプ ロ シ ー ジ ャ に渡す。<br />
ネスティ ング ・ レベルが 0 の場合は、 プロセ ッ サはフ レ ー ム ・ ポ イ ン タ を EBP レジスタ<br />
からスタックにプッシュし、 現在のスタック ・ ポインタを ESP レジスタから EBP レジス<br />
タにコピーし、 ESP レジスタに現在のスタック ・ ポインタ値からサイズ ・ オペランドの<br />
値を引いた値をロー ド する。 ネステ ィ ング ・ レベルが 1 以上の場合は、 プ ロセ ッ サはス<br />
タック ・ ポインタを調整する前に追加フレーム ・ ポインタをスタックにプッシュする。<br />
それ ら の追加フ レ ー ム ・ ポ イ ン タ に よ っ て、 コ ー ル先プ ロ シ ー ジ ャ にス タ ッ ク 上の他の<br />
ネス ト されたフレームへのアクセス ・ ポイン トが与えられる。<br />
操作<br />
NestingLevel ← NestingLevel MOD 32<br />
IF StackSize = 32<br />
THEN<br />
Push(EBP) ;<br />
FrameTemp ← ESP;<br />
ELSE (* StackSize = 16*)<br />
Push(BP);<br />
FrameTemp ← SP;<br />
FI;<br />
IF NestingLevel = 0<br />
THEN GOTO CONTINUE;<br />
FI;<br />
IF (NestingLevel > 0)<br />
FOR i ← 1 TO (NestingLevel − 1)<br />
DO<br />
IF OperandSize = 32<br />
THEN<br />
IF StackSize = 32<br />
EBP ← EBP − 4;<br />
Push([EBP]); (* doubleword push *)<br />
3:454 第 3 巻 : IA-32 基本命令リファレンス