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文件上运行? –