Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лр_1_ЭВМ и ПУ.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
238.08 Кб
Скачать

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 оставляет неопределенным.