gpt4 book ai didi

assembly - x86-16 imul 指令 "wrong parameters"?

转载 作者:行者123 更新时间:2023-12-04 08:44:36 25 4
gpt4 key购买 nike

所以,我有这样的代码:

    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在 emu8086 中。
如果使用像 IMUL EAX, 34 这样的 32 位寄存器应该没问题(不在 emu8086 中)。
我该如何解决这个问题?

最佳答案

IMUL instruction 的直接形式, 操作码 6B69 , 实际上需要三个操作数,它们的大小都相同(这里是 16 位):IMUL r, r/m, imm .它将第二个操作数乘以第三个操作数并将结果放在第一个操作数中,在溢出时截断。原始 8086 不支持这种形式,但在 80186 中作为扩展添加,大约在 1982 年,并且得到了所有较新的 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 ,所以您在 DX 中的零值如果结果为负数或大于 32767 将被破坏;您需要相应地调整您的代码。
    或者用移位和添加重写它,这可能更有效:x * 34 == (x << 5) + (x << 1) .或者,当然,您可以找到另一个支持 186 条指令的模拟器。
  • 关于assembly - x86-16 imul 指令 "wrong parameters"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64390306/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com