我正在使用英特尔酷睿 i5 上的movq
X86_64汇编指令和基于 LLVM 的 clang-902.0.39.1 编译器。
简化的代码(在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
编译器给我以下消息:
错误:指令
movq rax 的操作数无效,0xFFFFFFFFFFFFFFFF
^
我还尝试了评论中建议的AT&T语法:
movq $a_const, %rax
这给出了错误
错误:表达式
Movq $0xFFFFFFFFFFFFFFFF、%rax
^ 中的未知标记
此指令用于英特尔语法,因为我包括.intel_syntax noprefix
标志在我的开头.S 文件。 似乎在我更新了Mac OS(更新了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/mmxmovq 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
代码生成选项在仅组装、不编译 C/C++ 时不起作用,-march=native
也是如此。 Clang的汇编器不会根据-march
限制指令选择;它仅设置编译器的代码生成将面向的目标。 (你给出的选项都没有伤害,但它们对.S
没有影响,除了可能-g
。