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 |