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

标签 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

编译器给我以下消息:

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, %raxmov $0xFFFFFFFFFFFFFFFF, %rax,或使用 movq隐式保留操作数大小。

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

movq 是诸如 movq xmm0, raxmovq 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/

相关文章:

performance - 充分利用卡比湖上的管道

c - 为什么 float 和 int 相加结果是 float?

objective-c - 禁用实例方法未找到警告

C/C++ Linux x86_64中基于CPU周期计数的性能分析

c++ - fetch_add(0, memory_order_relaxed/release) 到 mfence + mov 的转换是否合法?

c++ - g++ 生成的程序集看起来很难看

c - 需要帮助在给定 64 位汇编指令的情况下在 C 中构建 Long loop(long x, int n) 函数

c - 在通用位掩码宏中消除 -Wshift-count-overflow 警告

x86 - 为什么 32 位驱动程序在 64 位上不起作用

c++ - 高级和低级编程语言之间的关系