Команды циклического сдвига
Команды циклического сдвига похожи на команды сдвига, но в отличие от последних сохраняют сдвинутые за пределы операнда биты, помещая их обратно в операнд. Как и при исполнении команд сдвига, сдвинутый за пределы операнда бит запоминается во флаге переноса CF.
При исполнении команды ROL (rotate left - сдвинуть влево циклически) и ROR (rotate right - сдвинуть вправо циклически) вышедший за пределы операнда бит входит в него с противоположного конца. При исполнении команд RCL (rotate left through carry - сдвинуть влево циклически вместе с флагом переноса) и RCR (rotate right through carry - сдвинуть вправо циклически вместе с флагом переноса) в противоположный конец операнда помещается значение флага переноса CF. Все команды циклического сдвига воздействуют только на флаги CF и OF.
Чтобы познакомиться с работой команд циклического сдвига, вернемся к исходным данным предыдущего примера:
AL = 10110100 CF = 1
Команды циклического сдвига воздействуют на регистр AL и флаг CF следующим образом:
После ROL AL,1:
AL = 01101001 CF = 1
После ROR AL,1:
AL = 01011010 CF = 0
После RCL AL,1:
AL = 01101001 CF = 1
После RCR AL,1:
AL = 11011010 CF = 0
Индивидуальное задание.
Каждому студенту выдается 4-хзначный вариант. Согласно этому варианту вычислить следующее выражение и определить, четное полученное число или нечетное и отрицательное оно или положительное:
F = Y оп1 КОН1 оп2 Х оп3 КОН2
КОН1, КОН2 – числовые константы, согласно табл. 1
оп1, оп2, оп3 – операции сложения, вычитания, умножения и деления согласно табл. 2
X, Y – переменные, тип которых определяется согласно табл. 3
Операции умножения и деления выполнять с помощью операций сдвига. Проверка на четность либо нечетность и знак (если числа со знаком) числа осуществлять с помощью логических побитовых команд.
Числовые константы из табл. 1 берутся согласно первой цифре варианта, операции сложения и вычитания из табл. 2 – согласно второй цифре варианта, а размер и тип переменных – из табл. 3 согласно третьей цифре варианта.
Если размер результат будет более 16 бит – результат преобразовывать в 16-битный.
Таблица 1.
Первая цифра варианта | ||||||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
КОН1 | 10 | 96 | 20 | 12 | 130 | 24 | 64 | 32 | 6 | 40 |
КОН2 | 32 | 16 | 8 | 4 | 128 | 64 | 36 | 22 | 14 | 72 |
Таблица 2.
Вторая цифра варианта | ||||||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
оп1 | / | / | * | * | / | * | — | + | / | * |
оп2 | – | + | – | + | % | % | * | * | + | + |
оп3 | * | * | / | / | * | / | / | / | – | – |
Таблица 3.
Третья цифра варианта | ||||||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
X | char | un char | int | un int | int | un char | int | char | char | un int |
Y | int | un int | char | un char | int | un int | int | int | char | un char |
Примечания: – char – 8 битн. со знаком
– un. char – 8 битн. без знака
– int – 16 битн. со знаком
– un. int – 16 битн. без знака
Пример. У студента индивидуальный вариант 990. Строим индивидуальное выражение для вычисления: F = Y * 40 + X — 72
Согласно варианту переменные X и Y должны быть описаны следующим образом
char x;
int y;
Программа выглядит следующим образом:
;y*40=y*32+y*8;
; адрес у = 300, адрес x= 400
; Первоначально исходные данные заносятся на стартовые адреса памяти
mov ax,[y]
mov bx,ax
mov cl,3
shl ax,cl ;y*8
mov cl,5
shl bx,cl ; y*32
add bx,ax
mov al,[x]
cbw ;преобразуем 8-битное x в 16 битное
add bx,ax ;y*40+x
sub bx,72 ;y*40+x-72
mov f,bx
; проверяем на четность
mov iChet,bx
and iChet,0001h
; проверяем на знак
mov iSign,bx
and iSign,8000h
; результаты сохраняем с адесов Y=500, X=600 четность, 506 и 606 – знаковость
Содержание отчета :
1. Название работы
2. Цель работы
3. Приборы и оборудование
4. Краткие теоретические сведения
5. Индивидуальное задание
6. Распечатанный текст программы
7. Выводы.
Вопросы к защите лабораторной работы.
1. Логические команды: формат и правила применения
2. Команды сдвига: формат и правила применения.
3. Команды циклического сдвига: формат и правила применения.
Лабораторная работа №6