Микропроцессор 8088 значительно мощнее предшествовавших ему 8-битовых устройств. Одна из причин увеличения мощности - добавление команд умножения и деления к набору команд микропроцессора. В прежних микропроцессорах выполнение операций умножения и деления требовало вызова подпрограмм на языке ассемблера.
Существует две команды умножения. Покоманде MUL умножаются два целых числа без знака и дает результат без знака. По команде IMUL умножаются целые числа со знаком. При умножении целых чисел в качестве операндов используются числа, представленные в дополнительном коде и получается результат, имеющий правильный знак и значение.
Обе команды умножения работают как с байтами, так и со словами. Однако диапазон форм представления операндов гораздо уже, чем для команд сложения и вычитания. Фиг. 4.13 иллюстрирует варианты команды умножения. Чтобы умножить 8 бит на 8 бит, один из операндов должен быть в регистре AL, а результат всегда оказывается в регистре AX. Результат может иметь длину вплоть до 16 бит (максимальное получаемое значение равно 255 * 255 = 65025). Чтобы умножить 16 бит на 16 бит, один из операндов нужно поместить в регистр AX. Результат, который может быть длиной до 32 бит (максимальное значение 65535 * 65535 < 2+32) помещается в пару регистров; в регистре DX содержатся старшие 16 бит результата, а в регистре AX - младшие 16 бит. Умножение не допускает непосредственного операнда.
Установка флагов командой умножения несколько отличается от других арифметических команд. Единственные имеющие смысл два флага - это флаги переноса и переполнения, и они по-разному устанавливаются двумя командами.
Команда умножения без знака MUL устанавливает оба флага, если старшая половина резул в регистре AL получится 2AH; команда AAM преобразует этот результат, оставляя в регистре AH число 04H, и 02H в регистре AL - или распакованное десятичное число 42 в паре регистров AH:AL.
| 1 операнд | 2 операнд | Результат |
|---|---|---|
| (a) Умножение слов | ||
| AX | AX, BX, CX, DX | DX:AX |
| AX | SI, DI, BP, SP | DX:AX |
| AX | Память (слова) | DX:AX |
| (b) Умножение байт | ||
| AL | AH, AL, BH, BL, CH, CL, DH, DL | AH:AL |
| AL | Память (байты) | AH:AL |
Фиг. 4.13 Операции умножения
Целое умножение со знаком (IMUL) устанавливает флаги переноса и переполнения в соответствии с тем же критерием, т.е. эти флаги устанавливаются в случае, когда результат не может быть представлен только своей младшей половиной. Однако, поскольку число имеет знак, то задача не сводится только к сравнению старшей половины результата с нулем. Команда IMUL устанавливает флаги, если старшая половина результата не является распространением знака младшей. Это значит, что в случае положительного результата проверка будет такой же, как для команды MUL - установка флага происходит при ненулевой старшей половине результата (но самый старший бит равен нулю, указывая на положительность результата). В случае отрицательного результата IMUL устанавливает флаги, если старшая половина результата состоит не только из едениц (но старший бит равен 1, указывая на отрицательность результата). Например, перемножение байтов с отрицательным результатом устанавливает флаги когда результат менше -128 - наименьшего числа, представимого в одном байте. Другой пример, перемножение слов с положительным результатом, устанавливает флаги, если результат превышает 32 767 - наиболшее представимое одним словом число.