在C中我可以使用
#if defined(MULTI_CORE) || defined(CORE_INDEX)
如何在arm程序集文件中实现相同的结果(使用.ifdef或.if或任何其他支持的表达式)?我正在使用GCC编译器工具链。
答案 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
个文件。
另见:
.ifdef
测试符号,而不是.macro
宏).ifdef MACRO_FROM_CMDLINE
变为.ifdef 1
)。