- •Лабораторная работа №1. Использование арифметических и логических команд процессора при составлении программ на языке ассемблера
- •2.1.2 Команды вычитания
- •2.1.3 Использование команд neg и cmp
- •2.1.4 Умножение и деление беззнаковых чисел
- •Программа 2.2. Muldiv.Asm
- •2.1.5 Умножение и деление знаковых значений
- •2.2 Логические команды процессора
- •2.2.1 Логические операторы
- •2.2.2 Сдвиги битов
2.1.5 Умножение и деление знаковых значений
Команды знакового умножения imul и деления idiv работают аналогично и используют те же регистры, что и mul и div. Отличие состоит в допустимых диапазонах значений:
Знаковый байт изменяется от -128 до +127
Знаковое слово изменяется от -32768 до +32767
Необходимо помнить, что отрицательный результат представляется в двоичном дополнительном коде. Любой остаток (ah—для 8-битового деления и dx—для деления слов) имеет тот же знак, что и частное. При попытке выполнить деление на 0 или если результат от деления не будет помещаться в заданный операнд-назначение, то будет генерироваться прерывание деления на 0, останавливающее программу. При использовании знаковых двоичных значений часто необходимо преобразовать 8-битовые значения байтов в 16-битовые слова, в частности при подготовке к умножению или делению. Значение может быть отрицательным числом, представленным в дополнительном коде, поэтому выполнять такие преобразования достаточно сложно, поскольку необходимо сохранять как первоначальное значение, так и его знак. Для упрощения этих операций используют команды cbw (преобразовать байт в слово) и cwd (преобразовать слово в двойное слово).
mov al, [sourceB] ; Загружает исходный байт в al
cbw ; Размножает знаковый бит по всему ax
mov ax, [sourceW] ; Загружает исходное слово в ax
cwd ; Дублирует знаковый бит ax через dx
Исходное значение для cbw должно содержаться в регистре al. 16-битовый результат всегда помещается в ax. Начальное значение для cwd должно храниться в регистре ax. 32-битовый результат всегда помещается в dx и ax.
2.2 Логические команды процессора
В табл. 2.2 представлены логические команды процессора.
Логические команды позволяют создавать выражения, объединяющие байты и слова с and, or и другими логическими операторами. Команды сдвига/ротации выполняют сдвиг и ротацию в байтах и словах. Простейшая команда not изменяет в байтах и словах значение битов с нулей на единицы и с единиц на нули. Одно из применений оператора not состоит в переключении между истинным и ложным значениями. Если ложь представляется нулевым значением, а ненулевое значение означает истину, тогда следующие команды переводят регистр dx из состояния «истина» в состояние «ложь» и затем снова возвращают в состояние «истина»:
mov dh, -1 ; Присвоить dh истинное значение (не нуль)
not dh ; Присвоить dh значение ложь
not dh ; Присвоить значение истина
2.2.1 Логические операторы
Логические операторы and, or и xor позволяют манипулировать отдельными битами в двоичных величинах. Позволяют устанавливать или сбрасывать единичные биты без влияния на другие, выделять из байта или слова один или несколько битов и выполнять другие операции.
And часто применяется для маскирования (выделения) битов в байтах и словах. Изучив табл. 2.3., можно увидеть, что a и с одновременно равны 1 только в том случае, если значение b равно 1. Это позволяет создавать фильтры для извлечения битов из байтов:
Таблица 2.3
Команда not инвертирует состояние каждого бита и не на какие флаги не воздействует.
Команда test аналогична and, отличие заключается в том, что она не сохраняет результат, однако изменяет содержимое флагов. Обнуляет CF и OF, изменяет PF, ZF, и SF, а флаг AF оставляет неопределенным.
