Is it possible to multiply by an immediate with mul in x86 Assembly?

48,009

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.

Share:
48,009
user2192774
Author by

user2192774

Updated on July 05, 2022

Comments

  • user2192774
    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: enter image description here

    Another question: Can I multiply using memory location directly? Example:

    mov si,100
    mul [si],5
    
  • Sep Roland
    Sep Roland over 8 years
    The comment in your second code snippet is wrong. After imul ax, 2 the product is in AX (not in DX:AX).
  • Peter Cordes
    Peter Cordes over 6 years
    Also note that imul-immediate is a 3-operand instruction. So you can use it non-destructively, like imul cx, si, 1234. Most assemblers let you write imul cx, 1234 as a short-hand for imul cx, cx, 1234, similar to writing vaddps ymm0, ymm1 instead of vaddps ymm0, ymm0, ymm1: i.e. when dst = src1.