logo

Система команд x86
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

IMUL

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

Влияние команды на флаги и форматы команды:

OF

DF

IF

TF

SF

ZF

AF

PF

CF

*

     

?

?

?

?

*

 

Код

Команда

Описание

Проц.

Пример

F6 /5

IMUL r/m8

AX=AL*r/m8

8086

imul dl

F7 /5

IMUL r/m16

DX:AX=AX*r/m16

8086

imul si

F7 /5

IMUL r/m32

EDX:EAX=EAX*r/m32

Intel386

imul edi

0F AF /r

IMUL r16,r/m16

r16=r16*r/m16

Intel386

imul si,[di]

0F AF /r

IMUL r32,r/m32

r32=r32*r/m32

Intel386

imul edi,ecx

6B /r ib

IMUL r16,r/m16,imm8

r16=r/m16*(знакорасширенное imm8)

Intel286

imul ax,dx,4

6B /r ib

IMUL r32,r/m32,imm8

r32=r/m32*(знакорасширенное imm8)

Intel386

imul eax,edx,4

6B /r ib

IMUL r16,imm8

r16=r16*(знакорасширенное imm8)

Intel286

imul ax,4

6B /r ib

IMUL r32,imm8

r32=r32*(знакорасширенное imm8)

Intel386

imul edx,5

69 /r iw

IMUL r16,r/m16,imm16

r16=r/m16*(знакорасширенное imm16)

Intel286

imul ax,dx,1

69 /r id

IMUL r32,r/m32,imm16

r32=r/m32*(знакорасширенное imm16)

Intel386

imul eax,edx,8

69 /r iw

IMUL r16,imm16

r16=r16*imm16

Intel286

imul ax,8F57h

69 /r id

IMUL r32,imm32

r32=r32*imm32

Intel386

imul edx,9000

Операция:

IF (NumberOfOperands = 1)

   THEN

      IF (OperandSize = 8)

         THEN

            AX = AL * SRC (* Знаковое умножение *)

            IF ((AH = 00H) OR (AH = FFH))

               THEN CF = 0; OF = 0;

               ELSE CF = 1; OF = 1;

            FI;

         ELSE

            IF OperandSize = 16

               THEN

                  DX:AX = AX * SRC (* Знаковое умножение *)

                  IF ((DX = 0000H) OR (DX = FFFFH))

                     THEN CF = 0; OF = 0;

                     ELSE CF = 1; OF = 1;

                  FI;

               ELSE (* OperandSize = 32 *)

                  EDX:EAX = EAX * SRC (* Знаковое умножение *)

                  IF ((EDX = 00000000H) OR (EDX = FFFFFFFFH))

                     THEN CF = 0; OF = 0;

                     ELSE CF = 1; OF = 1;

                  FI;

            FI;

      FI;

   ELSE

      IF (NumberOfOperands = 2)

         THEN

            temp = DEST * SRC (* Знаковое умножение; temp имеет удвоенный размер DEST *)

            DEST = DEST * SRC (* Знаковое умножение *)

            IF temp <> DEST

               THEN CF = 1; OF = 1;

               ELSE CF = 0; OF = 0;

            FI;

         ELSE (* Число операндов = 3 *)

            DEST = SRC1 * SRC2 (* Знаковое умножение *)

            temp = SRC1 * SRC2 (* Знаковое умножение; temp имеет удвоенный размер SRC1 *)

            IF temp <> DEST

               THEN CF = 1; OF = 1;

               ELSE CF = 0; OF = 0;

            FI;

      FI;

FI;

Описание:

Команда IMUL выполняет умножение со знаком. Некоторые формы команды используют неявные операнды-регистры.

Процессоры, начиная с Intel386, поддерживают три формы команды IMUL.

Форма с одним операндом аналогична форме команды MUL. В этой форме операнд-источник (регистр или операнд в памяти) умножается на значение в регистре AL, AX или EAX, а результат помещается соответственно в AX, DX:AX или EDX:EAX.

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

Форма с тремя операндами задает операнд-назначение (первый операнд) и два операнда-источника (второй и третий операнды). Операнды-источники перемножаются и результат помещается в операнд-назначение. Операнд-назначение в этой форме команды может быть только регистром общего назначения, второй операнд может быть регистром и операндом в памяти, а третий операнд — это непосредственное значение.

Во всех формах команды, если в качестве множителя выступает непосредственное значение, то перед умножением оно знакорасширяется до размера множимого.

Для однооперандной формы команды IMUL флаги CF и OF устанавливаются если значащие биты результата переходят в старшую его половину. Эти флаги сбрасываются, если весь результат размещается в младшей половине операнда-назначения.

Когда используются формы команды с аккумулятором (IMUL r/m8, IMUL r/m16 или IMUL r/m32), то результат умножения доступен, даже если установлен флаг переполнения, потому что результат в два раза больше по размеру, чем множимое и множитель. Этого достаточно, чтобы поддержать любой возможный результат.

Для форм команды с двумя и тремя операндами возможна потеря старших значащих битов результата, когда это происходит, флаги CF и OF устанавливаются.

Особые ситуации защищенного режима:

#GP(0), если результат находится в сегменте, запрещенном для записи, если используется некорректный эффективный адрес операнда в памяти в сегментах CS, DS, ES, FS, GS или нулевой селектор.
#SS(0) при использовании некорректного эффективного адреса в сегменте SS.
#PF(Код ошибки), страничная ошибка.
#AC(0) при невыровненной ссылке в память при текущем уровне привилегий равном 3.

Особые ситуации режима реальной адресации:

#GP, если любая часть операнда находится вне пространства эффективных адресов в сегментах CS, DS, ES, FS или GS.
#SS, если любая часть операнда находится вне пространства эффективных адресов в сегменте SS.

Особые ситуации режима V86:

Такие же, как и в режиме реальной адресации.
#PF(Код ошибки), страничная ошибка.
#AC(0) при невыровненной ссылке в память.


Входит в группу команд: Базовая система команд CPU



Все права защищены © 1997-2011 Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru

Яндекс.Метрика               Сервер радиолюбителей России - схемы, документация,

 соревнования, дипломы, программы, форумы и многое другое!   схемы новости электроники