【问题标题】:Unable to include ASM header file in C without losing preprocessor无法在 C 中包含 ASM 头文件而不丢失预处理器
【发布时间】:2018-05-11 23:04:32
【问题描述】:

短版:

我希望能够在 macros.S 中定义汇编器宏,并在 GNU C 中的 asm() 语句中使用它们。

我可以在我的 C 源代码顶部附近使用 asm(".include \"macros.S\""); 执行此操作,但我希望 macros.S 通过 C 预处理器。


长版:

在 GCC asm 中,*.S 文件由 C 预处理器进行预处理,允许使用 C 样式 #define 等。

在 GCC C 中,您可以通过在文件顶部附近写入 asm(".include \"myasmheader.S\""); 来包含 asm 头文件(可能包括 asm 宏定义、.set 声明等)。

以这种方式包含 ASM 头文件允许您在 asm 块中使用 asm 宏。

不幸的是,这样做不会在包含的.S 文件上调用C 预处理器(因为.include 在编译过程的后期完成),因此#defines 不再被替换。

那么有什么方法可以在 C 文件中正确包含 .S 文件?

其他一些编译器支持:

#asm
#include "myasmheader.S"
#endasm

不会出现这样的问题。但可惜的是,GCC 似乎要求 C 文件中的所有 asm 都是字符串的形式。

除了不使用 asm(不是一个选项,大量混合 asm 和 c 的嵌入式 DSP 项目),或者在 ASM 文件中取消使用 C 预处理器之外,还能做什么?

【问题讨论】:

  • 使用 cpp 手动预处理它作为一个独特的构建步骤。
  • 我花了一段时间才弄明白你在问什么,所以我写了一个简短的问题版本,以方便未来的读者。这使文本的其余部分变得多余,但我不想只删除其中的大块。
  • 关于箭头建议 -> 是的,首先在单独的构建步骤中从 myasmheader.S 生成 myasmheader.s,然后在 C 文件中生成 .include \"myasmheader.s\"。 (如果您使用的是一些奇怪的过时操作系统,它具有不区分大小写的文件系统,请使用不同的扩展名,sS 在 *NIX 系统上的 gcc 中很常见,其中文件名区分大小写)。
  • @arrowd 是的,我相信这会奏效。我会试一试,如果有人想把它写成答案,我会接受,否则我会在这里发布以供将来参考。感谢您的帮助,不胜感激:)
  • @Mania 请发表您自己的答案。我会很感激把这个从未回答的问题列表中删除。

标签: c gcc assembly c-preprocessor inline-assembly


【解决方案1】:

来自cmets:

将 ASM 文件的预处理(通过 cpp)作为一个独特的构建步骤添加到您正在使用的构建系统中。

感谢arrowdPed7g

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    • 2019-06-22
    • 1970-01-01
    相关资源
    最近更新 更多