我正在尝试编译基于汇编程序的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
)?还有什么可能是导致这个问题的原因?谢谢!
答案 0 :(得分:2)
At& t语法通常不使用movzx
,但也许某些汇编程序版本接受它。我的GNU汇编程序2.22副本可以,但也许OSX版本没有。在任何情况下,汇编程序都会为字节源生成代码。如果你确实这样做了,那么正确的at&t语法将是movzbq 240(%r10), %rax
,或利用自动零扩展movzbl 240(%r10), %eax
。
如果您有一个4字节的源,则根本不能使用movzx
,因为该操作数类型不存在。在这种情况下,您只需要自动零扩展,因此您只需执行movl 240(%r10), %eax
。