Chinaunix首页 | 论坛 | 博客
  • 博客访问: 839350
  • 博文数量: 85
  • 博客积分: 10016
  • 博客等级: 上将
  • 技术积分: 952
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-19 22:52
文章分类

全部博文(85)

文章存档

2011年(1)

2008年(1)

2007年(60)

2006年(23)

我的朋友

分类:

2007-03-24 21:06:29

    在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语言程序中都可引用该符号。(有待实践证实)


阅读(6846) | 评论(3) | 转发(0) |
给主人留下些什么吧!~~