4
A
回答
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指令。
相關問題
- 1. 如何訪問angularjs中的預處理
- 2. 如何訪問Spring MVC異常處理程序中的@PathVariable?
- 3. C++預處理器變量
- 4. 如何在程序集預處理器中傳遞--defsym?
- 5. 處理集問題的C程序
- 6. 使用程序集c中的異常自我處理程序
- 7. C++預處理程序
- 8. C預處理程序庫
- 9. Windows Phone 8.1的預處理器常量
- 10. ConnectJS/ExpressJS url處理程序的常用預處理程序?
- 11. 如何在ExtJS事件處理程序中訪問類變量?
- 12. C++異常處理程序問題
- 13. 訪問WMI中的處理器數量
- 14. 如何在運行時在ASP.NET/C#中獲得預處理器常量的值?
- 15. C++程序中未處理的異常
- 16. C++預處理器
- 17. 如何在Rust中訪問C常量?
- 18. 如何處理外部/未知DynamicMethods程序集中的異常
- 19. 乘以預處理器常量在Objective - C
- 20. C++預處理器如何工作?
- 21. C++預處理器和超載問題
- 22. 沒有C預處理器處理浮點數學常數
- 23. NODE.JS訪問socket.IO事件處理程序中的共享變量
- 24. 用smalltalk訪問事件處理程序中的實例變量
- 25. 在Boost預處理器中混合變量和整型常量
- 26. 如何獲得Emacs的妥善處理C預處理器
- 27. 是否有任何C預處理器作爲獨立程序?
- 28. 如何訪問另一個類中的事件處理程序
- 29. 如何訪問在config中定義的處理程序?
- 30. 如何訪問事件處理程序中的屬性?
這是一個宏不是一個常數。預處理器是否在您的asm文件上運行? –