我在带有基于 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 $0xFFFFFFFFFFFFFFFF, %rax
^
这条指令用于 Intel 语法,因为我包含了
.S 文件开头的 .intel_syntax noprefix
标志。
似乎在我更新 Mac 操作系统(更新了 LLVM 编译器、链接器和 Make)后,错误消息开始出现。
有谁知道可能导致此问题的原因吗?
最佳答案
适用于我的 AT&T 语法,使用 mov $-1, %rax
或 mov $0xFFFFFFFFFFFFFFFF, %rax
,或使用 movq
隐式保留操作数大小。
在 Intel 语法中,您不能再使用操作数大小 q
后缀来设置操作数大小;它由寄存器或内存操作数上的 qword ptr
覆盖来暗示。
movq
是诸如 movq xmm0, rax
或 movq xmm0, xmm1
等指令的助记符(两个独立的操作码/指令集手动条目,两者都使用 movq 助记符,一个是 movd xmm, r/m32
的 REX 形式,另一个是 xmm/mmx movq xmm, xmm/m64
)
mov $-1, %rax
mov $0xFFFFFFFFFFFFFFFF, %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++ 时无效,- 也无效游行=本地
。 Clang 的汇编器不限制基于 -march
的指令选择;它仅设置编译器的代码生成的目标。 (您提供的所有选项都不会造成伤害,但它们对 .S
没有任何影响,除了 -g
之外。)
关于assembly - 使用 clang 的指令 movq 的操作数无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49933466/