Код
|
Инструкция
|
Описание
|
84 /r
|
TEST r/m8, r8
|
r/m8 AND r8
|
85 /r
|
TEST r/m16, r16
|
r/m16 AND r16
|
A8 ib
|
TEST AL, imm8
|
AL AND imm8
|
A9 iw
|
TEST AX, imm16
|
AX AND imm16
|
F6 /0 ib
|
TEST r/m8, imm8
|
r/m8 AND imm8
|
F7 /0 iw
|
TEST r/m16, imm16
|
r/m16 AND imm16
|
Сравнение выполняется с помощью операции «логическое И» между разрядами первого и второго операндов. Результат операции теряется, но производится установка флагов:
MOV ВН, 1100b
TEST BH, 0011b ; ZF=1
Команда OR выполняет операцию «логическое ИЛИ» между операндами (табл. 37). Флаги OF и CF сбрасываются. Флаги SF, ZF и PF устанавливаются в соответствии с результатом. Состояние флага AF не определено.
Табл. 37. Команда OR.
Код
|
Инструкция
|
Описание
|
08 /r
|
OR r/m8, r8
|
r/m8:= r/m8 OR r8
|
09 /r
|
OR r/m16, r16
|
r/m16:= r/m16 OR r16
|
0A /r
|
OR r8, r/m8
|
r8:= r8 OR r/m8
|
0B /r
|
OR r16, r/m16
|
r16:= r16 OR r/m16
|
0C ib
|
OR AL, imm8
|
AL:= AL OR imm8
|
0D iw
|
OR AX, imm16
|
AX:= AX OR imm16
|
80 /1 ib
|
OR r/m8, imm8
|
r/m8:= r/m8 OR imm8
|
81 /1 iw
|
OR r/m16, imm16
|
r/m16:= r/m16 OR imm16
|
Результат записывается на место первого операнда: i-й бит результата равен 0, если i-е биты операндов совпадают, и равен 1, если эти биты различны, например:
MOV CL, 1100b
OR CL, 1010b ; CL=00001110b
Команда OR часто используется при наложении маски. Например, в полученном байте данных необходимо установить младшие три разряда в 1. Тогда маска будет следующей:
OR AL, 00000111b
Команда XOR выполняет операцию «исключающее ИЛИ» между операндами (табл. 38). Флаги OF и CF очищаются. Флаги SF, ZF и PF устанавливаются в соответствии с результатом. Состояние флага AF не определено.
Табл. 38. Команда XOR.
Код
|
Инструкция
|
Описание
|
30 /r
|
XOR r/m8, r8
|
r/m8:= r/m8 XOR r8
|
31 /r
|
XOR r/m16, r16
|
r/m16:= r/m16 XOR r16
|
32 /r
|
XOR r8, r/m8
|
r8:= r8 XOR r/m8
|
33 /r
|
XOR r16, r/m16
|
r16:= r16 XOR r/m16
|
34 ib
|
XOR AL, imm8
|
AL:= AL XOR imm8
|
35 iw
|
XOR AX, imm16
|
AX:= AX XOR imm16
|
80 /6 ib
|
XOR r/m8, imm8
|
r/m8:= r/m8 XOR imm8
|
81 /6 iw
|
XOR r/m16, imm16
|
r/m16:= r/m16 XOR imm16
|
Результат заносится на место первого операнда:
MOV CL, 1100b
XOR CL, 1010b ; CL=00000110b
Когда операнды команды XOR совпадают, результатом будет нулевое слово. Такой прием часто используется для обнуления регистров. По сравнению с другими вариантами (MOV АХ, 0 или SUB AX, AX) он выполняется быстрее. Например, при любом значении АХ имеем:
XOR АХ, АХ ; АХ:=0
Вычисление логических выражений. Очевидное применение логических команд состоит в вычислении логических выражений. Например, если переменные:
A DB ?
B DB ?
трактуются как логические, то вычисление:
A:=(not A) and B
реализуется с помощью следующих команд:
MOV AL, А
NOT AL
AND AL, B
MOV A, AL
Однако на практике подобные вычисления встречаются крайне редко. Дело в том, что логические выражения обычно используются для записи условий в условных операторах и циклах, а в этих случаях можно обойтись и без логических команд, достаточно лишь команд сравнения и условных переходов.
Например, условный оператор:
if (X > 0) or (Y = 1) then goto L
можно сначала полностью вычислить логическое выражение, а затем проверить результат.
Можно поступить и проще: сравнивать X с нулем и Y с единицей, и с помощью команд условного перехода реагировать на проверки (см. раздел 5.5.5):
CMP Х, 0 ; сравнение X с нулем
JG L ; Х > 0
JE L ; Y = 1
Команды сдвига. Команды сдвига и циклического сдвига представляют часть логических возможностей и имеют следующие свойства:
обрабатывают байт или слово;
имеют доступ к регистру или к памяти;
сдвигают операнд на величину до 8 бит (для байта) и 16 бит (для слова) влево или вправо;
сдвигают логически (без знака) или арифметически (со знаком).
Все команды сдвига имеют два операнда. Первый операнд рассматривается как набор битов, которые будут сдвигаться на несколько позиций влево или вправо. Второй операнд (целое без знака) определяет, на сколько разрядов следует сдвинуть первый операнд. Результат записывается на место первого операнда. Значение сдвига на 1 разряд может быть записано как непосредственный операнд, а значение, большее 1, должно находиться в регистре CL.
Каждая команда сдвига имеет две разновидности, которые записываются следующим образом:
<мнемокод> ор, 1 ; сдвиг ор на 1 разряд
<мнемокод> op, CL ; сдвиг ор на CL разрядов (CL 0)
В первом случае операнд ор сдвигается на 1 разряд, во втором ор может сдвигаться на любое число разрядов. Заметим, что второй вариант есть повторение первого CL раз, причем при CL=0 сдвига нет. Значение CL командой сдвига не меняется. Команды сдвига меняют все флаги, но, как правило, интерес представляет только флаг переноса CF.
Сдвиг может быть выполнен на произвольное число разрядов от 0 до 255. В процессорах, начиная с 80286, в качестве счётчика сдвига используются только младшие 5 разрядов регистра CL, что ограничивает максимальное количество сдвигов (не более 31).
Начиная с процессора 80186, стало доступно возможность явного задания величины сдвига, больше 1. Вторым операндом в этом случае является беззнаковое число размером байт. Процессоры 80386 и выше в качестве величины сдвига берут 3 правых бита регистра CL при сдвиге байта и 4 правых байта при сдвиге слова.
Все команды сдвига можно разделить на команды логического сдвига (простого сдвига), арифметического и циклического.
Do'stlaringiz bilan baham: |