• 検索結果がありません。

IA-32 インテル ®

7.2.4. 論理演算命令

論理演算命令AND、OR、XOR (exclusive or)、およびNOTは、それぞれの名前に対応する標準的な ブール演算を実行する。AND、OR、およびXOR命令は、2つのオペランドを必要とする。NOT命令 は、1つのオペランドを操作する。

7.2.5. シフト命令とローテート命令

シフト命令とローテート命令は、オペランド内のビットを移動する。これらの命令は、以下のクラ スに分類される。

シフト命令

ダブル・シフト命令

ローテート命令

7.2.5.1. シフト命令

SAL (shift arithmetic left)、SHL (shift logical left)、SAR (shift arithmetic right)、およびSHR (shift logical

right)命令は、バイト、ワード、またはダブルワード内のビットの算術シフトまたは論理シフトを実

行する。

SAL命令とSHL命令は、同じ操作を実行する(図7-7.を参照)。これらの命令は、ソース・オペラン ドを1〜31ビット位置だけ左にシフトする。空いたビット位置はクリアされる。オペランドの外に シフトされた最後のビットは、CFフラグにロードされる。

.

SHR命令は、ソース・オペランドを1〜31ビット位置だけ右にシフトする(図7-8.を参照)。SHL/SAL 命令と同じように、空いたビット位置はクリアされ、オペランドの外にシフトされた最後のビット はCFフラグにロードされる。

図7-7. SHL/SAL命令の動作

1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 1 1 1 X

初期状態 CF

0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 1 1 1 0 0 1

1ビットのSHL/SAL命令の実行後

0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0

10ビットのSHL/SAL命令の実行後

オペランド

SAR命令は、ソース・オペランドを1〜31ビット位置だけ右にシフトする(図7-9.を参照)。SHR命 令との相違点は、SAR命令は、オペランドが正の場合は空いたビット位置をクリアし、オペランド が負の場合は空いたビットをセットすることによって、ソース・オペランドの符号を維持すること である。この場合も、オペランドの外にシフトされた最後のビットがCFフラグにロードされる。

また、SAR命令とSHR命令を使用して、2を累乗した値で除算を実行することができる(『IA-32 イン

テル®アーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル、中巻』の第3章の

「SAL/SAR/SHL/SHR - Shift」を参照のこと)。

図7-8. SHR命令の動作

図7-9. SAR命令の動作

1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 1 1 1 X

初期状態 CF

0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 1 1 1 1ビットのSHR命令の実行後

0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 10ビットのSHR命令の実行後

オペランド

0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 1 1 X 初期状態(正のオペランド)

CF

0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 1 1 1ビットのSAR命令の実行後

1 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 1 1 X 初期状態(負のオペランド)

オペランド

1 1 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 1 1 1ビットのSAR命令の実行後

CF

7.2.5.2. ダブル・シフト命令

SHLD (shift left double)命令とSHRD (shift right double)命令は、1つのオペランドからもう1つのオペ ランドへ指定したビット数をシフトする(図7-10.を参照)。これらの命令は、アライメントの合っ ていないビット・ストリングの操作を容易にするために用意されている。これらの命令を使用して、

各種のビット・ストリング転送操作を実行することもできる。

SHLD命令は、デスティネーション・オペランド内の各ビットを左にシフトし、(デスティネーショ ン・オペランド内の)空いたビット位置を、ソース・オペランドからシフトされたビットで埋める。

デスティネーション・オペランドとソース・オペランドは、同じ長さ(ワードまたはダブルワード)

でなければならない。シフトするビット数の範囲は、0〜31である。このシフト操作の結果はデス ティネーション・オペランドに格納され、ソース・オペランドは変更されない。デスティネーショ ン・オペランドの外にシフトされた最後のビットは、CFフラグにロードされる。

SHRD命令の動作はSHLD命令と同じであるが、デスティネーション・オペランド内のビットが右に シフトされる点が異なる。空いたビット位置は、ソース・オペランドからシフトされたビットで埋 められる。

