Команда IMUL выполняет умножение целого числа со знаком, находящегося в регистре
AL (в случае умножения на байт) или АХ (в случае умножения на слово), на операнд-источник
(целое число со знаком). Размер произведения в два раза больше размера сомножителей.
Для однобайтовых операций один из сомножителей помещается в регистр
AL; после
выполнения операции произведение записывается в регистр АХ.
Для двухбайтовых операций один из сомножителей помещается в регистр АХ; после
выполнения операции произведение записывается в регистры DX:AX (в DX - старшая
часть, в АХ - младшая).
В качестве операнда-сомножителя команды imul можно указывать регистр (кроме
сегментного) или ячейку памяти; не допускается умножение на непосредственное
значение. Команда воздействует на флаги OF и
CF. Если АН или DX представляют
собой просто знаковое расширение AL или АХ, соответственно (т.е. результат умножения
со знаком верен), OF и CF сбрасываются в 0; в противном случае (результат со
знаком не помещается в АХ или DX:AX) OF и CF устанавливаются в 1.
Пример 1
mov AL,5 ;Первый сомножитель
mov BL,3 ;Второй сомножитель
imul BL ;AX=000Fh (произведение)
Пример 2
mov AX,256 ;Первый сомножитель
mov BX,256 ;Второй сомножитель
imul BX ;DX=0001h, AX=0000h
;(число 65536)
Пример 3
mov AL,-5 ;AL=FBh
mov BL,3 ;BL=03h
imul BL ;AX-'FFF1h (-15)
Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров. Имеются также варианты команды с двумя и тремя операндами.
Для команды imul с одним операндом второй сомножитель должен располагаться в
AL, АХ или ЕАХ. Процессор выбирает размерность второго сомножителя, исходя из
размерности первого, указанного в качестве операнда. 16-, 32- или 64-битовый
знаковый результат помещается в регистры АХ, DX:AX или
EDX:EAX, соответственно.
Если после операции умножения содержимое АН, DX или EDX является лишь знаковым
расширением AL, АХ или ЕАХ, соответственно, то флаги CF и OF сбрасываются в
0. В противном случае они устанавливаются в 1.
Для команды imul с двумя операндами их произведение записывается в первый операнд;
второй операнд не изменяется. В качестве первого операнда могут выступать 16-
или 32-разрядные регистры общего назначения; в качестве второго операнда - 16-
или 32-разрядные регистры общего назначения, 16- или 32-битовые ячейки памяти
или непосредственное значение. Оба операнда должны иметь один размер. Если результат
умножения помещается в первый операнд, флаги CF и OF сбрасываются в 0. В противном
случае они устанавливаются в 1.
Для команды imul с тремя операндами произведение второго и третьего операндов
записывается в первый операнд. В качестве первого операнда могут выступать 16-
или 32-разрядные регистры общего назначения; в качестве второго операнда - 16-
или 32-разрядные регистры общего назначения или 16- или 32-битовые ячейки памяти;
в качестве третьего операнда - только непосредственное значение. Два первых
операнда должны иметь один размер. Если результат умножения помещается в первый
операнд, флаги CF и OF сбрасываются в 0. В противном случае они устанавливаются
в 1.
Пример 1
mov EAX,-1 ;Первый сомножитель
mov ESI,100000000 ;Второй сомножитель
imul ESI ;EDX=FFFFFFFFh,
;EAX=FA0AlF00h
;Результат=-100000000
Пример 2
;В полях данных
ор2 dd 100h ;Первый сомножитель
; В программном сегменте
mov EAX,400000h ;Второй сомножитель
imul EAX,op2 ;EAX=40000000h
Пример 3
mov BX,300h
imul АХ,ВХ,4 ;AX=300h*4=0C00h