我正在尝试发出基于#define VALUE 的全局符号。我的尝试如下:
__asm__ (".globl SYMBOL");
__asm__ (".set SYMBOL, %0" :: "i" (VALUE));
gcc 向汇编器发出的内容如下:
.globl SYMBOL
.set SYMBOL, #VALUE
如何删除 .set
中 VALUE
之前的哈希值。 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));
(gcc bugzilla 上有一些 Unresolved 错误,建议应记录模板/操作数修饰符。主要的似乎是 30527 ,我刚刚在那里发表了一条评论。开发人员的观点似乎是操作数修饰符是“编译器内部结构”,不适合最终用户,但特别是对于arm/aarch64,有一些简单的事情你无法以任何其他方式做。他们制作了 an exception for x86 ,那么为什么不在这里呢?)
关于gcc 内联 asm 模板,用于不带哈希的常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75192720/