12

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

2 回答 2

15

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

要么做:

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

或(imul-immediate 需要 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
于 2013-12-10T16:07:39.323 回答
3

英特尔手册

英特尔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表示寄存器或内存:因此任何形式的立即数 ( immXX)mul 2都不允许:处理器根本不支持该操作。

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

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

并且还说明了为什么这样的事情mul al,2不起作用:没有任何形式可以接受两个参数。

然而,正如迈克尔所提到的,确实有像和许多其他没有imul一样的直接形式。IMUL r32, r/m32, imm32mul

于 2015-10-18T19:35:33.780 回答