Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 在x86汇编中,是否可以用mul乘以一个立即数?_Assembly_X86_Dos_Multiplication_Immediate Operand - Fatal编程技术网

Assembly 在x86汇编中,是否可以用mul乘以一个立即数?

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

我正在学习使用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

没有任何形式的
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