Команды умножения и деления.

Умножение двух однобайтовых чисел может дать произведение длиной в слово. Аналогично умножение двух слов может дать результат длиной в двойное слово, а умножение двух двойных слов может дать результат длиной в учетверенное слово. Приведенный пример иллюстрирует данное утверждение.

                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.