1 / МУ_ЭВМ+ПУ_ч1 / 6-МУ_ЭВМ+ПУ-лог+сдвиг
.docxЛабораторная работа 6
ЛОГИЧЕСКИЕ КОМАНДЫ И КОМАНДЫ СДВИГА
-
Цель работы
Изучение логических команд и команд сдвига: действия с отдельными битами – тестирование, установка и сбрасывание, инвертирование.
-
Логические операции
6.2.1 Особенности логических команд
Логические команды:
-
реализуют поразрядные операции: i-й разряд результата зависит только от i-ых разрядов операндов, при этом действие выполняется сразу над всеми разрядами операндов одновременно;
-
меняют все флаги условий, но интерес вызывает только флаг нуля ZF, (принимает значение 1, если получился нулевой результат, и равен 0 в противном случае). Что касается других флагов, то они, предназначенные для работы с числами, в логических операциях малоинформативны.
Операнды должны иметь одинаковый размер.
Краткие сведения о логических командах приведены в таблицах 6.1 и 6.2.
Таблица 6.1 – Логические команды
Синтаксис |
Логика работы |
AND op1, op2 |
op1 = op1 and op2 |
TEST op1, op2 |
op1 and op2 |
OR op1, op2 |
op1 = op1 or op2 |
XOR op1, op2 |
op1 = op1 xor op2 |
NOT op |
op = not op |
Таблица 6.2 – Таблица истинности
X |
Y |
X and Y конъюнкция |
X xor Y исключающее ИЛИ |
X or Y дизъюнкция |
not X отрицание |
1 |
1 |
1 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
0 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
1 |
Описа-ние |
|
=1, если оба =1 |
=1, если оба разные |
=1, если хоть один =1 |
|
Команда TEST - аналог команды AND, но результат никуда не записывается, выполняется только установка флагов (наиболее информативен флаг ZF).
-
Применение логических команд
Приводимые ниже положения иллюстрируются примерами, в которых фигурируют регистры AL и BL, имеющие следующие начальные значения:
AL = 00001101b
BL = 00001100b
Второй операнд в командах (op2) – маска (шаблон).
-
Установка бит в 1 - команда OR (устанавливаемые биты в маске =1, остальные =0).
ПРИМЕР
Установить бит номер нуль в 1.
OR AL, 00000001b ; AL = 1101b
OR BL, 00000001b ; BL = 1101b
-
Сброс бит в 0 – команда AND (сбрасываемые биты в маске =0, остальные =1).
ПРИМЕР
Сбросить биты номер нуль, два и три.
AND AL, 11110010b ; AL= 00000000b
-
Инвертирование бит – команда XOR (инвертируемые биты в маске =1, остальные =0).
ПРИМЕР
Инвертировать бит номер нуль.
XOR AL, 0000 0001b ; AL:= 1100b
XOR BL, 0000 0001b ; BL:= 1101b
-
Проверка состояния бит – команда TEST (интересующие биты в маске =1, остальные =0).
ПРИМЕР
Протестировать состояние бита номер нуль регистра AL.
TEST AL, 00000001b
Результат операции – 00000001b (выполняется поразрядное умножение - and, но сам результат никуда не записывается, изменяется флаг нуля ZF).
Маска (шаблон) подобрана так, что все не интересующие нас биты в результате будут нулевыми (умножаются на нуль - 00000001b). Бит номер нуль в результате будет таким, каков он в регистре AL (он умножается на 1 - 00000001b).
Таким образом, весь результат фактически зависит от величины интересующего нас бита:
если бит =0, то результат =0 → ZF=1
если бит =1, то результат ≠0 → ZF=0
Программе доступен только флаг ZF. Именно его величина используется, если проверка бита необходима в дальнейшем для организации условного перехода.
-
Обнуление регистров - команда XOR
ПРИМЕР
Очистить регистр AL.
XOR АL, АL ; АL:=0
По сравнению с другими приемами - MOV АL, 0 или SUB AL, AL - выполняется быстрее.
-
Команды сдвига
6.3.1 Команды сдвига перемещают (сдвигают) биты в поле операнда op (приемника) влево (L) или вправо (R) на число разрядов, указанных в счетчике:
<мнемокод> op, <счетчик>
Операнд op может быть регистром или памятью, а <счетчик> – либо непосредственным операндом, либо регистром CL.
6.3.2 Команды по принципу действия различаются на линейные и циклические.
Линейные – это логический (беззнаковые числа) и арифметический (знаковые числа) сдвиги, выполняемые по алгоритму: выдвигаемый бит попадает в СF, при этом значение предыдущего сдвинутого бита теряется, а бит, вводимый с другого конца, равен 0.
Логический сдвиг влево (shift left): SHL op, <счетчик>
Логический сдвиг вправо (shift right): SHR op, <счетчик>
Условно действия этих команд можно изобразить так, как показано на рисунке 6.1 (слева - для SHL, справа - для SHR).
CF op op CF
0
0
Рисунок 6.1 – Схема действия команд логического сдвига
Замечание: команды сдвигают в памяти переменные, большие байта, так, как если бы они было записаны в "неперевернутом" виде.
ПРИМЕР
Х DW 1FFh ; 00000001 11111111b (X: 11111111b, X+1: 00000001b)
…
SHL X, 1 ; 00000011 11111110b (X: 11111110b, X+1: 00000011b)
Арифметический сдвиг влево (shift arithmetic left): SAL op, <счетчик>
Арифметический сдвиг вправо (shift arithmetic rigth ): SAR op, <счетчик>
Команда SAL аналогична SHL.
SAR сохраняет знак, восстанавливая его после сдвига каждого очередного бита (рисунок 6.2).
оp CF
Рисунок 6.2 – Схема действия команды SAR
6.4 Быстрое умножение и деление на степень двойки
Наглядное представление об изменении числа 1 при последовательных сдвигах его влево дает таблица 6.2.
Таблица 6.2 – Результаты последовательных сдвигов числа 1
Число в двоичной системе счисления |
Соответствующее число в десятичной системе счисления |
Получено сдвигом двоичного числа 1 влево на … позиций |
1 |
1= 20 |
0 |
10 |
2=21 |
1 |
100 |
4=22 |
2 |
1000 |
8=23 |
3 |
… |
… |
… |
10….0 k нулей |
2k |
k |
Линейные команды применяются для быстрого умножения и деления операнда оp на число, представляющее собой степень двойки 2k:
-
умножение беззнаковых и знаковых чисел на 2k – сдвиг (SHL или SAL соответственно) на k позиций влево
ПРИМЕР Содержимое регистра AL (AL=3) умножить на 4 (4=22)
mov al, 3 ; al = 3=0000 0011b
shl al, 2 ; al = 0000 1100b = 12
-
получение неполного частного при делении на 2k беззнаковых и знаковых чисел - сдвиг (SHR или SAR соответственно) операнда на k позиций вправо
ПРИМЕР Определить неполное частное от деления содержимого регистра AL (AL=17) на 4 (17 : 4 = 4 (1 в остатке))
mov al, 17 ; al = 17 = 11h = 0001 0001b
shr al, 2 ; al = 0000 0100b = 4
-
получение остатка от деления беззнаковых чисел на 2k – выделить в делимом (операнде) k правых битов.
ПРИМЕР Определить остаток от деления содержимого регистра AL (AL=17) на 4.
mov al, 17 ; al = 17 = 11h = 0001 0001b → 01b = 1
ПРИМЕР Определить, является ли содержимое регистра BX четным числом.
Если правый бит регистра BX равен нулю (это остаток от деления на 2), то число четное.
6.5 Особенность циклических сдвигов: "уходящий" бит не теряется, а возвращается в операнд с другого конца и одновременно заносится во флаг CF.
Циклический сдвиг влево (rotate left): ROL op, <счетчик>
Циклический сдвиг вправо (rotate right): ROR op, <счетчик>
Схема действия этих команд изображена на рисунке 6.3 (слева - для ROL , справа - для ROR ).
CF op op CF
Рисунок 6.3 – Схема действия команд циклического сдвига
ПРИМЕР
MOV CL, 11000011b
ROL CL, 1 ; CF=1, CL=10000111b
MOV BH, 11100010b
ROR BH, 1 ; BH=01110001b, CF=0
Команды часто используются для перестановки частей содержимого ячейки или регистра.
ПРИМЕР
Поменять местами правую и левую половины регистра AL.
Задание можно выполнить циклическим сдвигом байта на 4 разряда влево (или вправо):
MOV AL, 17h ; AL=00010111b – начальное значение регистра
MOV CL, 4
ROL AL, CL ; AL=01110001b=71h
Циклический сдвиг влево через перенос (rotate lefh through carry):
RCL op, <счетчик>
Циклический сдвиг вправо через перенос (rotate rigth through carry):
RCR op, <счетчик>
По команде RCL все биты первого операнда сдвигаются на одну позицию влево, причем самый левый бит попадает во флаг CF, а прежнее значение этого флага заносится в самый правый разряд операнда (на рисунке 6.4 слева); в команде RCR все аналогично, только осуществляется сдвиг вправо (на рисунке 6.4 справа):
CF op op CF
Рисунок 6.4 – Схема действия команд циклического сдвига
ПРИМЕР
Пусть начальное значение CF=0, а регистр BL содержит 11110000b.
RCL BL, 1 ; CF=1, BL=11100000b
RCL BL, 1 ; CF=1, BL=11000001b
Рассматриваемые команды обычно используются при переносе битов из одного регистра (или переменной) в другой.
ПРИМЕР
Сдвинуть на 3 разряда влево значения регистров AL и DH, приписав справа к AL три левых бита регистра DH:
MOV СХ, 3 ; счетчик количества сдвигаемых бит
L: SHL DH, 1 ; в СF бит номер 7 (левый) из DH
RCL AL, 1 ; бит из СF в бит номер 0 (правый) AL
DEC CX ; CX := CX – 1
CMP CX, 0 ; CX = 0? (все биты перемещены?)
JNE L ; если не все на L