2014-01-22 141 views

回答

5

如果您使用GNU工具链,默认情况下,gcc将在扩展名为.S(大写'S')的文件上运行预处理器。所以你可以在你的程序集文件中使用所有的cpp功能。

有一些注意事项:

  • 的方式汇编器和预处理器记号化的输入可能会有差异。
  • 如果你的头文件是#include,它们应该只包含预处理器指令,而不是像函数原型那样的C东西。
  • 您不应该使用#注释,因为它们会被预处理器解释。

例子:

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

2

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

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

当我不得不在C/C++和asm之间共享定义时,我通常使用自定义代码生成器来完成它。由于高级数据很少与程序集交换,因此少数定义和一些外部引用通常就足够了,因此代码生成器很容易实现。

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