Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos MOVXZ进入寄存器-“;指令“的操作数无效”;_Macos_Assembly_X86_Kernel_Att - Fatal编程技术网

Macos MOVXZ进入寄存器-“;指令“的操作数无效”;

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

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

/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自动进行零扩展。