如何在程序集中访问C预处理器常量?
如果我在C.h文件中定义了一个常数:如何在程序集中访问C预处理器常量?,c,assembly,c-preprocessor,C,Assembly,C Preprocessor,如果我在C.h文件中定义了一个常数: #define constant 1 如何在我的assembly.s文件中访问它?您不能,除非特定的开发链允许。但在大约20年的嵌入式编程中,我从未见过一个 通常,汇编和C进行通信的唯一方式是链接器,即C/C++中定义的标签可以从汇编内部访问(反之亦然) 当我必须在C/C++和asm之间共享定义时,我通常使用自定义代码生成器来实现 由于高级数据很少与程序集交换,所以通常只需几个定义和一些外部引用就足够了,因此代码生成器非常容易制作 例如,您可以使用perl
#define constant 1
如何在我的assembly.s文件中访问它?您不能,除非特定的开发链允许。但在大约20年的嵌入式编程中,我从未见过一个 通常,汇编和C进行通信的唯一方式是链接器,即C/C++中定义的标签可以从汇编内部访问(反之亦然) 当我必须在C/C++和asm之间共享定义时,我通常使用自定义代码生成器来实现 由于高级数据很少与程序集交换,所以通常只需几个定义和一些外部引用就足够了,因此代码生成器非常容易制作
例如,您可以使用perl或awk解析一个非常简单的公共常量列表,并生成一对文件,一个带有#defines,另一个带有等效EQU指令。如果您使用GNU工具链,默认情况下,gcc将在扩展名为
.S
的文件上运行预处理器。因此,您可以使用部件文件中的所有cpp功能
有一些警告:
- 汇编程序和预处理器标记输入的方式可能有所不同
- 如果包含头文件,它们应该只包含预处理器指令,而不是像函数原型这样的C代码
- 您不应该使用
注释,因为它们会被预处理器解释#
#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文件进行操作?