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
)。
在 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
)。