Система команд x86 |
|
Программирование - Архитектура и система команд микропроцессоров x86 |
MUL
Влияние команды на флаги и форматы команды:
* |
|
|
|
? |
? |
? |
? |
* |
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.
Особые ситуации режима 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, NEG, CMP.
В свою очередь, сами названные команды целочисленной арифметики делятся на следующие подгруппы:
- команды сложения (ADD, ADC, INC);
- команды вычитания (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
Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru