Справочник по языку Ассемблера IBM PC

       

IMUL


(Integer MULtiply)

Умножение целочисленное со знаком

Схема команды:  imul множитель_1 
imul множ_1,множ_2 
imul рез-т,множ_1,множ_2

Назначение: операция умножения двух целочисленных двоичных значений со знаком.


Алгоритм работы:


Алгоритм работы команды зависит от используемой формы команды. Форма команды с одним операндом требует явного указания местоположения только одного сомножителя, который может быть расположен в ячейке памяти или регистре. Местоположение второго сомножителя фиксировано и зависит от размера первого сомножителя:

если операнд, указанный в команде, — байт, то второй сомножитель располагается в al;

если операнд, указанный в команде, — слово, то второй сомножитель располагается в ax;



если операнд, указанный в команде, — двойное слово, то второй сомножитель располагается в eax.

Результат умножения для команды с одним операндом также помещается в строго определенное место, определяемое размером сомножителей:

при умножении байтов результат помещается в ax;

при умножении слов результат помещается в пару dx:ax;

при умножении двойных слов результат помещается в пару edx:eax.

Команды с двумя и тремя операндами однозначно определяют расположение результата и сомножителей следующим образом:

в команде с двумя операндами первый операнд определяет местоположение первого сомножителя. На его место впоследствии будет записан результат. Второй операнд определяет местоположение второго сомножителя;

в команде с тремя операндами первый операнд определяет местоположение результата, второй операнд — местоположение первого сомножителя, третий операнд может быть непосредственно заданным значением размером в байт, слово или двойное слово.

Состояние флагов после выполнения команды:

11 07 06 04 02 00
OF SF ZF AF PF CF
r ? ? ? r

Команда imul устанавливает в ноль флаги of и cf, если размер результата соответствует регистру назначения. Если эти флаги отличны от нуля, то это означает, что результат слишком велик для отведенных ему регистром назначения рамок и необходимо указать больший по размеру регистр для успешного завершения данной операции умножения. Конкретными условиями сброса флагов of и cf в ноль являются следующие условия:


для однооперандной формы команды imul регистры ax/dx/edx являются знаковыми расширениями регистров al/ax/eax;

для двухоперандной формы команды imul для размещения результата умножения достаточно размерности указанных регистров назначения r16/r32;

то же для трехоперандной команды умножения.

Применение:

Команда выполняет целочисленное умножение операндов с учетом их знаковых разрядов. Для выполнения этой операции необходимо наличие двух сомножителей. Размещение и задание их местоположения в команде зависит от формы применяемой команды умножения, которая, в свою очередь, определяется моделью микропроцессора. Так, для микропроцессора i8086 возможна только однооперандная форма команды, для последующих моделей микропроцессоров дополнительно можно использовать двух- и трехоперандные формы этой команды.

.486 ...         mov     bx,186         imul    eax,bx,8 ;если результату не хватило размерности операнда1, ;то перейдем на m1, где скорректируем ситуацию:         jc      m1         

См. также: урок 8, приложение 7 и команду


Содержание раздела