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

Viewed 49791

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
3 Answers

There's no immediate mul, but there is non-widening imul-immediate in 186 and newer, and imul reg, r/m in 386 and newer. See @phuclv's answer on problem in understanding mul & imul instructions of Assembly language for more details, and of course Intel's instruction set reference manuals for mul and imul:

There's no memory-destination mul or imul even on the newest CPUs.

There is imul cx, [si], 5 if you want, though, on 186 and newer, for 16-bit operand-size and wider. And on 386, also imul di, [si].

But those new forms of imul don't exist for 8-bit operand-size, so there is no imul cl, [si], 5.

On a 386 or newer, it would typically be more efficient to use an LEA for a multiply by a simple constant, although it does cost a bit more code-size.

; assuming 16-bit mode
    mov  cx, [si]              ; or better movzx ecx, word [si] on newer CPUs
    lea  cx, [ecx + ecx*4]     ; CX *= 5
Related