- •Содержание
- •Преобразование чисел
- •Целые числа
- •Дробные числа
- •Содержание отчета
- •Контрольные вопросы
- •Задание на занятие
- •Лабораторная работа №2
- •Объединение со структурой с битовыми полями в языке Си.
- •Содержание отчета
- •Контрольные вопросы
- •Задание на занятие
- •Лабораторная работа №3
- •Содержание отчета
- •Контрольные вопросы
- •Задание на занятие
- •Лабораторная работа №4
- •Содержание отчета
- •Контрольные вопросы
- •Задание на занятие
- •Лабораторная работа №5
- •Содержание отчета
- •Контрольные вопросы
- •Задание на занятие
- •Лабораторная работа №6
- •Программирование на ассемблере
- •Основные команды ассемблера
- •Директивы
- •Программные прерывания
- •Отладка программ
- •Содержание отчета
- •Контрольные вопросы
- •Задание на занятие
- •Лабораторная работа №7
- •Команда jmp
- •Команда Loop
- •Флаговый регистр (flags)
- •Команды условного перехода
- •Знаковые и беззнаковые данные
- •Команды логических операций: and, or, xor, test, not
- •Команды сдвига и циклического сдвига
- •Команды сдвига
- •Команды циклического сдвига
- •Содержание отчета
- •Контрольные вопросы
- •Задание на занятие
- •Литература
Команды логических операций: 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:
AND AL,BH ;Устанавливает в AL 0100 0100
OR BH,AL ;Устанавливает в BH 1101 1101
XOR AL,AL ;Устанавливает в AL 0000 0000
AND AL,00 ;Устанавливает в AL 0000 0000
AND AL,0FH ;Устанавливает в AL 0000 0101
OR CL,CL ;Устанавливает флаги SF и ZF
Примеры 3 и 4 демонстрируют способ очистки регистра. В примере 5 обнуляются левые четыре бита регистра AL. Хотя команды сравнения CMP могут быть понятнее, можно применить команду OR для следующих целей:
OR CX,CX ;Проверка CX на нуль JZ ... ;Переход, если нуль
OR CX,CX ;Проверка знака в CX JS ... ;Переход, если отрицательно
Ниже приведено несколько примеров для команды TEST:
TEST BL,11110000B ; Любой из левых бит в BL JNZ ... ; равен единице?
TEST AL,00000001B ; Регистр AL содержит JNZ ... ; нечетное значение?
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 (переход, если есть перенос).