【问题标题】:GNU assembler- How to use .ifdef with logical AND,ORGNU 汇编器 - 如何将 .ifdef 与逻辑 AND、OR 一起使用
【发布时间】:2017-12-14 05:35:56
【问题描述】:

在 C 中我可以使用

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

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

【问题讨论】:

  • 如果你用 .S 扩展名重命名你的程序集文件,你可以使用 C 预处理器指令,如 #if#ifdef 等以及 C 汇编文件中的宏处理等
  • 我找了一个重复的,没有找到,所以我想我会把那些 cmets 变成答案。

标签: if-statement gcc assembly arm gnu-assembler


【解决方案1】:

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

因此,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 行都被视为cmets。

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

另见:

【讨论】:

    猜你喜欢
    • 2020-08-07
    • 1970-01-01
    • 2011-05-23
    • 2017-08-05
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    • 2011-06-19
    相关资源
    最近更新 更多