24531904_j

24531904_j 24531904_j

16.02.2013 Aufrufe

IMUL—Signed Multiply ( 続き ) 2 および 3 オペラン ド 形式には、 積の下位半分は両オペラン ド の符号のあ りなしに関係 なく同じなので、 符号なしオペランドに対しても使用できる。 ただし、 CF および OF フ ラグを使用して、 結果の上位半分が非ゼロであるかど うかを判定する こ と はできない。 操作 IF (NumberOfOperands = 1) THEN IF (OperandSize = 8) THEN AX ← AL ∗ SRC (* signed multiplication *) IF ((AH = 00H) OR (AH = FFH)) THEN CF = 0; OF = 0; ELSE CF = 1; OF = 1; FI; ELSE IF OperandSize = 16 THEN DX:AX ← AX ∗ SRC (* signed multiplication *) IF ((DX = 0000H) OR (DX = FFFFH)) THEN CF = 0; OF = 0; ELSE CF = 1; OF = 1; FI; ELSE (* OperandSize = 32 *) EDX:EAX ← EAX ∗ SRC (* signed multiplication *) IF ((EDX = 00000000H) OR (EDX = FFFFFFFFH)) THEN CF = 0; OF = 0; ELSE CF = 1; OF = 1; FI; FI; ELSE IF (NumberOfOperands = 2) THEN temp ← DEST ∗ SRC (* signed multiplication; temp is double DEST size*) DEST ← DEST ∗ SRC (* signed multiplication *) IF temp ≠ DEST THEN CF = 1; OF = 1; ELSE CF = 0; OF = 0; FI; FI; FI; ELSE (* NumberOfOperands = 3 *) DEST ← SRC1 ∗ SRC2 (* signed multiplication *) temp ← SRC1 ∗ SRC2 (* signed multiplication; temp is double SRC1 size *) IF temp ≠ DEST THEN CF = 1; OF = 1; ELSE CF = 0; OF = 0; FI; 3:574 第 3 巻 : IA-32 基本命令リファレンス

IMUL—Signed Multiply ( 続き ) 影響を受けるフラグ この命令の1 オペラ ン ド 形式では、 結果の上位半分への有効ビ ッ ト のキ ャ リ ー がある と きに CF および OF フ ラ グがセ ッ ト さ れ、 結果が結果の下位半分に収 ま る と き は ク リ ア さ れる。 命令の 2 および 3 オペラン ド形式では、 デステ ィ ネーシ ョ ン ・ オペラン ド ・ サイ ズに合わせるために結果を切り捨てなければならないと きは CF および OF フラグがセッ トされ、 結果がデスティネーション・オペランド ・サイズに収まるときはクリアされる。 SF、 ZF、 AF、 PF フ ラ グは未定義。 追加の Itanium ベース・システム環境例外 Itanium アーキテクチャ ・ レジスタ ・ フォルト Itanium アーキテクチャ ・ メモリ ・ フォル ト NaT レ ジ ス タ参照アボ ー ト 。 VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、 データ TLB フォルト、 代替データTLB フォルト、 デー タ・ページ不在フォルト、 データNaT ページ参照アボー ト、 データ・キー・ ミス・フォルト、 データ・キー許可 フォルト、 データ・アクセス権フォルト、 データ・アクセ ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ ルト。 保護モード例外 #GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、 または GS セグ メ ン ト の範囲外の場合。 DS、 ES、 FS、 または GS レジスタを使用してメモリがア クセスされ、 レジスタの内容が NULL セグメン ト ・ セレ クタであった場合。 #SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範 囲外の場合。 #PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。 #AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが イネーブルにされていて、 アライメントが合わないメモリ 参照が行われた場合。 実アドレス・モード例外 #GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、 または GS セグ メ ン ト の範囲外の場合。 #SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範 囲外の場合。 第 3 巻 : IA-32 基本命令リファレンス 3:575

IMUL—Signed Multiply ( 続き )<br />

2 および 3 オペラン ド 形式には、 積の下位半分は両オペラン ド の符号のあ りなしに関係<br />

なく同じなので、 符号なしオペランドに対しても使用できる。 ただし、 CF および OF フ<br />

ラグを使用して、 結果の上位半分が非ゼロであるかど うかを判定する こ と はできない。<br />

操作<br />

IF (NumberOfOperands = 1)<br />

THEN IF (OperandSize = 8)<br />

THEN<br />

AX ← AL ∗ SRC (* signed multiplication *)<br />

IF ((AH = 00H) OR (AH = FFH))<br />

THEN CF = 0; OF = 0;<br />

ELSE CF = 1; OF = 1;<br />

FI;<br />

ELSE IF OperandSize = 16<br />

THEN<br />

DX:AX ← AX ∗ SRC (* signed multiplication *)<br />

IF ((DX = 0000H) OR (DX = FFFFH))<br />

THEN CF = 0; OF = 0;<br />

ELSE CF = 1; OF = 1;<br />

FI;<br />

ELSE (* OperandSize = 32 *)<br />

EDX:EAX ← EAX ∗ SRC (* signed multiplication *)<br />

IF ((EDX = 00000000H) OR (EDX = FFFFFFFFH))<br />

THEN CF = 0; OF = 0;<br />

ELSE CF = 1; OF = 1;<br />

FI;<br />

FI;<br />

ELSE IF (NumberOfOperands = 2)<br />

THEN<br />

temp ← DEST ∗ SRC (* signed multiplication; temp is double DEST size*)<br />

DEST ← DEST ∗ SRC (* signed multiplication *)<br />

IF temp ≠ DEST<br />

THEN CF = 1; OF = 1;<br />

ELSE CF = 0; OF = 0;<br />

FI;<br />

FI;<br />

FI;<br />

ELSE (* NumberOfOperands = 3 *)<br />

DEST ← SRC1 ∗ SRC2 (* signed multiplication *)<br />

temp ← SRC1 ∗ SRC2 (* signed multiplication; temp is double SRC1 size *)<br />

IF temp ≠ DEST<br />

THEN CF = 1; OF = 1;<br />

ELSE CF = 0; OF = 0;<br />

FI;<br />

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

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!