Код
|
Инструкция
|
Описание
|
F6 /5
|
IMUL r/m8
|
AX:= AL * r/m8
|
F7 /5
|
IMUL r/m16
|
DX, AX:= AX * r/m16
|
Расположение сомножителей соответствует команде MUL. Произведение имеет разрядность, вдвое превышающую разрядность множителей. Оно размещается в регистре AX (8-разрядные множители, 16-разрядный результат) или в регистровой паре DX:AX (16-разрядные множители, 32-разрядный результат, старшая часть в регистре DX, младшая – в AX).
Рассмотрим несколько примеров использования команд умножения:
N DB 10
...
MOV AL, 2
MUL N ; AX=2*10=20=0014h: AH=00h, AL=14h
MOV AL, 32
MUL N ; AX=32*10 = 320=0140h: AH=01h, AL=40h
MOV AX, 8
MOV BX, -1
IMUL BX ; (DX, AX) = -8=0FFFFFFF8h: DX=0FFFFh, AX=0FFF8h
С помощью анализа флагов переноса CF и переполнения OF выполняется проверка, умещается ли результат умножения в формат сомножителей:
произведение занимает двойной формат CF=OF=1;
произведению достаточен формат сомножителей CF=OF=0.
Во втором случае произведение байтов занимает только регистр AL, а произведение слов – только регистр АХ. Но если CF=1, то далее приходится работать с результатом как с числом удвоенного формата.
Начиная с процессора 80186, доступен упрощенный вариант команд умножения MUL и IMUL. Их мнемоника включает три операнда. Первый операнд может быть только регистром r16, второй операнд r/m16, третий операнд непосредственный imm16. Следовательно, команды позволяют оперировать только словами, и результат умножения также должен быть размером слово. Команды перемножают второй и третий операнды и помещают результат в регистр общего назначения. Такие расширения команд имеют и другие инструкции (см. команды сдвига и стековые команды).
Следует заметить, что трансляторы языка ассемблера TASM и MASM по умолчанию воспринимают только базовый набор команд процессора 8086. Чтобы сделать для них доступными расширения команд, введенные в более поздних моделях процессоров, например, в 80186, необходимо указывать специальные директивы.
Например, директива .8086 допускает использование только команд 8086, а директива .186 допускает использование команд процессора 8086 и новых команд процессора 80186. Директивы могут быть указаны в любом месте программы на языке ассемблера, и действовать они будут до появления следующей подобной директивы.
Инструкция AAM обеспечивает коррекцию результата умножения двух неупакованных двоично-десятичных чисел командой MUL (табл. 27). Флаги SF, ZF и PF устанавливаются по обычным правилам. Значение флагов OF, AF и CF не определено.
Табл. 27. Команда AAM.
Do'stlaringiz bilan baham: |