Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методические указания для выполнения лабораторных работ / 1-сложения, вычитания, умножения и деления двоичных чисел.DOC
Скачиваний:
72
Добавлен:
11.02.2014
Размер:
78.85 Кб
Скачать

Беззнаковые Знаковые

11111001 249 -7

+00000010 +2 +2

11111011 251 -5

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

  1. Множимое находится в регистре AL, а множитель в памяти или регистре. После умножения произведение находится в регистре AX. Операция игнорирует и стирает любые данные, которые находились в регистре AH.

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

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

MUL WERT

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

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

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

—————————————————————————————————

WERT1 DW 8000H

WERT2 DB 40H

—————————————————————————————————

MOV AL, 80H ; произведение 80Н*40Н=2000H в AX

MUL WERT2 ;

MOV AX, 2000H ; произведение 2000Н*8000Н вDX:AX

MUL WERT1 ;

MOV AL, 80H ; произведение 80Н*40=E000Н в AX

IMUL WERT2 ;

MOV AX, 2000H ; произведение 2000Н*8000Н вDX:AX

IMUL WERT1 ;

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

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

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

При умножении на степень числа 2 (2, 4, 8 и т. д.) более эффективен сдвиг влево на требуемое число битов. Сдвиг более чем на 1 требует загрузки счётчика сдвига в регистр CL. В следующих примерах предположим, что множимое находится в регистре AL или AX :

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

SHR AL, 1 ; деление на 2

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

SHL AX, CL

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

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

  1. Делимое находится в регистре AX, а делитель – в памяти или регистре. После деления остаток получается в регистре AH, а частное – в AL.

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

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

–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––

BET1 DB 80H

WERT1 DW 2000H

WERT2 DW 1000H

———————————————————————————————— MOV AX, WERT1 ; слово / байт

DIV BET1 ; остаток:частное в AH:AL

MOV DX, 0010H ; двойное слово / слово

MOV AX, 1000H ; делимое в DX:AX

DIV WERT1 ; остаток:частное в DX:AX

MOV AX, WERT1 ; слово / слово

SUB DX, DX ;расширение WERT1 до двойного слова в