我正在使用x86仿真器学习DosBox程序集。我在做乘法。我不明白它是怎么工作的。当我编写以下代码时:
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
发布于 2013-12-10 08:07:39
没有任何形式的MUL
接受直接操作数。
要么做:
mov al,3
mov bl,2
mul bl ; the product is in ax
或(imul-立即需要186 ):
mov ax,3
imul ax,2 ; imul is for signed multiplication, but low half is the same
; the product is in ax. dx is not modified
或者:
mov al,3
add al,al ; same thing as multiplying by 2
或者:
mov al,3
shl al,1 ; same thing as multiplying by 2
发布于 2015-10-18 11:35:33
英特尔手册
英特尔64和IA-32架构软件开发人员手册-第2卷指令集参考- 325383-056US 2015年9月部分"MUL -无符号乘法“列Instruction
只包含:
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
这样的东西不能工作:没有任何形式需要两个参数。
然而,正如迈克尔所提到的,imul
确实有直接的形式,如IMUL r32, r/m32, imm32
和许多mul
没有的其他形式。
发布于 2022-05-22 10:54:56
没有即时的mul
,但是在186和更高版本中没有扩展的imul
-immediate,在386和更高版本中有imul reg, r/m
。有关更多细节,请参见@phuclv在汇编语言指令理解中的问题上的回答,当然,英特尔的指令集参考手册用于mul和imul:
即使在最新的CPU上也没有内存目的地mul
或imul
。
不过,如果你想要在186和更高版本上使用16位操作数和更宽的操作数,可以使用imul cx, [si], 5
。在386,也是imul di, [si]
。
但这些新形式的imul不存在8位操作数大小,因此不存在imul cl, [si], 5
。
在386或更高版本上,用LEA乘以一个简单的常量通常会更有效,尽管它确实花费了更多的代码大小。
; assuming 16-bit mode
mov cx, [si] ; or better movzx ecx, word [si] on newer CPUs
lea cx, [ecx + ecx*4] ; CX *= 5
https://stackoverflow.com/questions/20499141
复制