GNU汇编器 - 如何使用逻辑和或



在C中我可以使用

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

如何在ARM组装文件中获得相同的结果(使用.IFDEF或.IF或任何其他支持的表达式)?我正在使用GCC编译器工具链。

使用.S文件中的C Preprocessor语法与.c/.h中的您一样。使用gcc -c foo.S(直接as)构建代码,这会导致gcc(编译器前端)通过CPP运行文件,然后再将其馈送到as

因此,cpp的东西完全发生在任何.if燃气宏的东西之前和分开发生。

.ifdef和其他气体宏功能并非旨在替换CPP。您假定使用CPP(或m4或其他)作为ASM源的预处理器。


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

在手臂上,您应该吵闹,因为注释字符是@(立即使用#)。如果您确实想在任何平台上不小心构建而不意外地构建,则可以#define THIS_FILE_NEEDS_CPP,然后在下一行上写THIS_FILE_NEEDS_CPP THIS_FILE_NEEDS_CPP。(两次,这不是有效的标签声明)。通过CPP宏处理,这将变成空白,而不是无效的INSN。as单独删除///* */评论,因此您不能仅使用它。但是大多数人没有做任何特别的事情。他们的构建脚本可以正常工作,并且不会随机构建.S文件,而没有CPP。

另请参见:

  • 在天然气组装语言中使用IFDEF。(.ifdef符号测试,而不是.macro宏)
  • GNU ARM汇编器命令行宏观宏观失败。(CPP将.ifdef MACRO_FROM_CMDLINE变成.ifdef 1)。

最新更新