如何在程序集中访问C预处理程序常量?

如果我在C .h文件中定义一个常量:

#define constant 1 

如何在程序集.s文件中访问它?

如果你使用GNU工具链,gcc默认会在扩展名为.S (大写’S’)的文件上运行预处理器。 因此,您可以使用程序集文件中的所有cppfunction。

有一些警告:

  • 汇编程序和预处理程序对输入进行标记的方式可能存在差异。
  • 如果#include头文件,它们应该只包含预处理器指令,而不是像函数原型这样的C函数。
  • 您不应该使用#views,因为它们将由预处理器解释。

例:

文件定义.h

 #define REGPARM 1 

档案asm.S

 #include "definitions.h" .text .globl relocate .align 16 .type relocate,@function relocate: #if !REGPARM movl 4(%esp),%eax #endif subl %ecx,%ecx ... 

即使您不使用gcc,也可以使用相同的方法,只要汇编程序的语法与C预处理程序合理兼容(请参阅上面的警告)。 大多数C编译器都可以选择只预处理输入文件(例如gcc中的-E ),或者您可以将预处理器作为单独的可执行文件。 您可以在构建工具中组装之前包含此预处理。

除非特定的开发链允许,否则你不能。 但是在嵌入式编程的20年左右的时间里,我从未见过。

通常,汇编和C进行通信的唯一方法是链接器,即C / C ++中定义的标签可以从汇编中访问(反之亦然)。

当我不得不在C / C ++和asm之间共享定义时,我通常使用自定义代码生成器来完成它。

由于高级数据很少与汇编交换,因此一些定义并且可能一些外部引用通常就足够了,因此代码生成器非常容易实现。

您可以使用例如perl或awk来解析一个非常简单的公共常量列表并生成一对文件,一个用#defines,另一个用等效的EQU指令。