基于Keil的51单片机汇编程序多文件编译
2014-04-29陈彩欢甘露
陈彩欢 甘露
引言:本文结合Keil μVision2程序开发流程,描述了51单片机汇编程序多文件编译的实现方法。通过多文件编译的使用,大大提高了汇编程序代码的可读性、可扩展性,同时也很大程度地提高程序代码的执行效率以及内存空间的使用率,避免内存空间的浪费。
一、序言
近年来,随着C语言的进一步推广使用,绝大多数的工程师都倾向于使用C语言进行单片机系统开发,汇编语言由于可读性、通用性、可移植性差的原因,很难满足产品开发的需求。但是汇编语言具有执行效率高、占用内存空间小等特点,在某些应用领域还是具有无可替代的作用。
本文结合Keil μVision2程序开发流程,描述了51单片机汇编程序多文件编译的实现方法。通过多文件编译的使用,大大提高了汇编程序代码的可读性、可扩展性,同时也很大程度地提高程序代码的执行效率以及内存空间的使用率,避免内存空间的浪费。
二、Keil μVision2程序开发流程简介
Keil μVision2是美国Keil Software公司出品的51系列兼容单片机软件集成开发环境,该软件提供宏汇编器、链接/定位器、库管理器、调试器以及目标文件转换器等工具,是51单片机系统开发的首选工具。
Keil μVision2集成开发环境的编译流程如下:首先宏汇编器对汇编源程序文件进行编译,生成扩展名为.OBJ的目标文件和扩展名为.LST的列表文件,紧接着链接/定位器将所有的.OBJ文件进行绝对地址分配,链接生成包含绝对地址的目标文件和扩展名为.M51的地址文件,最后由目标文件转换器生成可用于编程器烧写、扩展名为.HEX的可执行文件。
三、汇编程序多文件编译实现
在Keil μVision2集成开发环境下,我们可以根据不同的硬件模块、功能模块分开编写应用子程序,进行模块化管理,实现多文件编译,这样就可以大大提高汇编程序代码的可读性、可扩展性。以下首先对段和模块的概念进行描述。
一个段可以是一块程序代码或者是一个数据块。根据其地址空间是否可以被链接/定位器更改,段可以分为可定位段和绝对地址段。在定义可重定位段的时候需要对其段名、类型及其属性进行定义。一个段可以分在不同的程序模块中,只要具有相同的段名,在编译过程中链接/定位器会把它们合并到一起。在定义绝对地址段的时候直接人为分配绝对地址,链接/定位器不能对改地址进行更改。绝对地址段没有段名,也不能给其他段结合。
模块是一个可以被单独编译的代码单元,可以包含一个或多个段或者部分段,一个模块既可以是单个文本文件,也可以通过INCLUDE指令把几个文本文件合并在一起。在程序编译过程中,汇编器会把一个模块编译为一个目标文件,也就是一个模块对应一个.OBJ文件。
根据以上对段和模块的描述,汇编程序的多文件编译可以通过以下三个方法来实现:
1、通过INCLUDE指令合并源文件
在代码编写时,通过INCLUDE指令可以将一个源文件插入到当前源文件中,这样汇编器在编译的时候就会将INCLUDE指令之后的文件合并到当前文件进行编译,生成一个扩展名为.OBJ的目标文件。INCLUDE指令的格式如下:
$ INCLUDE (文件名)
通过该方式实现多文件编译时,插入的源文件既可以是扩展名为.ASM的汇编源程序文件,也可以是扩展名为.INC的包含文件。注意在被包含的源文件结尾不能有END指令,否则编译会停止运行。
2、通过绝对地址段实现多文件编译
Keil μVision2中提供以下定义绝对地址段的指令,通过这些指令可以定义代码段和各种数据段,并指定其绝对地址。
由于绝对地址段在定义的时候对地址进行了分配,链接/定位器不能够对其地址进行更改,因此很容易造成地址重叠或者内存空间浪费,而且在后续对程序进行维护、升级的时候很有可能需要重新对地址进行分配,非常不利于程序的扩展和维护。因此绝对地址段通常是用在某些特定的场合,例如确定中断向量的入口地址、数据存储空间等。
3、通过可重定位段实现多文件编译
在Keil μVision2中,通过SEGMENT指令即可定义可重定位段。定义可重定位段时必须指定段的名称和存储类型,其格式如下:
四、总结
通过以上三种方式,均可以实现多文件编译,但是在实际使用过程中,INCLUDE指令通常用于包含特殊功能寄存器的定义等;绝对地址段则通常用于确定中断向量的入口地址、数据存储空间;而可重定位段的方式则广泛地用于各种代码段或数据段的定义。
通过多文件编译的方式,解决了单文件编译会导致程序文件过于臃肿、可读性差、不便于维护等缺点,大大提高汇编程序代码的可读性以及可维护性。
参考文献
[1] Keil Software. A51/AX51/A251 Macro Assembler and Utilities.2001.
[2]孙涵芳,徐爱卿.MCS-51/96系列单片机原理及应用(修订版).1996.
(作者单位:1、珠海格力电器股份有限公司;2、格力电器(合肥)有限公司)