在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语言程序中都可引用该符号。(有待实践证实)
阅读(6850) | 评论(3) | 转发(0) |