Команды умножения
В отличие от сложения и вычитания, умножение беззнаковых и знаковых чисел осуществляется по разным алгоритмам и, следовательно, разными командами. Операция умножения беззнаковых чисел выполняется командой 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, то старшую часть результата можно отбросить (достаточно младшей части). Если же эти флаги ненулевые, то результат операции вышел за пределы младшей части и нужно учитывать их обе.