【发布时间】: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