【问题标题】:Is it possible to multiply by an immediate with mul in x86 Assembly?是否可以在 x86 汇编中乘以 mul 的立即数?
【发布时间】:2013-12-28 05:53:47
【问题描述】:

我正在使用 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 al, 2 似乎被 MS-DOS DEBUG 错误地接受并被视为您输入了 mul al(将隐式字节操作数 al 乘以显式操作数 al 并存储在隐式目标 @ 987654331@).

标签: assembly x86 dos multiplication immediate-operand


【解决方案1】:

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

【讨论】:

  • 你的第二个代码 sn-p 中的注释是错误的。在imul ax, 2 之后,产品在 AX 中(不在 DX:AX 中)。
  • 还要注意imul-immediate 是一个三操作数指令。所以你可以无损地使用它,比如imul cx, si, 1234。大多数汇编程序允许您将imul cx, 1234 写为imul cx, cx, 1234 的简写,类似于写vaddps ymm0, ymm1 而不是vaddps ymm0, ymm0, ymm1:即当dst = src1 时。
【解决方案2】:

英特尔手册

Intel 64 and IA-32 Architectures Software Developer’s Manual - Volume 2 Instruction Set Reference - 325383-056US September 2015 “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 这样的东西不起作用:没有任何形式可以接受两个参数。

然而,正如 Michael 所提到的,imul 确实有像 IMUL r32, r/m32, imm32 这样的直接形式,以及许多其他 mul 没有的形式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    • 2019-10-24
    • 2017-04-15
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多