If statement GNU汇编程序-如何将.ifdef与逻辑AND、OR一起使用

If statement GNU汇编程序-如何将.ifdef与逻辑AND、OR一起使用,if-statement,gcc,assembly,arm,gnu-assembler,If Statement,Gcc,Assembly,Arm,Gnu Assembler,在C语言中,我可以使用 #if defined(MULTI_CORE) || defined(CORE_INDEX) 如何在arm程序集文件中实现相同的结果(使用.ifdef或.if或任何其他受支持的表达式)?我正在使用GCC编译器工具链。在.S文件中使用C预处理器语法,就像在.C/.h中一样。使用gcc-cfoo.S(而不是直接使用as)构建代码,这会导致gcc(编译器前端)在将文件作为馈送到之前通过CPP运行文件 因此,CPP填充完全发生在任何.if气体宏填充之前,并与之分开 .ifdef

在C语言中,我可以使用

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

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

.S
文件中使用C预处理器语法,就像在
.C
/
.h
中一样。使用
gcc-cfoo.S
(而不是直接使用
as
)构建代码,这会导致
gcc
(编译器前端)在将文件作为
馈送到
之前通过CPP运行文件

因此,CPP填充完全发生在任何
.if
气体宏填充之前,并与之分开

.ifdef
和其他GAS宏功能的设计目的不是取代CPP。您应该使用CPP(或
m4
或其他)作为asm源的预处理器


请注意,直接在
.S
上使用
as
通常在x86上构建时不会出现错误消息,因为
#
是该目标的GAS语法中的注释字符。e、 g.将
#if 0
/
#endif
放在一些指令周围:它们将在
foo.o
之后作为-o foo.o foo.S
。所有
#if
行都被视为注释

在ARM上,您应该会遇到嘈杂的故障,因为注释字符是
@
#
用于立即)。如果您真的想防止在任何平台上意外生成没有CPP的文件,您可以定义此文件需要CPP
,然后在下一行写入
此文件需要CPP此文件需要CPP
。(两次,因此这不是有效的标签声明)。使用CPP宏处理,这将成为一个空行,而不是无效的insn
as
会自动删除
/
/***/
注释,因此您不能仅使用它。但是大多数人没有做任何特别的事情;他们的构建脚本可以工作,并且在没有CPP的情况下不会随机构建
.S
文件

另见:

  • 。(
    .ifdef
    测试符号,而不是
    .macro
    宏)
  • (CPP将
    .ifdef宏\u从\u CMDLINE
    转换为
    .ifdef 1

如果使用扩展名
.S
重命名程序集文件,则可以使用C预处理器指令,如
\If
\ifdef
等,以及程序集文件中的C宏处理等。我查找了一个副本,但没有找到,因此我想我会将这些注释转化为答案。