Mul asm: MUL — Беззнаковое умножение — Club155.ru

Команды 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 (форма 2)
Синтаксис: 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 (форма 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
Синтаксис: 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-0src0-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Не числоНе число
+0iNaN-0-0-0-0+0+0+0+0Не числоНе число
+денормНе число-0-0-0 -0+0+0+0+0Не числоНе число
+1.0-infsrc1-1.0-0-0+0+0+1. 0src1+infНе число
+F-inf-F-src0-0-0+0+0src0+F+infНе число
+inf-inf-inf-infНе числоНе числоНе числоНе число+inf+inf+infНе число
Не числоНе числоНе числоНе числоНе числоНе числоНе числоНе числоНе числоНе числоНе число
Не число

Эта инструкция применяется к следующим этапам шейдера:

Вершинный построитель текстурыШейдер геометрииПостроитель текстуры
xxx

Эта функция поддерживается в следующих моделях шейдеров.

Модель шейдераПоддерживается
Модель шейдера 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
  • умножение
  • непосредственный операнд
2

Не существует формы MUL , которая принимает непосредственный операнд.

Либо:

 mov al,3
мов бл,2
мул бл ; продукт в топоре
 

или (требуется 186 для imul-immediate):

 mov ax,3
имул топор,2 ; imul для умножения со знаком, но младшая половина такая же
           ; продукт в топоре.  дх не изменен
 

или:

 мов ал,3
добавить аль, аль; то же самое, что умножить на 2
 

или:

 мов ал,3
шл ал,1 ; то же самое, что умножить на 2
 
2

Руководство 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
  • умножение
2

похоже, что инструкция mul всегда ссылается на регистр или .

Инструкция x86 mul всегда умножает регистр накопителя ( EAX , AX или AL ) на любой операнд, указанный в инструкции:

  • 90 002 размер двойного слова mul ecx умножит EAX на ECX и оставит произведение двойной длины в комбинации регистров EDX:EAX.
Оставить комментарий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *