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

В отличие от сложения и вычитания, умножение беззнаковых и знаковых чисел осуществляется по разным алгоритмам и, следовательно, разными командами. Операция умножения беззнаковых чисел выполняется командой MUL (от англ. MULtiply – умножить), а знаковых – IMUL (от англ. Integer MULtiply – умножить целые числа). Формат этих команд показан на рис.10.3.

 

Рис. 10.3. Формат команд MUL и IMUL

 

Единственным операндом этих команд является один из сомножителей, который может находиться в регистре или в памяти и не может быть непосредственным операндом. Местоположение второго сомножителя, а также результата фиксировано и зависит от размера сомножителей. Причем в общем случае под результат отводится в два раза больше места, чем под сомножители.

Расположение операндов и результата при умножении приведено в табл.10.1.

Таблица 10.1. Расположение операндов и результата при умножении

Первый сомножитель Второй сомножитель Результат
Байт AL 16 бит в регистре AX: AL – младшая часть результата; AH – старшая часть результата
Слово AX 32 бита в паре регистров DX и AX: AX – младшая часть результата; DX – старшая часть результата

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

perem DB 5

MOV AL,3

MUL perem; AH = 00H, AL = 0FH

MOV AL,60

MUL perem; AH = 01H, AL = 2CH

MOV AX,6

MOV BX,-1

IMUL BX; DX = FFFFH, AX = FFFAH

 

Как следует из этих примеров, не всегда величина произведения столь велика, что для нее требуется удвоенный размер. Для определения размера результата в программе можно использовать флаги переноса CF и переполнения OF. Если после операции произведения CF = 0 и OF = 0, то старшую часть результата можно отбросить (достаточно младшей части). Если же эти флаги ненулевые, то результат операции вышел за пределы младшей части и нужно учитывать их обе.