Система команд x86 |
|
Программирование - Архитектура и система команд микропроцессоров x86 |
RCR
Влияние команды на флаги и форматы команды:
* |
|
|
|
|
|
|
|
* |
D0 /2 |
RCL r/m8,1 |
Сдвинуть по кругу влево на 1 бит 9 бит (CF, r/m8) |
8086 |
rcl ah,1 |
D2 /2 |
RCL r/m8,CL |
Сдвинуть по кругу влево на CL бит 9 бит (CF, r/m8) |
8086 |
rcl dh,cl |
C0 /2 ib |
RCL r/m8,imm8 |
Сдвинуть по кругу влево на imm8 бит 9 бит (CF, r/m8) |
Intel286 |
rcl al,4 |
D1 /2 |
RCL r/m16,1 |
Сдвинуть по кругу влево на 1 бит 17 бит (CF, r/m16) |
8086 |
rcl bx,1 |
D3 /2 |
RCL r/m16,CL |
Сдвинуть по кругу влево на CL бит 17 бит (CF, r/m16) |
8086 |
rcl di,cl |
C1 /2 ib |
RCL r/m16,imm8 |
Сдвинуть по кругу влево на imm8 бит 17 бит (CF, r/m16) |
Intel286 |
rcl di,9 |
D1 /2 |
RCL r/m32,1 |
Сдвинуть по кругу влево на 1 бит 33 бита (CF, r/m32) |
Intel386 |
rcl esi,1 |
D3 /2 |
RCL r/m32,CL |
Сдвинуть по кругу влево на CL бит 33 бита (CF, r/m32) |
Intel386 |
rcl ecx,12 |
C1 /2 ib |
RCL r/m32,imm8 |
Сдвинуть по кругу влево на imm8 бит 33 бита (CF, r/m32) |
Intel386 |
rcl edx,8 |
D0 /3 |
RCR r/m8,1 |
Сдвинуть по кругу вправо на 1 бит 9 бит (CF, r/m8) |
8086 |
rcr bh,1 |
D2 /3 |
RCR r/m8,CL |
Сдвинуть по кругу вправо на CL бит 9 бит (CF, r/m8) |
8086 |
rcr bh,cl |
C0 /3 ib |
RCR r/m8,imm8 |
Сдвинуть по кругу вправо на imm8 бит 9 бит (CF, r/m8) |
Intel286 |
rcr cl,4 |
D1 /3 |
RCR r/m16,1 |
Сдвинуть по кругу вправо на 1 бит 17 бит (CF, r/m16) |
8086 |
rcr cx,1 |
D3 /3 |
RCR r/m16,CL |
Сдвинуть по кругу вправо на CL бит 17 бит (CF, r/m16) |
8086 |
rcr si,cl |
C1 /3 ib |
RCR r/m16,imm8 |
Сдвинуть по кругу вправо на imm8 бит 17 бит (CF, r/m16) |
Intel286 |
rcr di,6 |
D1 /3 |
RCR r/m32,1 |
Сдвинуть по кругу вправо на 1 бит 33 бита (CF, r/m32) |
Intel386 |
rcr edi,1 |
D3 /3 |
RCR r/m32,CL |
Сдвинуть по кругу вправо на CL бит 33 бита (CF, r/m32) |
Intel386 |
rcr ebx,12 |
C1 /3 ib |
RCR r/m32,imm8 |
Сдвинуть по кругу вправо на imm8 бит 33 бита (CF, r/m32) |
Intel386 |
rcr ebp,8 |
D0 /0 |
ROL r/m8,1 |
Сдвинуть по кругу влево на 1 бит 8 бит (r/m8) |
8086 |
rol cl,1 |
D2 /0 |
ROL r/m8,CL |
Сдвинуть по кругу влево на CL бит 8 бит (r/m8) |
8086 |
rol dh,cl |
C0 /0 ib |
ROL r/m8,imm8 |
Сдвинуть по кругу влево на imm8 бит 8 бит (r/m8) |
Intel286 |
rol ch,3 |
D1 /0 |
ROL r/m16,1 |
Сдвинуть по кругу влево на 1 бит 16 бит (r/m16) |
8086 |
rol bp,1 |
D3 /0 |
ROL r/m16,CL |
Сдвинуть по кругу влево на CL бит 16 бит (r/m16) |
8086 |
rol ax,cl |
C1 /0 ib |
ROL r/m16,imm8 |
Сдвинуть по кругу влево на imm8 бит 16 бит (r/m16) |
Intel286 |
rol cx,7 |
D1 /0 |
ROL r/m32,1 |
Сдвинуть по кругу влево на 1 бит 32 бита (r/m32) |
Intel386 |
rol ebx,1 |
D3 /0 |
ROL r/m32,CL |
Сдвинуть по кругу влево на CL бит 32 бита (r/m32) |
Intel386 |
rol edx,11 |
C1 /0 ib |
ROL r/m32,imm8 |
Сдвинуть по кругу влево на imm8 бит 32 бита (r/m32) |
Intel386 |
rol eax,9 |
D0 /1 |
ROR r/m8,1 |
Сдвинуть по кругу вправо на 1 бит 8 бит (r/m8) |
8086 |
ror bl,1 |
D2 /1 |
ROR r/m8,CL |
Сдвинуть по кругу вправо на CL бит 8 бит (r/m8) |
8086 |
ror byte ptr [bx],cl |
C0 /1 ib |
ROR r/m8,imm8 |
Сдвинуть по кругу вправо на imm8 бит 8 бит (r/m8) |
Intel286 |
ror al,4 |
D1 /1 |
ROR r/m16,1 |
Сдвинуть по кругу вправо на 1 бит 16 бит (r/m16) |
8086 |
ror di,1 |
D3 /1 |
ROR r/m16,CL |
Сдвинуть по кругу вправо на CL бит 16 бит (r/m16) |
8086 |
ror dx,cl |
C1 /1 ib |
ROR r/m16,imm8 |
Сдвинуть по кругу вправо на imm8 бит 16 бит (r/m16) |
Intel286 |
ror bx,3 |
D1 /1 |
ROR r/m32,1 |
Сдвинуть по кругу вправо на 1 бит 32 бита (r/m32) |
Intel386 |
ror ecx,1 |
D3 /1 |
ROR r/m32,CL |
Сдвинуть по кругу вправо на CL бит 32 бита (r/m32) |
Intel386 |
ror eax,20 |
C1 /1 ib |
ROR r/m32,imm8 |
Сдвинуть по кругу вправо на imm8 бит 32 бита (r/m32) |
Intel386 |
ror ebp,6 |
Описание:
Команды циклического сдвига вращают биты регистра или операнда в памяти. Команды циклического сдвига влево сдвигают все биты вверх (к старшему), за исключением старшего бита, который возвращается вниз. Команды циклического сдвига вправо делают обратное: биты сдвигаются вниз (к младшему), а младший бит переносится в вершину. Для команд RCL и RCR флаг CF является частью вращаемого множества. Команда RCL сдвигает флаг CF в младший бит, а старший бит сдвигает во флаг CF. Команда RCR сдвигает флаг CF в старший бит, а младший бит сдвигает во флаг CF. Для команд ROL и ROR исходное значение флага CF не является частью результата, но флаг CF получает копию бита, который был сдвинут из одного конца в другой. Рисунки 6.6., … 6.9. поясняют сказанное.
Рис. 6.6. Команда ROL
Рис. 6.7. Команда RCL
Рис. 6.8. Команда ROR
Рис. 6.9. Команда RCR
Команда вращения повторяется столько раз, сколько указано вторым операндом, который может быть либо непосредственным числом, либо содержимым регистра CL. Чтобы уменьшить максимальное время выполнения команды процессор не позволяет счетчику вращений быть больше 31. Если счетчик вращений больше 31, используются только младшие 5 бит. Процессор 8086/8088 не маскирует счетчик вращений. (Процессоры Intel186 и старше во всех режимах, в том числе и в режиме V86 маскируют счетчик вращений.)
Флаг OF определен только для форм команд однократного вращения (вторым операндом является 1). Он неопределен во всех остальных случаях. Для циклических сдвигов влево бит CF после сдвига складывается по модулю два (XOR) со старшим битом результата, полученное значение заносится во флаг OF. Для циклических сдвигов вправо старшие два бита результата складываются по модулю два (XOR), полученное значение заносится во флаг OF.
Операция:
(* ROL - Циклический сдвиг влево *)
temp = COUNT;
WHILE (temp ¹ 0)
DO
tmpcf = (Старшийбит r/m);
r/m = r/m * 2 + (tmpcf);
temp = temp - 1;
OD;
IF COUNT = 1
THEN
IF (Старшийбит r/m) ¹ CF
THEN OF = 1;
ELSE OF = 0;
FI;
ELSE (OF неопределен);
FI;
(* ROR – Сдвигать вправо *)
temp = COUNT;
WHILE (temp ¹ 0)
DO
tmpcf = (Младшийбит r/m);
r/m = r/m / 2 + (tmpcf*2width(r/m));
temp = temp - 1;
OD;
IF COUNT = 1
THEN
IF (Старший бит r/m) ¹ (Бит, следующий за старшим битом r/m)
THEN OF = 1;
ELSE OF = 0;
FI;
ELSE (OF неопределен);
FI;
Особые ситуации защищенного режима:
#GP(0), если операнд-назначение находится в сегменте, запрещенном для записи, если используется некорректный эффективный адрес операнда в памяти в сегментах CS, DS, ES, FS, GS или нулевой селектор.
#SS(0) при использовании некорректного эффективного адреса в сегменте SS.
#PF(Код ошибки) при страничной ошибке.
#AC(0) при невыровненной ссылке в память при текущем уровне привилегий равном 3.
Особые ситуации режима реальной адресации:
#GP, если любая часть операнда находится вне пространства эффективных адресов в сегментах CS, DS, ES, FS или GS.
#SS, если любая часть операнда находится вне пространства эффективных адресов в сегменте SS.
Особые ситуации режима V86:
Такие же, как и в режиме реальной адресации.
#PF(Код ошибки) при страничной ошибке.
#AC(0) при невыровненной ссылке в память.
Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru