首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >x86-16 imul指令“参数错误”?

x86-16 imul指令“参数错误”?
EN

Stack Overflow用户
提问于 2020-10-16 21:37:45
回答 1查看 230关注 0票数 2

所以,我有这样的代码:

代码语言:javascript
复制
    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中),应该没问题。

我该怎么解决这个问题呢?

EN

回答 1

Stack Overflow用户

发布于 2020-10-17 10:10:38

IMUL instruction的直接形式,操作码6B69,实际上需要三个大小相同的操作数(这里是16位):IMUL r, r/m, imm。它将第二个操作数乘以第三个操作数,并将结果放在第一个操作数中,在发生溢出时截断。最初的8086不支持这种形式,但在大约1982年的80186中作为扩展添加了这种形式,并且所有较新的x86处理器都支持这种形式。

您的32位汇编器显然支持将IMUL EAX, 34作为IMUL EAX, EAX, 34的语法糖,同时使用EAX作为源和目标操作数。

所以这里有三种可能性;我对emu8086一无所知,所以不确定哪一种适用。

  • 也许您的emu8086仿真器/汇编程序确实支持186条指令,但不支持语法糖。在这种情况下,您只需编写IMUL AX, AX, 34.

  • 可能emu8086当前设置为仅支持原始8086指令集,但具有添加186扩展的一些选项。在这种情况下,一旦启用该选项,就应该能够使用所需的指令,可能使用上面列出的三操作数语法。

  • 或emu8086,顾名思义,只支持8086指令集,句号。在这种情况下,您必须重写代码以使用单操作数形式的IMUL r/m,并将常量34加载到寄存器中(或将其放入内存中)。请注意,IMUL r/m正在扩大范围,并将其32位结果放入DX:AX中,因此,如果结果为负或大于32767,DX中的零值将被销毁;您需要相应地调整代码。

或者用移位和加法重写它,这可能会更有效:x * 34 == (x << 5) + (x << 1)。当然,您也可以找到另一个支持186 instructions.的仿真器

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64390306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档