【发布时间】:2020-10-16 13:37:45
【问题描述】:
所以,我有这样的代码:
XOR DX, DX
MOV BX, 1
MOV AX, BX
MOV CX, 10
.LOOP:
JCXZ .EXIT_LOOP
IMUL AX, 34 ; in here
SUB AX, DX
ADD AX, 2
PUSH AX
INC DX
DEC DX
XCHG BX, DX
MOV BX, [SP]
LOOP .LOOP
.EXIT_LOOP:
我不知道,在 16 位寄存器 IMUL 指令中给我一个类似 this in emu8086 的错误。
如果使用像IMUL EAX, 34这样的32位寄存器应该没问题(不是在emu8086中)。
我该如何解决这个问题?
【问题讨论】:
-
立即形式的 imul 指令需要三个操作数,因此您可以尝试编写
IMUL AX, AX, 34。我不知道为什么两个操作数适用于 32 位格式而不适用于 16 位格式;可能是emu8086 的汇编程序中的一个错误。我没有在这里安装它,所以我无法测试它。另一种可能性是您处于模拟真正 8086 的模式,在该模式下不存在IMUL的直接形式;我相信它是在 80186 中引入的。当您编写 32 位格式时,您显然是在假设 80386 或更高版本,这将支持直接格式。 -
@NateEldredge 哎呀...查看我的编辑
-
好的,那么你必须弄清楚emu8086在模拟什么。如果它是 80186 或更高版本,则该指令应该存在,您可以使用
IMUL AX, AX, 34组装它。如果是 8086,那么您没有立即乘法指令,您将不得不使用单操作数 r/m 形式,首先将 34 加载到寄存器中。请注意,单操作数形式正在扩大,并将用结果的高半部分覆盖 DX。 -
相关:Is it possible to multiply by an immediate with mul in x86 Assembly? - 现在的答案提到 imul-immediate 需要 186,但不是真正的重复。同样What's 'new' in a 'new' processor when viewed from programmer's point 以
imul为例。