Assembly 在x86汇编中,是否可以用mul乘以一个立即数?
我正在学习使用DosBox仿真器组装x86。我在试着做乘法运算。我不明白它是怎么工作的。当我编写以下代码时:Assembly 在x86汇编中,是否可以用mul乘以一个立即数?,assembly,x86,dos,multiplication,immediate-operand,Assembly,X86,Dos,Multiplication,Immediate Operand,我正在学习使用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
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
没有任何形式的
MUL
接受立即数操作数
或者:
mov al,3
mov bl,2
mul bl ; the product is in ax
或(imul立即要求186):
或:
或:
英特尔手册 “MUL-无符号乘法”列的指令部分仅包含:
MUL r/m8
MUL r/m8*
MUL r/m16
MUL r/m32
MUL r/m64
r/mXX
表示寄存器或内存:因此在任何形式中都不允许像mul 2
这样的即时(immXX
):处理器根本不支持该操作
这也回答了第二个问题:有可能乘以内存:
x: dd 0x12341234
mov eax, 2
mul dword [x]
; eax == 0x24682468
同时也说明了为什么像mul al,2
这样的东西不起作用:没有两个参数的形式
然而,正如Michael所提到的,
imul
确实有直接形式,如imul r32、r/m32、imm32
和许多其他mul
没有的形式。第二个代码段中的注释是错误的。在imul ax之后,2
乘积在ax中(不是在DX:ax中)。还要注意的是imul
-immediate是一条3操作数指令。因此,您可以非破坏性地使用它,如imul-cx,si,1234
。大多数汇编程序允许您编写imul-cx,1234
作为imul-cx,cx,1234
的缩写,类似于编写vaddps-ymm0,ymm1
而不是vaddps-ymm0,ymm0,ymm1
:即当dst=src1.mul,MS-DOS调试似乎错误地接受了2
,并将其视为输入了mul al
(将隐式字节操作数al
乘以显式操作数al
,并存储在隐式目标ax
)。
mov al,3
shl al,1 ; same thing as multiplying by 2
MUL r/m8
MUL r/m8*
MUL r/m16
MUL r/m32
MUL r/m64
x: dd 0x12341234
mov eax, 2
mul dword [x]
; eax == 0x24682468