使用clang

时间:2018-04-20 03:25:32

标签: assembly clang x86-64 att

我使用基于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)之后,似乎错误消息开始出现。

有没有人知道可能导致这种情况的原因?

1 个答案:

答案 0 :(得分:2)

使用mov $-1, %raxmov $0xFFFFFFFFFFFFFFFF, %raxmovq以AT& T语法为我工作,而不是隐含操作数大小。

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

movqmovq xmm0, raxmovq 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无效。)