Is it possible to multiply by an immediate with mul in x86 Assembly?
Solution 1
There's no form of MUL
that accepts an immediate operand.
Either do:
mov al,3
mov bl,2
mul bl ; the product is in ax
or (requires 186 for imul-immediate):
mov ax,3
imul ax,2 ; imul is for signed multiplication, but low half is the same
; the product is in ax. dx is not modified
or:
mov al,3
add al,al ; same thing as multiplying by 2
or:
mov al,3
shl al,1 ; same thing as multiplying by 2
Solution 2
Intel manual
The Intel 64 and IA-32 Architectures Software Developer’s Manual - Volume 2 Instruction Set Reference - 325383-056US September 2015
section "MUL - Unsigned Multiply" column Instruction
contains only:
MUL r/m8
MUL r/m8*
MUL r/m16
MUL r/m32
MUL r/m64
r/mXX
means register or memory: so immediates (immXX
) like mul 2
are not allowed in any of the forms: the processor simply does not support that operation.
This also answers the second question: it is possible to multiply by memory:
x: dd 0x12341234
mov eax, 2
mul dword [x]
; eax == 0x24682468
And also shows why things like mul al,2
will not work: there is no form that takes two arguments.
As mentioned by Michael however, imul
does have immediate forms like IMUL r32, r/m32, imm32
and many others that mul
does not.
user2192774
Updated on July 05, 2022Comments
-
user2192774 almost 2 years
I am learning assembly for x86 using DosBox emulator. I am trying to perform multiplication. I do not get how it works. When I write the following code:
mov al, 3 mul 2
I get an error. Although, in the reference I am using, it says in multiplication, it assumes AX is always the place holder, therefore, if I write:
mul, 2
It multiplies
al
value by 2. But it does not work with me.When I try the following:
mov al, 3 mul al,2 int 3
I get result 9 in ax. See this picture for clarification:
Another question: Can I multiply using memory location directly? Example:
mov si,100 mul [si],5
-
Sep Roland over 8 yearsThe comment in your second code snippet is wrong. After
imul ax, 2
the product is in AX (not in DX:AX). -
Peter Cordes over 6 yearsAlso note that
imul
-immediate is a 3-operand instruction. So you can use it non-destructively, likeimul cx, si, 1234
. Most assemblers let you writeimul cx, 1234
as a short-hand forimul cx, cx, 1234
, similar to writingvaddps ymm0, ymm1
instead ofvaddps ymm0, ymm0, ymm1
: i.e. when dst = src1.