是否有可能在x86汇编中乘以mul的立即数?

时间:2013-12-10 15:58:34

标签: assembly x86 multiplication

我正在使用DosBox模拟器学习x86的程序集。我正在尝试执行乘法。我不知道它是如何工作的。当我写下面的代码时:

mov al, 3
mul 2

我收到错误。虽然,在我使用的参考文献中,它在乘法中说,它假设AX始终是占位符,因此,如果我写:

mul, 2

它将al值乘以2.但它不适用于我。

当我尝试以下操作时:

mov al, 3
mul al,2
int 3

我在ax中得到结果9。请参阅此图片以获得澄清: enter image description here

另一个问题:我可以直接使用内存位置吗?例如:

mov si,100
mul [si],5

2 个答案:

答案 0 :(得分:12)

没有MUL形式接受立即操作数。

要么:

mov al,3
mov bl,2
mul bl     ; the product is in ax

或:

mov ax,3
imul ax,2  ; imul is for signed multiplication, but that doesn't matter here
           ; the product is in ax

或:

mov al,3
add al,al  ; same thing as multiplying by 2

或:

mov al,3
shl al,1   ; same thing as multiplying by 2

答案 1 :(得分:3)

英特尔手册

this official Parse blog post  “MUL - 无符号乘法”列Instruction仅包含:

MUL r/m8
MUL r/m8*
MUL r/m16
MUL r/m32
MUL r/m64

r/mXX表示注册或内存:因此,immXX之类的即时(mul 2)不允许以任何形式出现:处理器根本不支持该操作。

这也回答了第二个问题:可以乘以内存:

x: dd 0x12341234
mov eax, 2
mul dword [x]
; eax == 0x24682468

并且还说明为什么像mul al,2这样的东西不起作用:没有形式需要两个参数。

正如迈克尔所提到的那样,imul确实有像IMUL r32, r/m32, imm32这样的直接表格以及mul没有的其他表格。