Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторный практикум по ВМСиС.doc
Скачиваний:
25
Добавлен:
05.06.2015
Размер:
2.31 Mб
Скачать

Команды логических операций: and, or, xor, test, not

Логические операции являются важным элементом в проектировании микросхем и имеют много общего в логике программирования. Команды AND, OR, XOR и TEST - являются командами логических операций. Эти команды используются для сброса и установки бит и для арифметических операций (см. лаб. раб. №2). Все эти команды обрабатывают один байт или одно слово в регистре или в памяти, и устанавливают флаги CF, OF, PF, SF, ZF.

Команды AND, ORиXORаналогичны соответствующим командам языка Си: "&", "|" и "^".

TEST: действует как AND - устанавливает флаги, но не изменяет биты операнда.

Первый операнд в логических командах указывает на один байт или слово в регистре или в памяти и является единственным значением, которое может изменяться после выполнения команд.

Для следующих несвязанных примеров, предположим, что 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:

  1. TEST BL,11110000B ; Любой из левых бит в BL JNZ ... ; равен единице?

  2. TEST AL,00000001B ; Регистр AL содержит JNZ ... ; нечетное значение?

  3. TEST DX,0FFH ; Регистр DX содержит JZ ... ; нулевое значение?

Еще одна логическая команда NOT (унарная операция "~" в языке Си) устанавливает обратное значение бит в байте или в слове, в регистре или в памяти: нули становятся единицами, а единицы - нулями. Если, например, регистр AL содержит 1100 0101, то команда NOT AL изменяет это значение на 0011 1010. Флаги не меняются.

Команда NOT не эквивалентна команде NEG, которая меняет значение с положительного на отрицательное и наоборот, посредством замены бит на противоположное значение и прибавления единицы.

Команды сдвига и циклического сдвига

Команды сдвига и циклического сдвига, которые представляют собой часть логических возможностей компьютера, имеют следующие свойства:

  • обрабатывают байт или слово;

  • имеют доступ к регистру или к памяти;

  • сдвигают влево или вправо;

  • сдвигают на величину до 8 бит (для байта) и 16 бит (для слова)

  • сдвигают логически (без знака) или арифметически (со знаком).

Команды сдвига

При выполнении команд сдвига флаг CF всегда содержит значение последнего выдвинутого бита. Существуют следующие команды сдвига:

SHR ;Логический (беззнаковый) сдвиг вправо

SHL ;Логический (беззнаковый) сдвиг влево

SAR ;Арифметический сдвиг вправо

SAL ;Арифметический сдвиг влево

Следующий фрагмент иллюстрирует выполнение команды SHR:

MOV AX,10110111B ; AX=10110111

SHR AX,4 ; 01011011 ;Сдвиг вправо на 4

Команда SHR сдвигает содержимое регистра AX вправо на 4 бит. Обратите внимание, что одна команда SHR AX,4 в отладчике выглядит как последовательность из четырех команд SHR AX,1. Это особенность языка Ассемблер в режиме masm. Выдвинутые в результате сдвига биты по очереди попадают в флаг CF, а самый левый бит регистра AX заполняется нулем.

Рассмотрим действие команд арифметического вправо SAR:

MOV AX,10110111B ; AX=10110111

SAR AX,4 ; 11111011 ;Сдвиг вправо на 4

Команда SAR имеет важное отличие от команды SHR: для заполнения левого бита используется знаковый бит. Таким образом, положительные и отрицательные величины сохраняют свой знак. В приведенном примере знаковый бит содержит единицу.

При сдвигах влево правые биты заполняются нулями. Таким образом, результат команд сдвига SHL и SAL идентичен.

Сдвиг влево часто используется для удваивания чисел, а сдвиг вправо - для деления на 2. Эти операции осуществляются значительно быстрее, чем команды умножения или деления. Деление пополам нечетных чисел дает деление нацело и устанавливает флаг CF в 1. Для проверки бита, занесенного в флаг CF используется команда JC (переход, если есть перенос).