如何强制将常量 C 表达式求值用作 .S 文件中的常量?

Posted

技术标签:

【中文标题】如何强制将常量 C 表达式求值用作 .S 文件中的常量?【英文标题】:How do I force a constant C-expression evaluation for use as a constant in a .S file? 【发布时间】:2013-03-16 23:13:10 【问题描述】:

我从/usr/include/**/asm 中包含的一个头文件(粗鲁?)使用简单的 C 表达式来表示相对于基值的偏移量,即:

#define __NR_exit                       (__NR_SYSCALL_BASE+  1)

当然,当我将 #include 写入我的 .S 文件时,预处理器生成的 asm 会显示:

start.S|17| Error: garbage following instruction -- `ldr r7,=$(0+1)'

所以,听起来很疯狂,我想我希望 C 预处理器(或汇编器)对宏进行 constexpr 评估,以便实际使用它,尽管其中有 C 算术 + 运算符和括号——这样做的正确方法是什么?

请注意,这不是内联 asm,而是“异常”.S 文件。

【问题讨论】:

【参考方案1】:

哎呀,这只是因为有一个错误的美元符号。如果您将其更改为:

ldr r7,=__NR_exit

它似乎编译得很好。我猜as 在它需要常量的位置支持基本算术表达式。

【讨论】:

不幸的是,这个解决方案是特定于 ISA 的。在括号是 asm 常量中的有效分组运算符的 ISA 上,它可以正常工作。然而,在 x86 asm 中,括号是有效地址/取消引用的助记语法的一部分。我怀疑 Linux 的标头通过明确写出数字来避免此类拱门上的问题,但您应该知道,此解决方案绝不是通用的,它仅 碰巧在您的拱门上工作正在看…… @R.:解析汇编源代码是汇编器的功能,而不是 ISA。这也不是用于寻址的括号的问题。汇编语法通常以允许它们包含用于分组的括号而不被混淆为寻址的方式来区分立即值(如通过使用“=”或“$”引入它们)。

以上是关于如何强制将常量 C 表达式求值用作 .S 文件中的常量?的主要内容,如果未能解决你的问题,请参考以下文章

如果表达式的求值需要对引用求值,为啥它不是“核心常量表达式”?

ARM逆向-表达式求值

ARM逆向-表达式求值

C++11 中的 ConstExpr 对象中的可变成员

如何将 java 类名作为参数传递并将其用作方法中的强制转换

常量表达式