使用 clang 的指令 movq 的操作数无效



我正在使用英特尔酷睿 i5 上的movqX86_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, %raxmov $0xFFFFFFFFFFFFFFFF, %raxmovq而不是保留操作数大小隐式对我有用。

在 Intel 语法中,您不能再使用操作数大小q后缀来设置操作数大小;它由寄存器暗示,或对内存操作数进行qword ptr覆盖。

movqmovq xmm0, raxmovq 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

相关内容

最新更新