ХАНДЫФАР
Знаковое умножение
_IMUL reg/mem8 - AX := AL ∗ reg/mem8.
_IMUL reg/mem16 - DX:AX := AX ∗ reg/mem16.
_IMUL reg16, reg16/mem16, imm8 - Умножает reg16/mem16 на imm8 и сохраняет результат в reg16. (186/286C)
Умножает содержимое указанного регистра или ячейки памяти на регистр al (8-разрядная операция) или ax (16-разрядная операция), рассматривая оба операнда как двоичные числа со знаком, т.е. выполняет умножение со знаком. Если выполняется 8-разрядная операция, 8 младших разрядов результата будут сохранены в регистре al, 8 старших разрядов результата будут сохранены в регистре ah. Если выполняется 16-разрядная операция, младшие 16 бит результата сохраняются в регистре ax, старшие 16 бит результата сохраняются в регистре dx. В любом случае, если старшая половина результата является расширением знака младшей половины результата, то флаги переполнения и переноса устанавливаются в 0, в противном случае они устанавливаются в 1. (Например, если выполняется 8-разрядная операция, если возвращаемое значение если регистр ah не равен 0016 или FF16, то флаги переноса и переполнения будут равны 1.) Значения статуса 0 означают, что ah или dx содержат значащие цифры.
В этой форме требуется операнд назначения (первый операнд) и два операнда источника (второй и третий операнды). Здесь первый операнд источника (который может быть регистром общего назначения или ячейкой памяти) умножается на второй операнд источника (непосредственное значение). Промежуточное произведение (в два раза больше первого операнда источника) усекается и сохраняется в операнде назначения (регистре общего назначения).
Когда в качестве операнда используется непосредственное значение, оно расширяется до длины формата операнда назначения.
Флаги CF и OF устанавливаются, когда значащие биты переносятся в верхнюю половину результата, и сбрасываются, когда результат точно вписывается в нижнюю половину результата. Флаги SF, ZF, AF и PF не определены.
В качестве примера рассмотрим случай, когда регистр ax содержит -210, (FFFE16), регистр bx содержит 410 (000416). После выполнения инструкции imul bx регистр ax будет содержать -810, (FFF816), регистр dx будет содержать -110, (FFFF16). Затем мы воспользуемся инструкцией с тремя операндами для умножения 510 на 210. Результат сохранится в первом операнде.