GNU 汇编程序 - 如何将 .ifdef 与逻辑与、或一起使用

GNU assembler- How to use .ifdef with logical AND,OR

在 C 中我可以使用

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

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

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

因此 CPP 的东西完全发生在任何 .if GAS 宏的东西之前并独立于任何 .if GAS 宏的东西。

.ifdef 和其他 GAS 宏功能并非旨在取代 CPP。您 应该 使用 CPP(或 m4 或其他)作为您的 asm 源代码的预处理器。


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

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

另请参阅:

  • Use of ifdef in gas assembly language。 (.ifdef 测试符号,而不是 .macro 宏)
  • gnu arm assembler command line macro fails with "Invalid identifier for .ifdef"(CPP 将 .ifdef MACRO_FROM_CMDLINE 变成了 .ifdef 1)。