我使用基于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
编译器给我以下消息:
错误:指令的无效操作数
movq rax,0xFFFFFFFFFFFFFFFF
^
我还尝试了评论中建议的AT& T语法:
movq $a_const, %rax
给出错误
错误:表达式中的未知标记
movq $ 0xFFFFFFFFFFFFFFFF,%rax
^
此指令用于处理Intel语法,因为我包含了
我的.S文件开头的.intel_syntax noprefix
标志。
在我更新了我的Mac OS(更新了LLVM编译器,链接器和Make)之后,似乎错误消息开始出现。
有没有人知道可能导致这种情况的原因?
答案 0 :(得分:2)
使用mov $-1, %rax
或mov $0xFFFFFFFFFFFFFFFF, %rax
或movq
以AT& T语法为我工作,而不是隐含操作数大小。
在Intel语法中,您不能再使用操作数大小q
后缀来设置操作数大小;它在寄存器中隐含,或者在内存操作数上覆盖qword ptr
。
movq
是movq xmm0, rax
或movq xmm0, xmm1
等指令的助记符(两个单独的操作码/指令集手动条目都使用movq助记符,一个是{{1的REX形式] },另一个是xmm / mmx movd xmm, r/m32
)
movq xmm, xmm/m64
使用mov $-1, %rax
mov $0xFFFFFFFFFFFFFFFF, %rax
.intel_syntax noprefix
mov rax, -1
mov rax, 0xFFFFFFFFFFFFFFFF
汇编到同一指令的4个副本:
clang -c
请注意,0: 48 c7 c0 ff ff ff ff mov rax,0xffffffffffffffff
和-f...
代码生成选项仅在组装时没有效果,不会编译C / C ++,也不会-O3
。 Clang的汇编程序并不限制基于-march=native
的指令选择;它只设置编译器代码生成的目标。 (您没有给出伤害的选项,但除了-march
之外,它们对.S
无效。)