是否有可能在x86汇编中乘以mul的立即数?

use*_*774 9 x86 assembly multiplication

我正在使用DosBox模拟器学习x86的汇编.我正在尝试执行乘法.我不知道它是如何工作的.当我写下面的代码时:

mov al, 3
mul 2
Run Code Online (Sandbox Code Playgroud)

我收到一个错误.虽然,在我使用的参考文献中,它在乘法中说,它假设AX始终是占位符,因此,如果我写:

mul, 2
Run Code Online (Sandbox Code Playgroud)

它将al值乘以2.但它不适用于我.

当我尝试以下内容时:

mov al, 3
mul al,2
int 3
Run Code Online (Sandbox Code Playgroud)

我在ax中得到了结果9.请参阅此图片以获得澄清: 在此输入图像描述

另一个问题:我可以直接使用内存位置吗?例:

mov si,100
mul [si],5
Run Code Online (Sandbox Code Playgroud)

Mic*_*ael 12

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

要么:

mov al,3
mov bl,2
mul bl     ; the product is in ax
Run Code Online (Sandbox Code Playgroud)

要么:

mov ax,3
imul ax,2  ; imul is for signed multiplication, but that doesn't matter here
           ; the product is in ax
Run Code Online (Sandbox Code Playgroud)

要么:

mov al,3
add al,al  ; same thing as multiplying by 2
Run Code Online (Sandbox Code Playgroud)

要么:

mov al,3
shl al,1   ; same thing as multiplying by 2
Run Code Online (Sandbox Code Playgroud)

  • 还要注意,`imul`-immediate 是一个 3 操作数指令。所以你可以非破坏性地使用它,比如 `imul cx, si, 1234`。大多数汇编器都允许你将 `imul cx, 1234` 写成 `imul cx, cx, 1234` 的简写,类似于写成 `vaddps ymm0, ymm1` 而不是 `vaddps ymm0, ymm0, ymm1`:即当 dst =源代码1。 (2认同)