【问题标题】:MUL instruction "Invalid combination of opcode and operands" x86 NASM [duplicate]MUL指令“操作码和操作数的无效组合”x86 NASM [重复]
【发布时间】:2021-01-16 20:03:02
【问题描述】:

我一直在使用 x86 程序集

我写的这个循环的当前状态是:

edi: 临时结果 esi: 指数 edx:原号

mov esi, [y]
mov edi, [x]
mov edx, [x]
.powloop:
    mul edi, edx
    sub esi, 1
    cmp esi, 0
    jnz .powloop
    ret

当我组装我得到这个错误:

main.asm:22: error: invalid combination of opcode and operands

22 是出现mul edi, edx 的行。

我做错了什么,有什么方法可以解决这个问题?

【问题讨论】:

  • 如果您遇到此类错误,请查阅指令集参考以了解哪些操作数有效。

标签: assembly x86 nasm


【解决方案1】:

mul 指令不使用两个操作数。
mul 指令强制使用EAX 寄存器和另一个操作数。

您可以在EAX中加载原始号码。

; x^y
  mov eax, [x]
  mov esi, [y]
  dec esi
  jz  Done
More:
  mul [x]
  dec esi
  jnz More
Done:

【讨论】:

  • 单操作数 mul 在大多数 CPU 上比 imul edi, edx 慢,并且 imul 允许任意选择寄存器分配。每次迭代重新加载内存源操作数在实践中可能并没有什么坏处。如果它是微型熔断器,它可能会节省前端 uops,但不会节省后端 uops。使用直接寻址模式实际上也比仅使用mov eax, edx 或循环之前的任何方式更大。
猜你喜欢
  • 2015-07-31
  • 2013-02-14
  • 1970-01-01
  • 1970-01-01
  • 2011-07-23
  • 2020-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多