24531904_j

24531904_j 24531904_j

16.02.2013 Aufrufe

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

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 基本命令リファレンス

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!