Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методические указания для выполнения лабораторных работ / 2-способы определения данных и изучение механизма передачи управления.DOC
Скачиваний:
52
Добавлен:
11.02.2014
Размер:
112.64 Кб
Скачать

Команды логических операций

Логические операции являются важным элементом в проектировании микросхем и имеют много общего в логике программирования. Команды 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