【发布时间】: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\"。 (如果您使用的是一些奇怪的过时操作系统,它具有不区分大小写的文件系统,请使用不同的扩展名,s与S在 *NIX 系统上的 gcc 中很常见,其中文件名区分大小写)。 -
@arrowd 是的,我相信这会奏效。我会试一试,如果有人想把它写成答案,我会接受,否则我会在这里发布以供将来参考。感谢您的帮助,不胜感激:)
-
@Mania 请发表您自己的答案。我会很感激把这个从未回答的问题列表中删除。
标签: c gcc assembly c-preprocessor inline-assembly