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)命令は、呼び出し元プロ シージャに戻るジャンプ(リターン)を実行する。