操作碼 |
指令 |
說明 |
D0 /2 |
RCL r/m8,1 |
循環左移 9 位(CF 與 r/m8)一次 |
D2 /2 |
RCL r/m8,CL |
循環左移 9 位(CF 與 r/m8) CL 次 |
C0 /2 ib |
RCL r/m8,imm8 |
循環左移 9 位(CF 與 r/m8)imm8 次 |
D1 /2 |
RCL r/m16,1 |
循環左移 17 位(CF 與 r/m16)一次 |
D3 /2 |
RCL r/m16,CL |
循環左移 17 位(CF 與 r/m16) CL 次 |
C1 /2 ib |
RCL r/m16,imm8 |
循環左移 17 位(CF 與 r/m16)imm8 次 |
D1 /2 |
RCL r/m32,1 |
循環左移 33 位(CF 與 r/m32)一次 |
D3 /2 |
RCL r/m32,CL |
循環左移 33 位(CF 與 r/m32)CL 次 |
C1 /2 ib |
RCL r/m32,imm8 |
循環左移 33 位(CF 與 r/m32)imm8 次 |
D0 /3 |
RCR r/m8,1 |
循環右移 9 位(CF 與 r/m8)一次 |
D2 /3 |
RCR r/m8,CL |
循環右移 9 位(CF 與 r/m8)CL 次 |
C0 /3 ib |
RCR r/m8,imm8 |
循環右移 9 位(CF 與 r/m8)imm8 次 |
D1 /3 |
RCR r/m16,1 |
循環右移 17 位(CF 與 r/m16)一次 |
D3 /3 |
RCR r/m16,CL |
循環右移 17 位(CF 與 r/m16)CL 次 |
C1 /3 ib |
RCR r/m16,imm8 |
循環右移 17 位(CF 與 r/m16)imm8 次 |
D1 /3 |
RCR r/m32,1 |
循環右移 33 位(CF 與 r/m32)一次 |
D3 /3 |
RCR r/m32,CL |
循環右移 33 位(CF 與 r/m32)CL 次 |
C1 /3 ib |
RCR r/m32,imm8 |
循環右移 33 位(CF 與 r/m32)imm8 次 |
D0 /0 |
ROL r/m8,1 |
循環左移 8 位 r/m8 一次 |
D2 /0 |
ROL r/m8,CL |
循環左移 8 位 r/m8 CL 次 |
C0 /0 ib |
ROL r/m8,imm8 |
循環左移 8 位 r/m8 imm8 次 |
D1 /0 |
ROL r/m16,1 |
循環左移 16 位 r/m16 一次 |
D3 /0 |
ROL r/m16,CL |
循環左移 16 位 r/m16 CL 次 |
C1 /0 ib |
ROL r/m16,imm8 |
循環左移 16 位 r/m16 imm8 次 |
D1 /0 |
ROL r/m32,1 |
循環左移 32 位 r/m32 一次 |
D3 /0 |
ROL r/m32,CL |
循環左移 32 位 r/m32 CL 次 |
C1 /0 ib |
ROL r/m32,imm8 |
循環左移 32 位 r/m32 imm8 次 |
D0 /1 |
ROR r/m8,1 |
循環右移 8 位 r/m8 一次 |
D2 /1 |
ROR r/m8,CL |
循環右移 8 位 r/m8 CL 次 |
C0 /1 ib |
ROR r/m8,imm8 |
循環右移 8 位 r/m16 imm8 次 |
D1 /1 |
ROR r/m16,1 |
循環右移 16 位 r/m16 一次 |
D3 /1 |
ROR r/m16,CL |
循環右移 16 位 r/m16 CL 次 |
C1 /1 ib |
ROR r/m16,imm8 |
循環右移 16 位 r/m16 imm8 次 |
D1 /1 |
ROR r/m32,1 |
循環右移 32 位 r/m32 一次 |
D3 /1 |
ROR r/m32,CL |
循環右移 32 位 r/m32 CL 次 |
C1 /1 ib |
ROR r/m32,imm8 |
循環右移 32 位 r/m32 imm8 次 |
按第二個運算元(計數運算元)指定的位數將第一個運算元(目標運算元)中的位移位(循環移位),結果儲存到目標運算元。目標運算元可以是暫存器或記憶體位置;計數運算元是一個無符號整數,它可以是立即數或 CL 暫存器中的值。處理器通過對計數運算元中除 5 個最低有效位之外的其它所有位執行掩碼處理,將計數限制為 0 到 31。
循環左移 (ROL) 與帶進位循環左移 (RCL) 指令將除最高有效位之外的其它所有位移到更高有效位的位置,最高有效位則循環移到最低有效位的位置(請參閱“IA-32 英特爾(R) 體系結構軟件開發人員手冊”第 1 卷的“圖 6-10”)。循環右移 (ROR) 與帶進位循環右移 (RCL) 指令將除最低有效位之外的其它所有位移到更低有效位的位置,最低有效位則循環移到最高有效位的位置(請參閱“IA-32 英特爾(R) 體系結構軟件開發人員手冊”第 1 卷的“圖 6-10”)。
RCL 與 RCR 指令在循環移位中包括 CF 標誌。RCL 指令將 CF 標誌移到最低有效位,並將最高有效位移到 CF 標誌(請參閱“IA-32 英特爾(R)3q21`1 體系結構軟件開發人員手冊”第 1 卷的“圖 6-10”)。RCR 指令將 CF 標誌移到最高有效位,並將最低有效位移到 CF 標誌(請參閱“IA-32 英特爾(R)3q21`1 體系結構軟件開發人員手冊”第 1 卷的“圖 6-10”)。對於 ROL 與 ROR 指令,CF 標誌的原始值不是結果的一部分,但 CF 標誌會接收從一端移動到另一端的位的副本。
OF 標誌僅在 1 位循環移位中有定義;在其它所有情況中它都未定義(零位循環移位除外,它不執行任何操作,即不影響任何標誌)。對於循環左移,OF 標誌設定為 CF 位(循環移位之後)與結果的最高有效位之間的“異或”。對於循環右移,OF 標誌設定為結果的兩個最高有效位之間的“異或”。
8086 不對循環移位計數執行掩碼處理。不過,其它所有的“英特爾(R) 體系結構”處理器(從 Intel(R) 286 處理器起)都會通過掩碼處理,將循環移位計數限制成 5 位,這樣最大計數就是 31。在所有的操作模式(包括虛 8086 模式)中,都會執行這樣的掩碼處理,以縮短指令的最大執行時間。
(* 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);
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 時進行未對齊的記憶體引用。
#GP - 如果記憶體運算元有效地址超出 CS、DS、ES、FS 或 GS 段限制。
#SS - 如果記憶體運算元有效地址超出 SS 段限制。
#GP(0) - 如果記憶體運算元有效地址超出 CS、DS、ES、FS 或 GS 段限制。
#SS(0) - 如果記憶體運算元有效地址超出 SS 段限制。
#PF(錯誤程式碼) - 如果發生頁錯誤。
#AC(0) - 如果在啟用對齊檢查的情況下進行未對齊的記憶體引用。