ROL – Rotate operand Left – циклический сдвиг операнда влево.
ROL операнд, количество_сдвигов
Флаги: SF, ZF, PF, CF. Флаг AF не определен.
Машинные коды см. таблицу операции SAL.Расширение кода операции при работе с непосредственным операндом, размещающееся в поле Reg/Opc в байте адресации, равно 000.
Например, 1) MOV DL, 80h
ROL DL, 1 ; DL=01h, CF=1
2) MOV DX, 2000h
MOV CL, 4
ROL DX, CL ; DX=0002h, CF=0
6) ROR операнд, значение — сдвиг вправо циклический (ROll Right) (рис.1.22)
ROR – Rotate operand Right – циклический сдвиг операнда вправо.
ROR операнд, количество_сдвигов
Флаги: SF, ZF, PF, CF. Флаг AF не определен.
Коды команды см. таблицу команды SAL. Но расширение кода операции при работе с непосредственным операндом, размещающееся в поле Reg/Opc в байте адресации, равно 001.
Например, 1) MOV DL, 81h
ROR DL, 1 ; DL=C0h, CF=1
2) MOV BX, 000Eh
MOV CL, 4
ROR BX, CL ; BX=E000, CF=1
![]() |
CF
CF
Рис. 1.22 Циклические сдвиги влево и вправо
При циклическом сдвиге биты не пропадают, а вдвигаются с другой стороны.
7) RCL операнд, значение — сдвиг влево циклический через перенос (Roll Cf Left)
RCL – Rotate operand through Carry flag Left – циклический сдвиг операнда влево через флаг переноса.
RCL операнд, количество_сдвигов
Флаги: SF, ZF, PF, CF. Флаг AF не определен.
Машинные коды см. таблицу операции SAL.Расширение кода операции при работе с непосредственным операндом, размещающееся в поле Reg/Opc в байте адресации, равно 010.
Например, 1) MOV DL, 7
RСL DL, 1 ; DL=0Fh, CF=0 (предыдущее значение 1)
2) MOV DH, 3
MOV CL, 4
RСL DH, CL ; DH=30h, CF=0 (предыдущее значение 0)
8) RCR операнд, значение — сдвиг вправо циклический через перенос (Roll Cf Right)
RСR – Rotate operand through Carry flag Right – циклический сдвиг операнда вправо через флаг переноса.
RСR операнд, количество_сдвигов
Флаги: SF, ZF, PF, CF. Флаг AF не определен.
Коды команды см. таблицу команды SAL. Но расширение кода операции при работе с непосредственным операндом, размещающееся в поле Reg/Opc в байте адресации, равно 011.
Например, 1) MOV DL, 8h
RСR DL, 1 ; DL=84h, CF=0 (предварительно установлен)
2) MOV BH, 80h
MOV CL, 5
RCR BH, CL ; BH=4, CF=0 (предварительно сброшен).
![]() |
CF
![]() |
CF
Рис. 1.23 Циклические сдвиги через перенос влево и вправо
Команды RCL, RCR включают CF в кольцо.
Примеры
mov al,11010101b
rol al,1; результат 10101011, в CF — 1, и она же — в 0 бит
mov al,11010101b; CF=0
rcr al,1; результат 01101010, из CF в 7 бит — 0, в CF — 1
Команды циклического сдвига могут использоваться, когда необходимо, например, менять местами фрагменты битов в операнде.
Пример
|
Младшая часть регистра EAX имеет название — AX, а старшая — нет. Команда ROL позволяет получить доступ к старшей части 32х-разрядного регистра:
ROL EAX,16 ; младшая и старшая часть регистра поменяются местами
Теперь:
|
EAX
AX
и бывшая старшая часть доступна в AX.
ПРИМЕР задания
Поделить число, находящееся в паре регистров DX, AX, на 4.
Чтобы это осуществить, нужно синхронно сдвигать оба регистра вправо так, чтобы биты из DX попадали при сдвиге в AX. Один из способов состоит в следующем:
1) сдвигаем DX на 1 разряд вправо (при этом бит из DX попадает во флаг CF);
2) осуществляем циклический сдвиг вправо через перенос регистра AX, при этом бит из CF (он туда попал из DX) попадает в старший разряд регистра AX.
Пункты 1) и 2) повторяем 2 раза, так как 4=22.
..........
shr dx,1
rcr ax,1
shr dx,1
rcr ax,1
..........
Контрольные вопросы
1. Что такое маска?
2. Приведите примеры ситуаций, в которых необходимо использование логических команд.
3. Команда OR, как создать маску, принцип использования?
4. Команда AND, как создать маску, принцип использования?
5. Команда XOR, как создать маску, принцип использования?
6. В чем разница между командами NOT и NEG?
7. В каких ситуациях используют команду сравнения? Принцип ее работы.
8. В чем отличие между командами TEST и AND?
9. Какие флаги используются при сравнении чисел без знака?
10. Какие флаги используются при сравнении чисел со знаком?
11. Как использовать команду OR для проверки знака числа или равенства 0 числа?
12. Назовите и объясните принципы работы команд сдвигов (арифметических, логических, циклических).
ПРАКТИЧЕСКИЕ ЗАДАНИЯ
Задание 1 (по вариантам).
1. В регистре DL установить 6-й, 3-й и 1-й биты и сбросить 0 бит.
2. Инвертировать 4-й и 3-й биты регистра BH, а знаковый бит установить в 1.
3. Умножить операнд в DL на 20.
4. Поместить в старший байт регистра SI младший байт регистра DI.
5. Двойное слово в DX:AX умножить на 4.
6. Сосчитать количество единичных битов в AX. Результат поместить в BX.
7. Разделить содержимое регистра CX на 32.
8. Поместить в регистр CL старший байт регистра DI.
9. Заменить 0,6,7 и 9 биты регистра BХ на 0,6,7 и 8 биты регистра DХ (соответственно).
10. Расположить содержимое AX в регистре BX в обратном порядке.
11. Инвертировать 3-й и 0-й биты регистра CH и сбросить 5 и 7 биты.
12. Переписать три младших бита регистра ВХ на место 10,11 и 12 битов.
13. Двойное слово в DX:AX разделить на 8.
14. В регистре AL установить 1-й, 5-й и 6-й биты, а 4 бит инвертировать.
15. Получить дополнительный код числа в регистре DI, не используя команды NOT или NEG.
16. Заменить три старших бита регистра SI на три младших бита регистра AX.
17. Умножить операнд в DH на 19.
18. Инвертировать четные биты регистра DX, а нечетные обнулить.
19. Заменить 3,4 и 5 биты регистра BL на 3,4 и 5 биты регистра СХ.
20. Разделить содержимое AX на 64.
21. Переписать четыре старших бита регистра СХ на место 3,4,5 и 6 битов.
22. Умножить содержимое регистра BX на 14.
23. Инвертировать нечетные биты регистра AX, а четные установить в 1.
24. Сосчитать количество нулевых битов в CX. Результат поместить в DX.
25. Поменять местами содержимое регистров AL и AH.
26. Поместить в младший байт регистра SI младший байт регистра AX
27. Умножить содержимое регистра BX на 11.
28. В регистре CX в четные биты записать 1, а в нечетные 0.
29. Заменить 1,4 и 7 биты регистра DH на 7,4 и 5 биты регистра СL (соответственно).
Задание 2
Записать машинные коды логических команд и команд сдвигов, используемых в программе из Задания 1. Самостоятельно выполнить действия по этим командам и установить флаги.
Пример выполнения:
Записать машинные коды команд, их 16-ричное представление, выполнить действия и установить флаги.
AND [SI], CH ; допустим ( [SI] ) ® 59h, (CH) ® 3Dh
Машинный код команды: 00100000 00101100 ; команда занимает 2 байта
16-ричный код команды: 202Ch.
Выполним логическую команду AND над операндами
Ответ: 19h.
Установим флаги, на которые влияет операция AND:
- CF=0 (всегда);
- PF = 0, т.к. кол-во 1 в байте результата = 3, а это число нечетное;
- AF не определен;
- ZF = 0, т.к. результат операции не равен нулю;
- SF = 0, т.к. знаковый бит содержит 0;
- OF = 0 (всегда).