7.2.5.3. ローテート命令

ROL (rotate left)、ROR (rotate right)、RCL (rotate through carry left)、およびRCR (rotate through carry right) 命令は、デスティネーション・オペランド内の各ビットを、一方の端からもう一方の端に循環させ

る(図7-11.を参照)。シフト命令とは異なり、ローテート命令ではビットは失われない。循環させ

るビット数の範囲は、0〜31である。

図7-10. SHLD命令とSHRD命令の動作

デスティネーション(メモリまたはレジスタ)

CF

31 0

ソース(レジスタ)

31 0

デスティネーション(メモリまたはレジスタ) CF

31 0

ソース(レジスタ)

31 0

SHRD命令 SHLD命令

ROL命令は、オペランド内の各ビットを左に(最上位ビットの方向に)循環させる。ROR命令は、

オペランドを右に(最下位ビットの方向に)循環させる。

RCL命令は、オペランド内の各ビットを、CFフラグを通して左に循環させる。この命令は、オペラ ンドの上位側を1ビット拡張したものとして、CFフラグを扱う。オペランドの最上位ビットの位置 から押し出された各ビットは、CFフラグ内に入る。同時に、CFフラグ内にあったビットは、オペラ ンドの最下位ビットの位置に入る。

RCR命令は、オペランド内の各ビットを、CFフラグを通して右に循環させる。

すべてのローテート命令で、CFフラグは、常に(その命令がCFフラグをオペランドの拡張として 使用しない場合でも)、オペランドから押し出された最後のビットの値を格納する。このフラグの値 は、条件付きジャンプ命令(JCまたはJNC)によってテストすることができる。

7.2.6. ビット命令とバイト命令

ビット命令とバイト命令は、ビット・ストリングまたはバイト・ストリングを操作する。これらの 命令は、以下の4つのグループに分けられる。

ビット・テストおよび変更命令

図7-11. ROL、ROR、RCL、およびRCR命令の動作

デスティネーション(メモリまたはレジスタ)

CF

31 0

デスティネーション(メモリまたはレジスタ) CF 0

31

デスティネーション(メモリまたはレジスタ)

CF

31 0

デスティネーション(メモリまたはレジスタ) CF

31 0

ROL命令

RCL命令

RCR命令 ROR命令

ビット・スキャン命令

条件付きバイト・セット命令

テスト命令

7.2.6.1. ビット・テストおよび変更命令

ビット・テストおよび変更命令(表7-3.を参照)は、オペランド内の1つのビットを操作する。この ビットの位置は、オペランドの最下位ビットからのオフセットで指定される。プロセッサは、テス トされ変更されるビットを特定すると、最初にそのビットの現在値をCFフラグにロードする。次に、

この命令の変更操作の指定に従って、選択されたビットに新しい値を割り当てる。

7.2.6.2. ビット・スキャン命令

BSF (bit scan forward)命令とBSR (bit scan reverse)命令は、ソース・オペランド内のビット・ストリン グをスキャンしてセットされたビットを探し、最初に見つかったセットされたビットのビット・イ ンデックスをデスティネーション・レジスタに格納する。このビット・インデックスは、ビット・

ストリング内の最下位ビット(ビット0)から最初のセットされたビットまでのオフセットである。

BSF命令は、ソース・オペランドを下位から上位の方向に(ソース・オペランドのビット0から最上 位ビットに向かって)スキャンする。BSR命令は、上位から下位の方向に(最上位ビットから最下 位ビットに向かって)スキャンする。

7.2.6.3. 条件付きバイト・セット命令

SETcc (set byte on condition)命令は、EFLAGSレジスタ内の選択されたステータス・フラグ(CF、OF、

SF、ZF、およびPF)の状態に基づいて、デスティネーション・オペランド・バイトを0または1に

セットする。SETニーモニックに付加されるサフィックス(cc)は、テストされる条件を指定する。

例えば、SETO命令は、オーバーフローがないかどうかをテストする。OFフラグがセットされてい る場合は、デスティネーション・バイトは1にセットされる。OFがクリアされている場合は、デス ティネーション・バイトは0にクリアされる。付録B「EFLAGS条件コード」に、この命令でテスト できる条件の一覧を示す。

表7-3. ビット・テストおよび変更命令

命令 CFフラグに対する影響 選択されたビットに対する影響

BT (Bit Test) CFフラグ←選択されたビット 影響なし

BTS (Bit Test and Set) CFフラグ←選択されたビット 選択されたビット ← 1 BTR (Bit Test and Reset) CFフラグ←選択されたビット 選択されたビット ← 0

BTC (Bit Test and Complement) CFフラグ←選択されたビット 選択されたビット ← NOT(選択され たビット)

7.2.6.4. テスト命令

TEST命令は、2つのオペランドの論理積(AND)演算を実行し、その結果に基づいてSF、ZF、およ びPFフラグをセットする。セットされたフラグは、条件付きジャンプ命令、条件付きループ命令、

またはSETcc命令によってテストできる。AND命令との相違点は、TEST命令はいずれのオペランド

も変更しないことである。

7.2.7. 制御転送命令

IA-32プロセッサは、プログラムの実行フローを指示するために、条件付き制御転送命令と無条件制

御転送命令を備えている。条件付き転送は、EFLAGSレジスタのステータス・フラグが指定した状 態である場合にのみ実行される。無条件制御転送は、常に実行される。

7.2.7.1. 無条件転送命令

JMP、CALL、RET、INT、およびIRET命令は、プログラムの制御を、命令ストリーム内の他の位置

(デスティネーション・アドレス)に転送する。デスティネーションは、同じコード・セグメント内

(near転送)であっても、異なるコード・セグメント内(far転送)であってもかまわない。

ジャンプ命令。JMP (jump)命令は、無条件に、プログラムの制御をデスティネーション命令に転送 する。これは一方向の転送であり、リターン・アドレスは保存されない。デスティネーション・オ ペランドは、デスティネーション命令のアドレス(命令ポインタ)を指定する。アドレスは、相対 アドレスでも絶対アドレスでもよい。

相対アドレスは、EIPレジスタ内のアドレスを基準とするディスプレースメント(オフセット)であ る。デスティネーション・アドレス(nearポインタ)は、EIPレジスタ内のアドレスにこのディスプ レースメントを加算することによって得られる。このディスプレースメントは、符号付き整数で指 定されるため、命令ストリーム内で順方向にジャンプすることも、逆方向にジャンプすることもで きる。

絶対アドレスは、セグメントのアドレス0からのオフセットである。このアドレスは、次のいずれか の方法で指定される。

汎用レジスタ内のアドレス。このアドレスはnearポインタとして扱われ、EIPレジスタにコピー される。プログラムの実行は、現在のコード・セグメント内の新しいアドレスから再開される。

プロセッサの標準アドレス指定モードで指定されたアドレス。このアドレスは、near ポインタ またはfarポインタである。アドレスがnearポインタの場合は、アドレスはオフセットに変換さ れ、EIPレジスタにコピーされる。アドレスがfarポインタの場合は、アドレスはセグメント・

セレクタとオフセットに変換される。セグメント・セレクタ部はCSレジスタにコピーされ、オ フセット部はEIPレジスタにコピーされる。

プロテクト・モードでは、JMP命令によって、コール・ゲート、タスク・ゲート、およびタスク・

ステートの各セグメントへのジャンプも可能である。

コール命令とリターン命令。CALL (call procedure)命令は、あるプロシージャ(またはサブルーチン)

から他のプロシージャへのジャンプを実行する。RET (return from procedure)命令は、呼び出し元プロ シージャに戻るジャンプ(リターン)を実行する。