Macos MOVXZ进入寄存器-“;指令“的操作数无效”;
我正在尝试编译一个基于汇编程序的AES实现,可查看。我的汇编程序给了我以下错误,在同一个错误的实例上重复了几次。确切的源位置是,但由于此文件中使用了大量的预处理器间接寻址,我已从生成输出中复制了确切的错误,这给出了编译器看到的确切代码:Macos MOVXZ进入寄存器-“;指令“的操作数无效”;,macos,assembly,x86,kernel,att,Macos,Assembly,X86,Kernel,Att,我正在尝试编译一个基于汇编程序的AES实现,可查看。我的汇编程序给了我以下错误,在同一个错误的实例上重复了几次。确切的源位置是,但由于此文件中使用了大量的预处理器间接寻址,我已从生成输出中复制了确切的错误,这给出了编译器看到的确切代码: /Volumes/Sources/Andromeda/Kernel/libkern/crypto/aes/EncryptDecrypt.s:297:19: error: invalid operand for instruction movzx 240(%r1
/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
,因为该操作数类型不存在它。在这种情况下,您所需要的只是自动零扩展,因此您只需执行movl240(%r10),%eax
at&t语法通常不使用movzx
,但可能一些汇编程序版本接受它。尝试将其更改为movzbl240(%r10),%eax
(假设它是一个字节源)。或者movzbq 240(%r10),%rax
@fuzzxl,由于自动零扩展,这是一种过度杀伤力,但应该可以工作,是的。作为记录,我的汇编程序(GNU汇编程序2.22)也接受原始的movzx
。OSX版本可能不会。@fuzzxl:我认为适合我的情况的正确助记符是movzlq
(因为我正在将一个4字节的数据[l
]移动到一个8字节的寄存器[q
]),但我的汇编程序说这是一个无效的助记符。在这种情况下,只需执行一个简单的movl240(%r10),%eax
因为32位由cpu自动进行零扩展。