説明
第1オペランド(デスティネーション・オペランド)のビットを第2オペランド(カ ウント・オペランド)に指定されたビット位置の数だけシフトし(回転させ)、結果 をデスティネーション・オペランドにストアする。デスティネーション・オペランド には、レジスタまたはメモリ・ロケーションを使用できる。カウント・オペランドは、
即値またはCLレジスタの値が可能で、符号なし整数である。プロセッサは、最下位 5ビットを除くカウント・オペランドのすべてのビットをマスクして、カウントを0か ら31までの数に制限する。
左に回転(ROL)命令およびキャリーを通じて左に回転(RCL)命令は、すべての ビットを最上位ビット位置の方向にシフトするが、最上位ビットだけは最下位ビッ ト・ロケーションに回転される(『IA-32インテル® アーキテクチャ・ソフトウェア・
デベロッパーズ・マニュアル、上巻』の図7-11.を参照)。右に回転(ROR)命令およ びキャリーを通じて右に回転(RCR)命令は、すべてのビットを最下位ビット位置の 方向にシフトするが、最下位ビットだけは最上位ビット・ロケーションに回転される
(『IA-32インテル® アーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル、上 巻』の図7-11.を参照)。
RCL命令およびRCR命令は、回転の中にCFフラグを含める。RCL命令は、CFフラ グを最下位ビットにシフトさせ、最上位ビットをCFフラグにシフトさせる(『IA-32 インテル®アーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル、上巻』の 図7-11.を参照)。RCR命令は、CFフラグを最上位ビットにシフトさせ、最下位ビッ トをCFフラグにシフトさせる(『IA-32インテル®アーキテクチャ・ソフトウェア・
デベロッパーズ・マニュアル、上巻』の図7-11.を参照)。ROL命令およびROR命令 では、CFフラグの元の値は結果には含められないが、CFフラグには1端からもう1 端にシフトされたビットのコピーが入る。
OFフラグは、1ビットの回転だけに定義され、(どのフラグにも影響を与えないゼロ ビットの回転が何も行わないことを除いて)その他のすべての場合は未定義である。
左回転では、OFフラグは、(回転後の)CFビットと結果の最上位ビットとの排他的論 理和に設定される。右回転では、OFフラグは、結果の最上位2ビットの排他的論理和 に設定される。
RCL/RCR/ROL/ROR-—Rotate(続き)
操作
(* RCL and RCR instructions *) SIZE ← OperandSize
CASE (determine count) OF
SIZE ← 8: tempCOUNT ← (COUNT AND 1FH) MOD 9;
SIZE ← 16: tempCOUNT ← (COUNT AND 1FH) MOD 17;
SIZE ← 32: tempCOUNT ← COUNT AND 1FH;
ESAC;
(* RCL instruction operation *) WHILE (tempCOUNT ≠ 0)
DO
tempCF ← MSB(DEST);
DEST ← (DEST ∗ 2) + CF;
CF ← tempCF;
tempCOUNT ← tempCOUNT – 1;
OD;
ELIHW;
IF COUNT = 1
THEN OF ← MSB(DEST) XOR CF;
ELSE OF is undefined;
FI;
(* RCR instruction operation *) IF COUNT = 1
THEN OF ← MSB(DEST) XOR CF;
ELSE OF is undefined;
FI;
WHILE (tempCOUNT ≠ 0) DO
tempCF ← LSB(SRC);
DEST ← (DEST / 2) + (CF ∗ 2SIZE);
CF ← tempCF;
tempCOUNT ← tempCOUNT – 1;
OD;
(* ROL and ROR instructions *) SIZE ← OperandSize
CASE (determine count) OF
SIZE ← 8: tempCOUNT ← COUNT MOD 8;
SIZE ← 16: tempCOUNT ← COUNT MOD 16;
SIZE ← 32: tempCOUNT ← COUNT MOD 32;
ESAC;
(* ROL instruction operation *) WHILE (tempCOUNT ≠ 0)
DO
tempCF ← MSB(DEST);
DEST ← (DEST ∗ 2) + tempCF;
tempCOUNT ← tempCOUNT – 1;
OD;
ELIHW;
CF ← LSB(DEST);
RCL/RCR/ROL/ROR-—Rotate(続き)
IF COUNT = 1
THEN OF ← MSB(DEST) XOR CF;
ELSE OF is undefined;
FI;
(* ROR instruction operation *) WHILE (tempCOUNT ≠ 0)
DO
tempCF ← LSB(SRC);
DEST ← (DEST / 2) + (tempCF ∗ 2SIZE);
tempCOUNT ← tempCOUNT – 1;
OD;
ELIHW;
CF ← MSB(DEST);
IF COUNT = 1
THEN OF ← MSB(DEST) XOR MSB − 1(DEST);
ELSE OF is undefined;
FI;
影響を受けるフラグ
CFフラグは、そこにシフトされたビットの値を持つ。OFフラグは、単一ビット回転
(上記の「説明」の項を参照)の場合だけに影響を受け、複数ビット回転の場合には 未定義である。SF、ZF、AF、PFフラグは影響を受けない。
保護モード例外
#GP(0) ソース・オペランドが書き込み不可能なセグメントにある場合。
メモリ・オペランドの実効アドレスがCS、DS、ES、FS、またはGS セグメントの範囲外の場合。
DS、ES、FS、またはGSレジスタの内容がヌル・セグメント・セレ
クタの場合。
#SS(0) メモリ・オペランドの実効アドレスがSSセグメントの範囲外の場合。
#PF(フォルトコード) ページフォルトが発生した場合。
#AC(0) 現行特権レベルが3のときに、アライメント・チェックがイネーブル
にされていて、アライメントが合わないメモリ参照が行われた場合。
実アドレスモード例外
RCL/RCR/ROL/ROR-—Rotate(続き)
仮想8086モード例外
#GP(0) メモリ・オペランドの実効アドレスがCS、DS、ES、FS、またはGS
セグメントの範囲外の場合。
#SS(0) メモリ・オペランドの実効アドレスがSSセグメントの範囲外の場合。
#PF(フォルトコード) ページフォルトが発生した場合。
#AC(0) アライメント・チェックがイネーブルにされていて、アライメントが
合わないメモリ参照が行われた場合。