Мультипликативные команды

Опубликовано в Архитектура процессора Intel

Мультипликативные команды разделяются на два вида: беззнаковые и знаковые, что объясняется различием алгоритмов умножения и деления для беззнаковых и знаковых целых чисел.

Мультипликативные команды в ассемблерной нотации представляются в виде: CODE src.

В командах задается единственный операнд (источник), т.к. другой операнд (приемник) использует неявную адресацию аккумулятора (аккумуляторные команды). Операнд-источник может адресовать регистр или память.

В командах умножения (MUL / IMUL) результат операции представляется в удвоенном формате по сравнению с форматом операнда в соответствии с таблицей ниже.

Мультипликативные команды

MUL (unsigned integer MULtiply of AL register or AX register) — беззнаковое умножение целых чисел.

1MUL (signed integer MULtiply) — знаковое умножение целых чисел.

Обе команды производят умножение содержимого аккумулятора (множимого) на операнд-источник (множитель). Если операнд-источник имеет размер 8 бит, в качестве аккумулятора берется регистр AL, и результат помещается в АХ. При размере операнда-источника в 16 бит в качестве аккумулятора используется АХ, и результат помещается в пару регистров DX.AX (в DX — старшие разряды произведения, в АХ — младшие).

Примеры:

  • MUL СН — беззнаковое умножение AL на СН;
  • IMUL ВХ — знаковое умножение АХ на ВХ.

Отличие команд MUL и IMUL состоит в интерпретации операндов и результата как беззнаковых целых чисел (команда MUL) или знаковых целых чисел (команда IMUL).

Так, например, если в качестве байтных операндов используются значения FF16 и 0216 то результат их умножения командой MUL даст значение 01FE16, а командой IMUL — значение FFFE16. Первый результат: 255 * 2 = 510, а второй: (-1) * (+2) = -2.

О возможности представления произведения в том же формате, что и сомножители свидетельствуют флаги CF и OF, устанавливающиеся одинаково. Для беззнакового умножения (MUL) эти флаги сбрасываются, если старшая половина произведения равна пулю, в противном случае флаги устанавливаются. Для знакового умножения (IMUL) флаги сбрасываются, если старшая половина произведения является полной копией знакового разряда младшей половины, в противном случае они устанавливаются.

Для рассмотренного выше примера операндов FF16 и 0216 по результату команды MUL флаги CF и OF устанавливаются, а по результату команды IMUL — сбрасываются.

Остальные арифметические флаги принимают неопределенное значение, в связи с чем условные переходы после умножения по знаку результата или его нулевому значению делать нельзя.