
Команды логических операций
Логические операции являются важным элементом в проектировании микросхем и имеют много общего в логике программирования. Команды AND, OR, XOR и TEST - являются командами логических операций. Эти команды используются для сброса и установки бит и для арифметических операций в коде ASCII . Все эти команды обрабатывают один байт или одно слово в регистре или в памяти, и устанавливают флаги CF, OF, PF, SF, ZF.
AND: Если оба из сравниваемых битов равны 1, то результат равен 1; во всех остальных случаях результат - 0.
OR: Если хотя бы один из сравниваемых битов равен 1, то результат равен 1; если сравниваемые биты равны 0, то результат - 0.
XOR: Если один из сравниваемых битов равен 0, а другой равен 1, то результат равен 1; если сравниваемые биты одинаковы (оба - 0 или оба - 1) то результат - 0.
TEST: действует как AND-устанавливает флаги, но не изменяет биты.
Первый операнд в логических командах указывает на один байт или слово в регистре или в памяти и является единственным значением, которое может изменятся после выполнения команд. В следующих командах AND, OR и XOR используются одинаковые битовые значения:
AND OR XOR
0101 0101 0101
0011 0011 0011
Результат: 0001 0111 0110
Для следующих несвязанных примеров, предположим, что AL содержит 1100 0101, а BH содержит 0101 1100:
1. AND AL,BH ;Устанавливает в AL 0100 0100
2. OR BH,AL ;Устанавливает в BH 1101 1101
3. XOR AL,AL ;Устанавливает в AL 0000 0000
4. AND AL,00 ;Устанавливает в AL 0000 0000
5. AND AL,0FH ;Устанавливает в AL 0000 0101
6. OR CL,CL ;Устанавливает флаги SF и ZF
Примеры 3 и 4 демонстрируют способ очистки регистра. В примере 5 обнуляются левые четыре бита регистра AL. Хотя команды сравнения CMP могут быть понятнее, можно применить команду OR для следующих целей:
1. OR CX,CX ;Проверка CX на нуль
JZ ... ;Переход, если нуль
2. OR CX,CX ;Проверка знака в CX
JS ... ;Переход, если отрицательно
Команда TEST действует аналогично команде AND, но устанавливает только флаги, а операнд не изменяется.
Еще одна логическая команда NOT устанавливает обpатное значение бит в байте или в слове, в регистре или в памяти: нули становятся единицами, а единицы - нулями. Если, например, pегистр AL содержит 1100 0101, то команда NOT AL изменяет это значение на 0011 1010. Флаги не меняются. Команда NOT не квивалентна команде NEG, которая меняет значение с положительного на отрицательное и наоборот, посредством замены бит на противоположное значение и прибавления единицы
Ниже приведён пример программы, считающей количество положительных элементов массива. Сегмент данных содержит поле titl с элементами массива. В регистр CX заносится кoличество элементов, а регистр DX обнуляется для счёта положительных элементов. Команда LEA загружает относительный адрес поля titl в регистр BX и использует его для пересылки элементов массива в регистр AL, в котором происходит проверка знака данного элемента массива. Далее выбирается следуюший элемент из поля titl и процедура повторяется. По окончании цикла в регистре DX будет значение положительных элементов массива.
1 0000 wert segment para 'code'
2 assume cs:wert;ss:wert;ds:wert
3 org 100h
4 0100 ad: jmp asd
5 0103 03 05 FE 07 08 0C 01+ titl DB 3,5,-2,7,8,12,1,-3,-9,-18
6 FD F7 EE
7 010D asd proc
8 010D B9 000A mov cx,10 ; счётчик
9 0110 BA 0000 mov dx,0000 ; результат
10 0113 BB 0101г lea bx,titl ; адрес titl в BX
11 0116 BA 07 m1: mov al,[bx] ; 1 элемент в AL
12 0118 0A C0 or al,al ; меньше 0 ?
13 011A 78 01 js m2 ; Да – на m2
14 011C 42 inc dx ; Нет - DX+1
15 011D 43 m2: inc bx ; titl+1(следующий)
16 011E E2 F6 loop m1 ; повторить
17 0120 C3 ret
18 0121 asd endp
19 0121 wert ends
20 end ad