Команды MUL и IMUL — Уголок системного программиста
Команды MUL и IMUL позволяют перемножать два числа. Команда IMUL используется для перемножения чисел со знаком, а команда MUL — для чисел без знака.
Команда IMUL (форма 1)
Синтаксис: | IMUL op1 |
Операнды: | op1 — r/m8, r/m16, r/m32 |
Назначение: | Умножение со знаком |
Процессор: | 8086+ |
Флаги: | Флаги CF и OF сбрасываются в 0, если размер результата умножения получился меньше или равным размеру заданного операнда. В противном случае эти флаги становятся равными 1. Значения флагов SF, ZF, AF и PF не определены. |
Комментарий: | |
Ограничения: | Нет |
Примеры: |
mov al,5 mov bl,3 imul bl ;AX=000Fh |
Синтаксис: | IMUL op1,op2,op3 |
Операнды: | op1 — r16, r32 op2 — r/m16, r/m32 op3 — i8, i16, i32 |
Назначение: | Умножение со знаком |
Процессор: | 80186+ |
Флаги: | Флаги CF и OF устанавливается в 1, если результат умножения не вместился в регистр назначения (первый операнд). В противном случае эти флаги сбрасываются в 0. Значения флагов SF, ZF, AF и PF не определены. |
Комментарий: | |
Ограничения: | Разрядность операндов должна совпадать. Исключением является использование в качестве второго операнда непосредственного 8-битного значения. |
Примеры: |
imul dx,cx,-45 imul ax,[bx],3 |
Синтаксис: | IMUL op1,op2 |
Операнды: | op1 — r16, r32 op2 — r/m16, r/m32, i8, i16, i32 |
Назначение: | Умножение со знаком |
Процессор: | 80186+ |
Флаги: | Флаги CF и OF устанавливается в 1, если результат умножения не вместился в регистр назначения (первый операнд). В противном случае эти флаги сбрасываются в 0. Значения флагов SF, ZF, AF и PF не определены. |
Комментарий: | |
Ограничения: | Разрядность операндов должна совпадать. Исключением является использование в качестве второго операнда непосредственного 8-битного значения. |
Примеры: |
imul dx,cx imul ebx,334 |
Синтаксис: | MUL op1 |
Операнды: | op1 — r/m8, r/m16, r/m32 |
Назначение: | Умножение без знака |
Процессор: | 8086+ |
Флаги: | Флаги CF и OF сбрасываются в 0, если старшая половина результата равна 0. В противном случае эти флаги устанавливаются в 1. Значения флагов SF, ZF, AF и PF не определены. |
Комментарий: | |
Ограничения: | Нет |
Примеры: |
mov al,45 mov bl,3 mul bl ;AX=0087h |
mul (sm4 — asm) — Win32 apps
Twitter LinkedIn Facebook Адрес электронной почты- Статья
Умножение на уровне компонентов.
mul[_sat] dest[.mask], [-]src0[_abs][.swizzle], [-]src1[_abs][.swizzle] |
---|
Элемент | Описание |
---|---|
Dest | [in] Результат операции. dest = src0 * src1 |
src0 | [in] Умножение. |
src1 | [in] Множитель. |
В следующей таблице показаны результаты, полученные при выполнении инструкции с различными классами чисел, при условии, что ни переполнение, ни переполнение не происходит.
F означает конечное-реальное число.
src0 src1 —> | -Inf | -F | -1.0 | -denorm | -0 | +0 | денорм | +1.0 | +F | +inf | Не число |
---|---|---|---|---|---|---|---|---|---|---|---|
-Inf | +inf | +inf | +inf | Не число | Не число | Не число | Не число | -inf | -inf | -inf | Не число |
-F | +inf | +F | -src0 | +0 | +0 | -0 | -0 | src0 | -F | -inf | Не число |
-1 | +inf | -src1 | +1. 0 | +0 | +0 | -0 | -0 | -1.0 | -src1 | -inf | Не число |
-denorm | Не число | +0 | +0 | +0 | +0 | -0 | -0 | -0 | -0 | Не число | Не число |
-0 | Не число | +0 | +0 | +0 | +0 | -0 | -0 | -0 | -0 | Не число | Не число |
+0 | iNaN | -0 | -0 | -0 | -0 | +0 | +0 | +0 | +0 | Не число | Не число |
+денорм | Не число | -0 | -0 | -0 | -0 | +0 | +0 | +0 | +0 | Не число | Не число |
+1.0 | -inf | src1 | -1.0 | -0 | -0 | +0 | +0 | +1. 0 | src1 | +inf | Не число |
+F | -inf | -F | -src0 | -0 | -0 | +0 | +0 | src0 | +F | +inf | Не число |
+inf | -inf | -inf | -inf | Не число | Не число | Не число | Не число | +inf | +inf | +inf | Не число |
Не число | Не число | Не число | Не число | Не число | Не число | Не число | Не число | Не число | Не число | Не число |
Эта инструкция применяется к следующим этапам шейдера:
Вершинный построитель текстуры | Шейдер геометрии | Построитель текстуры |
---|---|---|
x | x | x |
Эта функция поддерживается в следующих моделях шейдеров.
Модель шейдера | Поддерживается |
---|---|
Модель шейдера 5 | да |
Модель шейдера 4.1 | да |
Модель шейдера 4 | да |
Модель шейдера 3 (DirectX HLSL) | нет |
Модель шейдера 2 (DirectX HLSL) | нет |
Модель шейдера 1 (DirectX HLSL) | нет |
Сборка шейдера модели 4 (DirectX HLSL)
Можно ли умножить на непосредственный с mul в сборке x86?
спросилИзменено 1 год, 2 месяца назад
Просмотрено 53 тысячи раз
Изучаю сборку для x86 с помощью эмулятора DosBox. Я пытаюсь выполнить умножение. Я не понимаю, как это работает. Когда я пишу следующий код:
м-в д. 3 мул 2
Я получаю сообщение об ошибке. Хотя в справочнике, который я использую, говорится, что при умножении предполагается, что AX всегда является заполнителем, поэтому, если я напишу:
mul, 2
Умножает значение al
на 2. Но у меня это не работает.
Когда я пытаюсь сделать следующее:
mov al, 3 муль ал,2 целое 3
Я получаю результат 9 по оси. Смотрите эту картинку для пояснения:
Еще вопрос: Могу ли я умножать напрямую, используя ячейку памяти? Пример:
мов си, 100 мул [си],5
- сборка
- x86
- dos
- умножение
- непосредственный операнд
Не существует формы MUL
, которая принимает непосредственный операнд.
Либо:
mov al,3 мов бл,2 мул бл ; продукт в топоре
или (требуется 186 для imul-immediate):
mov ax,3 имул топор,2 ; imul для умножения со знаком, но младшая половина такая же ; продукт в топоре. дх не изменен
или:
мов ал,3 добавить аль, аль; то же самое, что умножить на 2
или:
мов ал,3 шл ал,1 ; то же самое, что умножить на 22
Руководство Intel
Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32 — Том 2 Справочник по набору инструкций — 325383-056US Сентябрь 2015 г.
раздел «MUL — Unsigned Multiply», столбец . Инструкция
содержит только:
МУЛ об/м8 МУЛ р/м8* МУЛ р/м16 МУЛ р/м32 МУЛ р/м64
r/mXX
означает регистр или память: поэтому непосредственные ( immXX
), такие как mul 2
, не допускаются ни в одной из форм: процессор просто не поддерживает эту операцию.
Это же отвечает на второй вопрос: можно умножать на память:
x:dd 0x12341234 мов акс, 2 многозначное двойное слово [x] ; еакс == 0x24682468
А также показывает, почему такие вещи, как mul al,2
, не будут работать: не существует формы, принимающей два аргумента.
Однако, как упоминал Майкл, imul
имеет непосредственные формы, такие как IMUL r32, r/m32, imm32
и многие другие, которых нет у mul
.
Непосредственного мул
нет, но есть нерасширяемый имул
-непосредственный в 186 и новее, и имул рег, р/м
в 386 и новее. См. Ответ @phuclv о проблеме с пониманием инструкций mul и imul языка ассемблера для более подробной информации и, конечно же, справочные руководства по набору инструкций Intel для mul и imul:
- https://www.felixcloutier.com/x86/imul — расширение с одним операндом, восходящее к 8086, и более новые более эффективные и удобные формы, которые не используют DX:AX в качестве неявного адресата.
- https://www.felixcloutier.com/x86/mul — единственная форма расширения с одним операндом, существовавшая с 8086
Нет адресата памяти mul
или imul
даже на новейших процессорах.
Есть imul cx,[si],5
если хотите, правда, на 186 и новее, для 16-битного размера операнда и шире. А на 386 тоже имул ди, [си]
.
Но эти новые формы imul не существуют для 8-битного размера операнда, поэтому не существует imul cl, [si], 5
.
На 386 или новее обычно более эффективно использовать LEA для умножения на простую константу, хотя это требует немного больше размера кода.
; предполагая 16-битный режим мов сх, [си] ; или лучше movzx ecx, слово [si] на более новых процессорах lea cx, [ecx + ecx*4] ; СХ *= 5
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google Зарегистрироваться через Facebook Зарегистрируйтесь, используя электронную почту и парольОпубликовать как гость
Электронная почтаОбязательно, но не отображается
Опубликовать как гость
Электронная почтаТребуется, но не отображается
Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.
MUL Инструкция по ассемблеру x86
У меня возникли трудности с определением результата следующей операции. Проведя исследование в Интернете и сославшись на мою книгу 80×86, похоже, что инструкция mul всегда ссылается на регистр axe.
Инструкция ‘mul ecx’ выполняется, начиная со следующих значений регистра:
EAX: 00 00 00 10 ECX: FF FF FF FD EDX: ФФ 03 ФФ 01
Как рассчитывается ecx? Я понимаю, что инструкция mul — это «mul», но что на самом деле умножается на ?
Будем признательны за любую помощь.
- сборка
- x86
- x86-16
- умножение
похоже, что инструкция mul всегда ссылается на регистр
или
.
Инструкция x86 mul
всегда умножает регистр накопителя ( EAX
, AX
или AL
) на любой операнд, указанный в инструкции:
- 90 002 размер двойного слова
mul ecx
умножит EAX на ECX и оставит произведение двойной длины в комбинации регистров EDX:EAX.