gcc 内联 asm 模板,用于不带哈希的常量

标签 gcc arm inline-assembly

我正在尝试发出基于#define VALUE 的全局符号。我的尝试如下:

__asm__ (".globl SYMBOL");
__asm__ (".set SYMBOL, %0" :: "i" (VALUE));

gcc 向汇编器发出的内容如下:

.globl SYMBOL
.set SYMBOL, #VALUE

如何删除 .setVALUE 之前的哈希值。 FWIW,我的目标是 ARM。

最佳答案

armclang定义了各种template modifiers可以与内联汇编一起使用。 gcc 在我检查过的每个实例中都支持它们,尽管它没有记录这一点。

特别是

c

Valid for an immediate operand. Prints it as a plain value without a preceding #. Use this template modifier when using the operand in .word, or another data-generating directive, which needs an integer without the #.

所以你可以这样做

__asm__ (".set SYMBOL, %c0" : : "i" (VALUE));

Try on godbolt

(gcc bugzilla 上有一些 Unresolved 错误,建议应记录模板/操作数修饰符。主要的似乎是 30527 ,我刚刚在那里发表了一条评论。开发人员的观点似乎是操作数修饰符是“编译器内部结构”,不适合最终用户,但特别是对于arm/aarch64,有一些简单的事情你无法以任何其他方式做。他们制作了 an exception for x86 ,那么为什么不在这里呢?)

关于gcc 内联 asm 模板,用于不带哈希的常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75192720/

相关文章:

c++ - Fedora 17 和 Google Protocol Buffers

c - 从位图中移除 Alpha channel (RGBA 到 RGB)

c++ - 如何使用 gcc/g++ 在 Linux 上编译 Windows?

arm - 从 linux 交叉编译到 ARM-ELF (armv5tejl )

c++ - 为什么发出空的 asm 命令会交换变量?

c++ - 切换 C++ 函数的调用堆栈

C中原子变量的比较

linux - 从 x_64 为 ARM 交叉编译 Chrome 时出错

gcc - 我怎样才能让 ARM MULL 指令在 gcc 的 uint64_t 中产生它的输出?

c++ - 带变量的 GCC 内联 ASM