GNU汇编程序 - 如何使用.ifdef与逻辑AND,OR

时间:2017-12-14 05:35:56

标签: if-statement gcc assembly arm gas

在C中我可以使用

#if defined(MULTI_CORE) || defined(CORE_INDEX)

如何在arm程序集文件中实现相同的结果(使用.ifdef或.if或任何其他支持的表达式)?我正在使用GCC编译器工具链。

1 个答案:

答案 0 :(得分:2)

.S文件中使用C预处理器语法,与在.c / .h中完全相同。使用gcc -c foo.S(不直接as)构建代码,这会导致gcc(编译器前端)通过CPP运行您的文件,然后再将其提供给as。< / p>

因此,CPP内容完全发生在任何.if GAS宏内容之前和之后。

.ifdef和其他GAS宏功能并未设计用于替换CPP。您假设使用CPP(或m4或其他)作为您的asm源的预处理器。

请注意,直接在as上使用.S通常会在x86上生成没有错误消息,因为#是该目标的GAS语法中的注释字符。例如将#if 0 / #endif放在一些说明中:它们将在foo.o之后as -o foo.o foo.S。所有#if行都被视为注释。

在ARM上你应该会出现嘈杂的故障,因为评论字符是@#用于immediates)。如果您真的想在任何平台上防止在没有CPP的情况下意外构建,您可以#define THIS_FILE_NEEDS_CPP然后在下一行写THIS_FILE_NEEDS_CPP THIS_FILE_NEEDS_CPP。 (两次,因此它不是有效的标签声明)。使用CPP宏处理,这将变为空行而不是无效的insn。 as会自行删除///* */个评论,因此您无法使用该评论。但大多数人都不做任何特别的事情;他们的构建脚本有效,他们不会在没有CPP的情况下随机构建.S个文件。

另见: