ХАНДЫФАР

Знаковое умножение


_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. Результат сохранится в первом операнде.


  1. title Автор: Довгополов Евгений Сергеевич
  2. .286C
  3. .model small
  4. .stack 100h
  5. code segment public _______; Начало сегмента кода
  6. ____assume cs:code
  7. ____main proc _____________; Начало процедуры main
  8. ________mov_____ax, -2_____; Копируем значение -2 в регистр ax
  9. ________mov_____bx, 4______; Копируем значение 4 в регистр bx
  10. ________imul____bx_________; Выполняем знаковое умножение ax на bx
  11. ________mov_____ax, 5______; Копируем значение 5 в регистр ax
  12. ________imul____bx, ax, 2__; Выполняем знаковое умножение ax на 2. Результат в bx
  13. ________mov_____ax, 4C00h__; Копируем значение функции завершения процесса в ah а значение в al
  14. ________int_____21h _______; Вызываем прерывание DOS
  15. ____main endp _____________; Конец процедуры main
  16. code ends _________________; Конец сегмента кода
  17. end main __________________; Конец файла. Точкой входа указывается процедура main
Made on
Tilda