使用 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, %rax
或 mov [=13=]xFFFFFFFFFFFFFFFF, %rax
或 movq
对我有效,而不是隐含操作数大小。
在 Intel 语法中,您不能再使用操作数大小 q
后缀来设置操作数大小;它由寄存器或内存操作数上的 qword ptr
覆盖暗示。
movq
是 movq xmm0, rax
或 movq 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
。)
我在带有基于 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, %rax
或 mov [=13=]xFFFFFFFFFFFFFFFF, %rax
或 movq
对我有效,而不是隐含操作数大小。
在 Intel 语法中,您不能再使用操作数大小 q
后缀来设置操作数大小;它由寄存器或内存操作数上的 qword ptr
覆盖暗示。
movq
是 movq xmm0, rax
或 movq 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
。)