我正在使用DosBox模拟器学习x86的程序集。我正在尝试执行乘法。我不知道它是如何工作的。当我写下面的代码时:
mov al, 3
mul 2
我收到错误。虽然,在我使用的参考文献中,它在乘法中说,它假设AX始终是占位符,因此,如果我写:
mul, 2
它将al
值乘以2.但它不适用于我。
当我尝试以下操作时:
mov al, 3
mul al,2
int 3
我在ax中得到结果9。请参阅此图片以获得澄清:
另一个问题:我可以直接使用内存位置吗?例如:
mov si,100
mul [si],5
答案 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
没有的其他表格。