logo

Главная Система команд x86 Базовая система команд CPU MUL

Система команд x86

Программирование - Архитектура и система команд микропроцессоров 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

MUL

Беззнаковое умножение

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

OF

DF

IF

TF

SF

ZF

AF

PF

CF

*

 

 

 

?

?

?

?

*

 

Код

Команда

Описание

Проц.

Пример

F6 /4

MUL r/m8

AX = AL * r/m8

8086

mul ch

F7 /4

MUL r/m16

DX:AX = AX * r/m16

8086

mul bx

F7 /4

MUL r/m32

EDX:EAX = EAX * r/m32

Intel386

mul edi

Описание:

Команда MUL (Unsigned Multiply) относится к группе команд целочисленной (или двоичной) арифметики (Binary Arithmetic Instructions) и производит умножение двух беззнаковых целочисленных операндов. Операнд-назначение (DEST) задается неявно и является переменной в регистре (или регистровой паре) AX, DX:AX или EDX:EAX в зависимости от кода команды и атрибута размера операнда. Единственный операнд команды — операнд-источник (SRC) — может быть переменной в регистре или в памяти (r/m8, r/m16, r/m32).

Действие команды MUL зависит от размера операнда-источника (SRC) следующим образом:

  • однобайтный операнд r/m8 умножается на значение в регистре AL, результат помещается в регистр AX, флаги EFLAGS.CF и EFLAGS.OF сбрасываются, если результирующее значение в регистре AH равно нулю, иначе — устанавливаются в 1;
  • двухбайтный операнд r/m16 умножается на значение в регистре AX, результат помещается в пару регистров DX:AX, регистр DX содержит старшие 16 бит результата, флаги EFLAGS.CF и EFLAGS.OF сбрасываются, если результирующее значение в регистре DX равно нулю, иначе — устанавливаются в 1.
  • четырехбайтный операнд r/m32 умножается на значение в регистре EAX, результат помещается в пару регистров EDX:EAX, регистр EDX содержит старшие 32 бита результата, флаги EFLAGS.CF и EFLAGS.OF сбрасываются, если результирующее значение в регистре EDX равно нулю, иначе — устанавливаются в 1.

Команда MUL позволяет также производить вычисления в неупакованном двоично-десятичном формате (неупакованный BCD-формат). Используя команду AAM сразу же вслед за командой MUL, можно произвести так называемую ASCII-коррекцию результата умножения и получить произведение в таком же неупакованном BCD-формате, как и исходные операнды.

Для умножения целочисленных значений со знаком предназначены команды MUL, FIMUL, PMULLW и некоторые другие.

Операция:

IF (Операция над байтами)

   THEN AX = AL * r/m8

   ELSE (* Операция над словами или двойными словами *)

      IF (OperandSize = 16)

         THEN DX:AX = AX * r/m16

         ELSE (* OperandSize = 32 *)

            EDX:EAX = EAX * r/m32

      FI;

FI;

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

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

Intel386 … :
#PF(Код ошибки) при страничной ошибке.
#UD при использовании префикса LOCK.

Intel486 … :
#AC(0) при невыровненной ссылке в память, если активирован контроль выравнивания (CR0.AM = 1, EFLAGS.AC = 1, CPL = 3).

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

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

Intel386 … :
#UD при использовании префикса LOCK.

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

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

Intel386 … :
#PF(Код ошибки) при страничной ошибке.
#UD при использовании префикса LOCK.

Intel486 … :
#AC(0) при невыровненной ссылке в память, если активирован контроль выравнивания (CR0.AM = 1, EFLAGS.AC = 1, CPL = 3).

Замечание:

К командам целочисленной арифметики относятся команды ADD, ADC, SUB, SBB, IMUL, MUL, IDIV, DIV, INC, DEC, NEGCMP.

В свою очередь, сами названные команды целочисленной арифметики делятся на следующие подгруппы:

  • команды сложения (ADDADCINC);
  • команды вычитания (SUB, SBB, DEC);
  • команды умножения (IMUL, MUL);
  • команды деления (IDIV, DIV).
  • команды сравнения и изменения знака (CMP, NEG).

У команды MUL есть специфическая особенность, которую использовали для идентификации процессоров-клонов V20/V30 производства компании NEC. У процессоров Intel значение флага FLAGS.ZF не меняется по результату выполнения команды, а в процессорах V20/V30 этот флаг устанавливается по результату операции. Следующий код позволяет отличать эти процессоры от продукции Intel.

xor AL, AL         ; ZF = 1

mov AL, 40h
mul AL             ; проверка ZF по результату операции

jz cpu_NEC_V20_V30 ; процессор V20/V30
jnz cpu_Intel_808x ; процессор Intel


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




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

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

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