【问题标题】:MOVXZ into register - "invalid operand for instruction"MOVXZ 进入寄存器 - “指令操作数无效”
【发布时间】:2016-10-24 23:56:44
【问题描述】:

我正在尝试编译基于汇编程序的 AES 实现,可查看 here。我的汇编程序给了我以下错误,重复了几次不同的时间,似乎是相同错误的实例。确切的源位置是here,但由于此文件中使用了大量的预处理器间接寻址,我从构建输出中复制了确切的错误,它给出了编译器看到的确切代码:

/Volumes/Sources/Andromeda/Kernel/libkern/crypto/aes/EncryptDecrypt.s:297:19: error: invalid operand for instruction
 movzx 240(%r10), %rax
                  ^~~~

我不太明白可能导致此问题的原因。如果我理解正确,这条指令将一个字节(或更多,这不清楚,实际上可能是问题的根源)移动到 RAX 寄存器中,如果源的大小小于 64 位,则将其零扩展.我是否需要通过在movxz 指令中添加标签来明确指定大小(例如movzxb)?还有什么可能是这个问题的原因?谢谢!

【问题讨论】:

  • at&t 语法通常不使用movzx,但也许某些汇编版本接受它。尝试将其更改为 movzbl 240(%r10), %eax(假设它是一个字节源)。
  • 或者movzbq 240(%r10), %rax
  • @FUZxxl 由于自动零扩展,这有点矫枉过正,但应该可以,是的。作为记录,我的汇编器(GNU assembler 2.22)也接受原始的movzx。 OSX 版本可能不会。
  • @FUZxxl:我认为我的情况的正确助记符是movzlq(因为我将一个4字节数据[l]移动到一个8字节寄存器[q]) ,但我的汇编程序说这是一个无效的助记符。
  • 在这种情况下,只需执行一个简单的movl 240(%r10), %eax,因为 32 位会自动由 cpu 进行零扩展。

标签: macos assembly x86 kernel att


【解决方案1】:

At&t 语法通常不使用movzx,但也许某些汇编版本接受它。我的 GNU assembler 2.22 有,但 OSX 版本可能没有。在任何情况下,汇编器都会为字节源生成代码。如果你确实有,正确的 at&t 语法应该是 movzbq 240(%r10), %rax,或者,利用自动零扩展,movzbl 240(%r10), %eax

如果您有一个 4 字节的源,那么您根本不能使用 movzx,因为它不存在该操作数类型。在这种情况下,您需要的只是自动零扩展,因此您只需执行movl 240(%r10), %eax

【讨论】:

    猜你喜欢
    • 2014-04-15
    • 2016-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    • 2019-01-02
    相关资源
    最近更新 更多