Для умножения чисел используются -команды IMUL и MUL. команда IMUL выполняет умножение чисел в знаковом представлении (в дополнительном коде), а команда MUL — умножение чисел в беззнаковом представлении. Для деления чисел пользуются команды IDIV и DIV. Команда IDIV выполняет деление чисел в знаковом представлении, а команда DIV — в беззнаковом. Команды деления и умножения допускают следующие сочетания операндов:
Команды умножения требуют, чтобы один из сомножителей находился в регистре-аккумуляторе (в AL — для 8-битовых чисел, в АХ — для 16-битовых). Другой сомножитель явно задается в команде в виде регистра или адресуемой ячейки памяти. Произведение имеет удвоенную разрядность и располагается для 8-битовых операндов — в регистре АХ, для 1.6-битовых — в паре регистров DX:AX, причем старшее слово находится в регистре DX. Если в знаковом умножении старший байт (слово) результата не является расширением знака младшего байта (слова), то устанавливаются флаги CF и OF. В беззнаковом умножении флаги CF и OF устанавливаются в 1, если в произведении получен не нулевой старший байт (слово). Таким образом неравенство нулю признаков переноса и переполнения после выполнения команд умножения сигнализирует о невозможности представлений результата в разрядности исходных операндов. Состояние остальных флагов не определено. Перед выполнением деления делимое двойной разрядности заносится в неявно задаваемый регистр АХ при делении на 8-битовый операнд, или в пару регистров DX:AX (старшее слово в DX) при делении на 16-битовый операнд. Результатом деления являются два числа: частное, которое располагается в аккумуляторе (в AL или АХ), и остаток от деления — в АН или DX. Знак остатка от деления совпадает со знаком делимого. Команды деления дают неопределенное состояние признаков результата и после этих команд команды условных переходов не используются. Примеры кодирования и использования команд деления и умножения приведены на рис. 3.9
