2014-01-22 135 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指令。