Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции / СПО2.doc
Скачиваний:
114
Добавлен:
11.02.2014
Размер:
527.87 Кб
Скачать

Операция умножения

Операция умножения для беззнаковых данных выполняется командой MUL, для знаковых – IMUL.

Существует два вида умножения:

  1. множимое находится в регистре АL, а множитель в памяти или в регистре. После умножения произведение находится в регистре АХ. Операция игнорирует и стирает любые данные, которые находятся в регистре АН.

  2. множимое находится в регистре АХ, а множитель в памяти или регистре. После умножения произведение находится в двух регистрах : старшая (левая) часть произведения в регистре DХ, а меньшая (правая) – в регистре АХ. Операция игнорирует и стирает любые данные, которые были в регистре DX.

В единственном операнде команды MUL и IMUL указывается множитель: MUL WERT.

Если поле WERT определено, как байт (DB) – то операция предполагает произведение содержимого AL на значение байта из поля WERT. Если множитель находится в регистре, то длина регистра определяет тип операции, как показано ниже:

MUL CL множимое в AL, произведение в AX

MUL BX множимое в AX, произведение в DX:AX

WERT 1 DW 8000h

WERT 2 DB 40h

Mov AL, 80h произведение 80h * 40h=2000h в АХ

MUL WERT 2

Mov AX, 2000h произведение 2000h * 8000h в DX:AX

MUL WERT 1

Mov AL, 80h произведение 80h * 40h=Е000h в АХ

IMUL WERT 2

Mov AX, 2000h произведение 80h * 40h=2000h в DX:AX

IMUL WERT 1

Первый пример команды MUL перемножает 80h (128) на 40h (64), произведение 2000h (8192) получается в регистре АХ. Второй пример этой команды генерирует 10000000h в регистрах DX:АХ.

Первый пример команды IMUL перемножает 80h (отрицательное число) на 40h (положительное число), произведение Е000h получается в регистре АХ. Используя те же данные, команда MUL дает в результате 2000. Очевидна разница в использовании команд MUL и IMUL . Команда MUL рассматривает 80h как +128 , а команда IMUL – как -128.

Второй пример аналогичен первому.

Т. обр. если множимое и множитель имеют одинаковый знаковый бит, то команда MUL и IMUL генерируют одинаковый результат, в противном случае, команда MUL вырабатывает положительный результат умножения, команда IMUL – отрицательный.

При умножении на степень числа 2 (2, 4, 8 и т.д.) более эффективен сдвиг влево на требуемое число битов. Сдвиг более чем на 1 требует загрузки счетчика сдвига в регистр СL.

ПРИМЕР, предположим, что множимое находится в регистре AL или AX:

SHL AL, 1 умножение на2

Mov CL, 3 умножение на 8

SHL AX, CL

Для знаковых полей лучше использовать команду SAL.

Операция деления

Операция деления для беззнаковых данных выполняется командой DIV, а для беззнаковых – IDIV. Ответственность за подбор подходящей команды лежит на программисте.

Аналогично умножению существует два вида деления:

  1. делимое находится в регистре АХ, а делитель в памяти или в регистре. После деления остаток получается в регистре АН, а частное – в АL.

  2. делимое находится в регистровой паре DX:АХ, а делитель в памяти или в регистре. После деления остаток получается в регистре DX, а частное – в AX.

В единственном операнде команд DIV и IDIV указывается делитель.

ПРИМЕР.

BET 1 DB 80h

WERT 1 DW 2000h

WERT 2 DW 1000h

Mov AX, WERT 1 слово / байт

DIV BET 1 остаток: частное в AH: AL

Mov DX, 0010h двойное слово / слово

Mov AX: 1000h делимое в DX: AX

DIV WERT 1 остаток: частное в DX:AX

Mov AX, WERT 1 слово / слово

SUB AX, WERT 1 расширение WERT 1 до двойного слова в регистровой

паре DX:AX

DIV WERT 2 остаток : частное в DX:AX

Команда DIV делит беззнаковые числа. Первый пример команды DIV делит 2000h (8092) на 80h (128). В результате остаток 00 получается в регистре АН, а частное 40h (64) – в регистре AL. Второй пример генерирует остаток 1000h в регистре DX и частное 0080h в регистре АХ. В третьем примере команда DIV сначала выполняет расширение слова WERT 1 до двойного слова в регистровой паре DX:AX. После деления остаток 0000h получается в регистре DX, а частное 0002h – в регистре AX.

Команда IDIV выполняет деление знаковых чисел. Если в примере вместо команды DIV записать команду IDIV, то первый пример делит 2000h (положительное число) на 80h (отрицательное число). Остаток от деления получается в регистре АН, а частное 0C0h (-64) – в регистре AL.

Т.обр., если делимое и делитель имеют одинаковый знаковый бит, то команды DIV и IDIV генерируют одинаковый результат. Но если имеют разные знаковые биты, то команда DIV генерирует положительное число, а команда IDIV – отрицательное.

Для более эффективного деления на степень двойки лучше использовать команду SHR сдвига вправо для беззнаковых полей и команду SAR – для знаковых.

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

НАПРИМЕР: NEG AX

NEG BL

NEG WERT 1

Соседние файлы в папке лекции