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

如何在程序集中访问C预处理器常量?,c,assembly,c-preprocessor,C,Assembly,C Preprocessor,如果我在C.h文件中定义了一个常数: #define constant 1 如何在我的assembly.s文件中访问它?您不能,除非特定的开发链允许。但在大约20年的嵌入式编程中,我从未见过一个 通常,汇编和C进行通信的唯一方式是链接器,即C/C++中定义的标签可以从汇编内部访问(反之亦然) 当我必须在C/C++和asm之间共享定义时,我通常使用自定义代码生成器来实现 由于高级数据很少与程序集交换,所以通常只需几个定义和一些外部引用就足够了,因此代码生成器非常容易制作 例如,您可以使用perl

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

#define constant 1

如何在我的assembly.s文件中访问它?

您不能,除非特定的开发链允许。但在大约20年的嵌入式编程中,我从未见过一个

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

当我必须在C/C++和asm之间共享定义时,我通常使用自定义代码生成器来实现

由于高级数据很少与程序集交换,所以通常只需几个定义和一些外部引用就足够了,因此代码生成器非常容易制作


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

如果您使用GNU工具链,默认情况下,gcc将在扩展名为
.S
的文件上运行预处理器。因此,您可以使用部件文件中的所有cpp功能

有一些警告:

  • 汇编程序和预处理器标记输入的方式可能有所不同
  • 如果包含头文件,它们应该只包含预处理器指令,而不是像函数原型这样的C代码
  • 您不应该使用
    #
    注释,因为它们会被预处理器解释
例如:

文件定义.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
),或者将预处理器作为单独的可执行文件。您可能可以在构建工具中包含组装前的预处理。

这是一个宏,而不是常量。预处理器是否对asm文件进行操作?