所以,我有这样的代码:
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指令会给我一个错误,就像emu8086中的this。
如果使用像IMUL EAX, 34这样32位寄存器(不是在emu8086中),应该没问题。
我该怎么解决这个问题呢?
发布于 2020-10-17 10:10:38
IMUL instruction的直接形式,操作码6B和69,实际上需要三个大小相同的操作数(这里是16位):IMUL r, r/m, imm。它将第二个操作数乘以第三个操作数,并将结果放在第一个操作数中,在发生溢出时截断。最初的8086不支持这种形式,但在大约1982年的80186中作为扩展添加了这种形式,并且所有较新的x86处理器都支持这种形式。
您的32位汇编器显然支持将IMUL EAX, 34作为IMUL EAX, EAX, 34的语法糖,同时使用EAX作为源和目标操作数。
所以这里有三种可能性;我对emu8086一无所知,所以不确定哪一种适用。
IMUL AX, AX, 34.IMUL r/m,并将常量34加载到寄存器中(或将其放入内存中)。请注意,IMUL r/m正在扩大范围,并将其32位结果放入DX:AX中,因此,如果结果为负或大于32767,DX中的零值将被销毁;您需要相应地调整代码。或者用移位和加法重写它,这可能会更有效:x * 34 == (x << 5) + (x << 1)。当然,您也可以找到另一个支持186 instructions.的仿真器
https://stackoverflow.com/questions/64390306
复制相似问题