Умножение двух однобайтовых чисел может дать произведение длиной в слово. Аналогично умножение двух слов может дать результат длиной в двойное слово, а умножение двух двойных слов может дать результат длиной в учетверенное слово. Приведенный пример иллюстрирует данное утверждение.
8 бит
´
8 бит
16 бит
При умножении двух байтов командой MUL произведение будет находиться в регистрах AH (старший байт) и AL (младший байт), при умножении двух слов произведение будет находиться в регистрах DX (старшее слово) и AX (младшее слово), , а при умножении двух двойных слов произведение будет находиться в регистрах EDX и EAX.
Команда деления DIV делит 16-битовое число из регистра AX (или 32-битное число из регистров DX и AX, или 64-битное число из регистров EDX, EAX) на операнд половинного размера, определяемый в команде. Частное помещается в регистр AL (AX, EAX), а остаток в AH (DX, EDX). Для знаковых чисел требуются специальные команды умножения и деления (IMUL и IDIV).
Форматы команд умножения и деления приведены в таблице 2.8:
Таблица 2.8. Общие форматы команд умножения и деления.
Операнд
Слово
Байт
AX (AL) с регистром
КОП BX
КОП CL
AX (AL) с памятью
КОП MEMW
КОП MEMB
КОП: MUL, IMUL, DIV, IDIV.
В микропроцессоре 80286 команда IMUL имеет ещё один дополнительный формат: разрешается определить множитель как непосредственный операнд. При этом множимое не обязательно должно быть в регистре AX (AL), а может находиться в любом шестнадцатиразрядном регистре или 16-битной ячейке памяти. Результат длиной только 16 бит допускается разместить в любом шестнадцатиразрядном регистре.
Примеры:
Слово в регистре IMUL DX, BX, 115; BX * 115 DX
Слово в памяти IMUL CX, MEMW, 632; MEMW * 632 CX
Начиная с микропроцессора 80386 добавляются следующие форматы команды IMUL:
Двухоперандные:
IMUL reg16, imn 8;
IMUL reg16, imn 16;
IMUL reg 32, imn 8;
IMUL reg 32, imn 32;
IMUL reg16, reg/ mem 16.
Cтаршая часть произведения теряется.
Трехоперандные:
IMUL reg 16, reg/ mem 16, imn 8/ 16;
IMUL reg 32, reg/ mem 32, imn 8/ 32.
Cтаршая часть произведения теряется.
Однооперандные:
Второй операнд и приемник в регистрах AL, AX, EAX.
IMUL reg/ mem (8/ 16/ 32-бита)
Команды умножения и деления действуют так, чтобы результат двойной длины при умножении можно было использовать в последующем делении. Если требуется поделить два числа одинакового размера, то в этом случае необходимо искусственно увеличить размер делимого. Если число без знака, то можно просто обнулить содержимое регистра AH, а если число со знаком, то 8-битное число должно быть преобразовано в 16-битное, 16-битное - в 32-битное и 32-битное в 64-битное. Для проведения операций расширения знака числа в микропроцессоре существуют специальные команды: CBW , CWD, CWDE, CDQ.