MOVXZ 到寄存器 - "invalid operand for instruction"

MOVXZ into register - "invalid operand for instruction"

我正在尝试编译 AES 的基于汇编程序的实现,可见 here. My assembler is giving me the following error, repeated several different times over what appear to be instances of the same error. The exact source location is 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,但也许某些汇编程序版本接受它。我的 GNU 汇编器 2.22 副本可以,但也许 OSX 版本没有。在任何情况下,汇编程序都会为字节源生成代码。如果你确实有那个,正确的 at&t 语法应该是 movzbq 240(%r10), %rax,或者,利用自动零扩展,movzbl 240(%r10), %eax.

如果你有一个 4 字节的源,那么你根本不能使用 movzx,因为它不存在那个操作数类型。在这种情况下你需要的只是自动零扩展,所以你可以简单地做 movl 240(%r10), %eax.