24531904_j

24531904_j 24531904_j

16.02.2013 Aufrufe

LODS/LODSB/LODSW/LODSD—Load String ( 続き ) 仮想 8086 モード例外 #GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、 または GS セグ メ ン ト の範囲外の場合。 #SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範 囲外の場合。 #PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。 #AC(0) アライメン ト ・ チェ ッ クがイネーブルにされていて、 アラ イ メン ト が合わないメモ リ 参照が行われた場合。 3:646 第 3 巻 : IA-32 基本命令リファレンス

LOOP/LOOPcc—Loop According to ECX Counter オペコード 命令 説明 E2 cb LOOP rel8 カウントをデクリメントし、カウント ≠ 0 の場合 short ジャンプす る。 E1 cb LOOPE rel8 カウントをデクリメントし、カウント ≠ 0 でかつ ZF=1 の場合 short ジャンプする。 E1 cb LOOPZ rel8 カウントをデクリメントし、カウント ≠ 0 でかつ ZF=1 の場合 short ジャンプする。 E0 cb LOOPNE rel8 カウントをデクリメントし、カウント ≠ 0 でかつ ZF=0 の場合 short ジャンプする。 E0 cb LOOPNZ rel8 カウントをデクリメントし、カウント ≠ 0 でかつ ZF=0 の場合 short ジャンプする。 説明 ECX または CX レジスタをカウンタ と して使用して、 ループ操作を実行する。 LOOP 命令 が実行されるたびに、 カ ウ ン ト ・ レ ジス タが 1 デク リ メント され、 次に 0 かどうかチェ ッ クされる。 カウントが0 である場合は、 ループは終了し、 LOOP 命令の次の命令から プロ グラムの実行が継続される。 カウン トが 0 でない場合は、 デステ ィ ネーシ ョ ン ( ターゲッ ト ) オペラン ド への near ジャンプが行われる。 ターゲットはおそら くループの先頭であ る。 ア ド レス ・ サイズ属性が 32 ビッ トである場合は、 カウント ・レジスタとしてECX レ ジスタが使用される。 そうでない場合は、 CX レジスタが使用される。 ターゲッ ト命令は相対オフセット (EIP レジスタ内の命令ポインタの現在値に相対的な符 号付き オ フ セ ッ ト ) で指定される。 相対オフセ ッ ト は、 アセンブ リ ・ コ ー ド では一般的 にラベルとして指定されるが、 マシン ・ コー ド ・ レベルでは、 符号付きの 8 ビッ ト即値 と して コ ー ド 化され、 命令ポ イ ン タ に加算される。 こ の命令には、 -128 ~ +127 までの オフセッ トが使用できる。 ループ命令(LOOPcc) の一部の形式では、 カ ウ ン ト が 0 に達する前にループを終了させ る ための条件 と して ZF フ ラ グ も 指定で き る。 それ ら の形式の命令に は、 各命令に条件 コード (cc) が対応してお り、 それぞれにテス ト される条件を示している。 その場合、 LOOPcc 命令その も のは ZF フラグの状態を変えない。 ZF フ ラ グを変更す る のは、 ルー プ内の他の命令である。 すべての分岐は、 ジ ャンプ ・ ア ド レスやキャ ッ シュの可否に関係な く 、 1 つまたは 2 つ のキャ ッシュ ・ ラインのコ ー ド ・ フ ェ ッチに変換される。 操作 IF AddressSize = 32 THEN Count is ECX; ELSE (* AddressSize = 16 *) Count is CX; FI; Count ← Count - 1; IF instruction in not LOOP THEN IF (instruction = LOOPE) OR (instruction = LOOPZ) THEN IF (ZF =1) AND (Count ≠ 0) THEN BranchCond ← 1; ELSE BranchCond ← 0; 第 3 巻 : IA-32 基本命令リファレンス 3:647

LOOP/LOOPcc—Loop According to ECX Counter<br />

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

E2 cb LOOP rel8 カウントをデクリメントし、カウント ≠ 0 の場合 short ジャンプす<br />

る。<br />

E1 cb LOOPE rel8 カウントをデクリメントし、カウント ≠ 0 でかつ ZF=1 の場合 short<br />

ジャンプする。<br />

E1 cb LOOPZ rel8 カウントをデクリメントし、カウント ≠ 0 でかつ ZF=1 の場合 short<br />

ジャンプする。<br />

E0 cb LOOPNE rel8 カウントをデクリメントし、カウント ≠ 0 でかつ ZF=0 の場合 short<br />

ジャンプする。<br />

E0 cb LOOPNZ rel8 カウントをデクリメントし、カウント ≠ 0 でかつ ZF=0 の場合 short<br />

ジャンプする。<br />

説明<br />

ECX または CX レジスタをカウンタ と して使用して、 ループ操作を実行する。 LOOP 命令<br />

が実行されるたびに、 カ ウ ン ト ・ レ ジス タが 1 デク リ メント され、 次に 0 かどうかチェ ッ<br />

クされる。 カウントが0 である場合は、 ループは終了し、 LOOP 命令の次の命令から プロ<br />

グラムの実行が継続される。 カウン トが 0 でない場合は、 デステ ィ ネーシ ョ ン ( ターゲッ<br />

ト ) オペラン ド への near ジャンプが行われる。 ターゲットはおそら くループの先頭であ<br />

る。 ア ド レス ・ サイズ属性が 32 ビッ トである場合は、 カウント ・レジスタとしてECX レ<br />

ジスタが使用される。 そうでない場合は、 CX レジスタが使用される。<br />

ターゲッ ト命令は相対オフセット (EIP レジスタ内の命令ポインタの現在値に相対的な符<br />

号付き オ フ セ ッ ト ) で指定される。 相対オフセ ッ ト は、 アセンブ リ ・ コ ー ド では一般的<br />

にラベルとして指定されるが、 マシン ・ コー ド ・ レベルでは、 符号付きの 8 ビッ ト即値<br />

と して コ ー ド 化され、 命令ポ イ ン タ に加算される。 こ の命令には、 -128 ~ +127 までの<br />

オフセッ トが使用できる。<br />

ループ命令(LOOPcc) の一部の形式では、 カ ウ ン ト が 0 に達する前にループを終了させ<br />

る ための条件 と して ZF フ ラ グ も 指定で き る。 それ ら の形式の命令に は、 各命令に条件<br />

コード (cc) が対応してお り、 それぞれにテス ト される条件を示している。 その場合、<br />

LOOPcc 命令その も のは ZF フラグの状態を変えない。 ZF フ ラ グを変更す る のは、 ルー<br />

プ内の他の命令である。<br />

すべての分岐は、 ジ ャンプ ・ ア ド レスやキャ ッ シュの可否に関係な く 、 1 つまたは 2 つ<br />

のキャ ッシュ ・ ラインのコ ー ド ・ フ ェ ッチに変換される。<br />

操作<br />

IF AddressSize = 32<br />

THEN<br />

Count is ECX;<br />

ELSE (* AddressSize = 16 *)<br />

Count is CX;<br />

FI;<br />

Count ← Count - 1;<br />

IF instruction in not LOOP<br />

THEN<br />

IF (instruction = LOOPE) OR (instruction = LOOPZ)<br />

THEN<br />

IF (ZF =1) AND (Count ≠ 0)<br />

THEN BranchCond ← 1;<br />

ELSE BranchCond ← 0;<br />

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

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!