使用 clang 的指令 movq 的操作数无效

Invalid operand for instruction movq using clang

我在带有基于 LLVM 的 clang-902.0.39.1 编译器的 Intel Core i5 上使用 movq X86_64 汇编指令。

Intel 语法中的简化代码(在 my_asm.S 文件中)如下所示:

.intel_syntax noprefix

#define a_const   0xFFFFFFFFFFFFFFFF

movq   rax, a_const

我正在编译

clang -c -g -O3 -fwrapv -fomit-frame-pointer -march=native my_asm.S

编译器给我以下信息:

error: invalid operand for instruction
movq rax, 0xFFFFFFFFFFFFFFFF
^

我也尝试了评论中建议的 AT&T 语法:

movq   $a_const, %rax

给出了错误

error: unknown token in expression
movq [=16=]xFFFFFFFFFFFFFFFF, %rax
^

此指令用于 Intel 语法,因为我包含了 .intel_syntax noprefix 标志在我的 .S 文件的开头。 似乎在我更新 Mac OS(更新了 LLVM 编译器、链接器和 Make)后,错误消息开始出现。

有没有人知道可能导致此问题的原因?

在 AT&T 语法中使用 mov $-1, %raxmov [=13=]xFFFFFFFFFFFFFFFF, %raxmovq 对我有效,而不是隐含操作数大小。

在 Intel 语法中,您不能再使用操作数大小 q 后缀来设置操作数大小;它由寄存器或内存操作数上的 qword ptr 覆盖暗示。

movqmovq xmm0, raxmovq xmm0, xmm1 等指令的助记符(两个单独的操作码/指令集手册条目都使用 movq 助记符,一个是 movd xmm, r/m32,另一个是 xmm/mmx movq xmm, xmm/m64)

mov    $-1, %rax
mov    [=10=]xFFFFFFFFFFFFFFFF, %rax

.intel_syntax noprefix
mov    rax, -1
mov    rax, 0xFFFFFFFFFFFFFFFF

clang -c 汇编得很好,相同指令的 4 个副本:

0:   48 c7 c0 ff ff ff ff    mov    rax,0xffffffffffffffff

请注意,-f...-O3 code-gen 选项仅在汇编时无效,不编译 C/C++,-march=native 也无效。 Clang 的汇编程序不限制基于 -march 的指令选择;它只设置编译器的代码生成目标。 (None 你给出的选项 伤害 ,但它们对 .S 没有影响,除了可能 -g。)