- •3.11.1 Команды пересылки данных
- •Команды пересылки общего назначения
- •Xchg приемник, источник
- •Команды загрузки адресных значений
- •Команды обращения к стеку
- •Команды пересылки флагов
- •Команды ввода/вывода
- •In аккумулятор, порт
- •In аккумулятор, dx.
- •3.11.2. Арифметические команды
- •Типы арифметических данных
- •Команды инкрементирования и декрементирования
- •Inc приемник
- •Команды сложения и вычитания
- •Команды расширения знака
- •Команды умножения и деления
- •Imul источник.
- •Команды десятичной коррекции
- •Сложение в bdc-формате
- •Вычитание в bcd-формате
- •Сложение в ascii-формате
- •Вычитание в ascii-формате
- •Умножение в ascii-формате
- •Деление в ascii-формате
- •3.11.3 Логические команды
- •Команды логических операций
- •Команды сравнения
- •Команды сдвигов
- •Команды логических сдвигов
- •Команды арифметических сдвигов
- •Команды циклических сдвигов
- •3.11.4. Команды передачи управления
- •Команды безусловных переходов
- •Команды условных переходов
- •Команды перехода по состоянию арифметических флагов
- •Команды перехода по соотношению между числами
- •Команды перехода по состоянию регистра cx
- •Команды управления циклами
- •Команды для организации подпрограмм
- •Команды прерываний
- •3.11.5. Команды обработки строк
- •Строковые примитивы
3.11.3 Логические команды
Логические команды предназначены для побитовой обработки данных. Их можно разделить на следующие подгруппы:
1)команды логических операций;
2)команды сравнения;
3)команды сдвигов.
Команды логических операций
К этой подгруппе относятся команды AND, OR, XOR и NOT, реализующие поразрядные логические операции над операндами.Первые три команды записываются в формате:
AND приемник, источник
OR приемник, источник
XOR приемник, источник
и выполняют соответственно операции "логическое И", "логическое ИЛИ" и "исключающее ИЛИ" над соответствующими битами операндов приемника и источника. Результаты исполнения этих команд для однобитных операндов приведены в табл. 3.2.
Таблица 3.2
Таблица истинности команд AND, OR, XOR
-
Операнды
Результат
Приемник
Источник
AND
OR
XOR
0
0
0
0
0
0
1
0
1
1
1
0
0
1
1
1
1
1
1
0
Операндами команд AND, OR и XOR могут быть байты или слова. В качестве приемника и источника данных могут использоваться регистры МП или регистр и ячейка памяти. Кроме того, источник может быть и непосредственным значением.
Команда конъюнкции AND используется для сброса битов операндаприемника. После выполнения этой команды сбрасываются те биты, которым в операндеисточнике соответствуют 0. Команда AND, как правило, применяется для выделения указанных полей операндаприемника. Выделяемые поля указываются значениями битов операндаисточника, называемого маской. Маска должна содержать единицы в разрядах, соответствующих выделяемым полям, и нули во всех остальных. После выполнения команды AND выделяемые поля приемника сохраняют свое значение, а все остальные обращаются в нуль.
Пример 3.78:
AND AX, DX ;Логическое И над двумя регистрами
AND AL, MemByte ;или регистром и ячейкой памяти
AND [BX], DX
AND AL, 00001111b ;Выделение младшей тетрады регистра AL
Команда дизъюнкции OR предназначена для объединения полей операндов приемника и источника. После выполнения этой команды те биты операндаприемника, в которых хотя бы один из операндов содержит 1, устанавливаются в 1. Команда OR обычно используется для установки указанных полей операндаприемника. Устанавливаемые поля указываются значениями битов операнда источника (маски). Маска должна содержать единицы в разрядах, соответствующих устанавливаемым полям, и нули во всех остальных. После выполнения команды OR устанавливаемые поля приемника имеют единичное значение, а все остальные не изменяются.
Пример 3.79:
OR AL, DL ;Объединение двух регистров
OR Table[SI], DX ;или регистра и ячейки памяти
OR AX, 8000H ;Установка разряда D15 регистра AX в 1
Пример 3.80:
Переключить МП в режим трассировки и обратно.
Эта задача решается путем установки и сброса флага трассировки TF. Это реализуется через память с помощью команд AND или OR с соответствующей маской :
; Включение режима трассировки
PUSHF ; Запись в стек регистра флагов
MOV BP, SP ; Настройка адреса на верхушку стека
OR WORD PTR [BP], 100h ; Установка флага TF
POPF ; Загрузка регистра флагов
. . . . . . . . . . . . .
; Выключение режима трассировки
. . . . . . . . . . . . .
AND WORD PTR [BP], 0FEFFh ; Сброс флага TF
Команда XOR служит для инвертирования указанных полей операнда-приемника. Инвертируемые поля указываются значениями битов операнда-источника (маски). Маска должна содержать единицы в разрядах, соответствующих инвертируемым полям, и нули во всех остальных. После выполнения этой команды инвертируемые поля изменяют свое значение на противоположное, а все остальные не изменяются.
Кроме того, команда XOR используется, если необходимо определить, в каких битах значения операндов не совпадают. После ее выполнения в разрядах, в которых биты операндов не совпадают, устанавливаются единицы, а во всех остальных нули.
Команда XOR часто применяется для очистки регистров. В этом случае в качестве приемника и источника используется один и тот же регистр.
Команда XOR используется и для правильного формирования флага четности PF при необходимости характеристики слова или более длинных элементов данных. Это достигается путем выполнения этой команды по отношению к младшему и старшему байтам контролируемого слова. При этом из слова попарно удаляются единицы, совпадающие в разрядах составляющих его байтов, что не влияет на признак четности, но сводит слово к байту, который правильно характеризуется флагом PF.
Пример 3.81:
XOR AX, 8000h ;Инвертирование разряда D15 регистра AX
XOR AX, DX ;Выявление несовпадающих значений в ;битах регистров
XOR DX, [BX+SI] ;или регистра и ячейки памяти
XOR MemByte, AL
XOR AX, AX ;Очистка регистра AX
XOR AL, AH ;Формирование флага PF для слова из AX
Команды AND, OR и XOR правильно формируют флаги SF, ZF, PF и сбрасывают флаги OF=CF=0.
Команда отрицания NOT записывается в формате:
NOT приемник
и осуществляет инвертирование каждого бита операндаприемника. В качестве приемника могут использоваться 8-битные или 16-битные регистры или ячейки памяти. Команда NOT не изменяет значения флагов.
Пример 3.82:
NOT AX ; Инвертирование регистра
NOT BYTE PTR [BX+2] ; или ячейки памяти