c语言使用汇编语言的头文件,ADS中汇编与C头文件的杂碎事

在C语言*.h头文件中使用#define定义一个常量或符号,在汇编语言中如何引用?

例如在testheader.h中: #define init_MDREFR   0x0011e018

尝试(1):在要使用该符号或常量的汇编源程序中使用IMPORT init_MDREFR,不行。

尝试(2):在要使用该符号或常量的汇编源程序中使用INCLUDE testheader.h,报错:Unknown opcode。

也就是说,在C头文件中用#define定义的符号和常量是不能被汇编程序引用的。

这样,在启动代码中用汇编定义某符号;在应用程序中用C头文件定义一个同名的符号,两者会否干扰?

试验:

在某*.s汇编程序中用“init_MDREFR EQU     0x0011e018”定义常量init_MDREFR,在testheader.h头文件中用#define init_MDREFR   0x11定义常量init_MDREFR,并在*.c程序中包含该头文件。*.s和*.c文件在同一个工程中。

编译通过,并且通过查看C源程序的反汇编代码(选中C文件右键菜单Disassemble),可以看到在C程序中,init_MDREFR的值为0x11,与其包含的头文件中定义的一样。不过,反汇编代码中看不出init_MDREFR的符号名称。而在map文件中得到的符号表(Symbols)中,只发现了*.s文件中定义的符号init_MDREFR。

不过,至少程序的编译和链接似乎是不受影响的。

这样,在启动代码中,对GPIO的初始化,可以用汇编语言对GPIO控制器寄存器进行定义;在C应用程序中要使用GPIO进行实时控制时,可以使用C头文件对GPIO控制寄存器进行定义。两者不会相互干扰。

另一种考虑是,对于小型的嵌入式应用,启动时需要初始化的关键I/O是很少的。因此,在完成对存储系统的初始化(包括MMU地址映射)和各模式栈指针初始化后,就可以进入C语言程序部分,使用C语言来对GPIO口进行配置。

还有一种考虑,可以让*.s汇编程序认识#define定义的符号和常量,就是在一个.s汇编文件中定义一个宏,用这个宏来解析#define的定义;这个宏的定义可以参考《ARM体系结构与编程》一书的4.6节。这样,可以只在C头文件中定义一次寄存器或符号,而在汇编和C语言程序中都可引用该符号。(有待实践证实)

阅读(6453) | 评论(3) | 转发(0) |

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值