陳彩歡 甘露
引言:本文結(jié)合Keil μVision2程序開發(fā)流程,描述了51單片機(jī)匯編程序多文件編譯的實(shí)現(xiàn)方法。通過多文件編譯的使用,大大提高了匯編程序代碼的可讀性、可擴(kuò)展性,同時(shí)也很大程度地提高程序代碼的執(zhí)行效率以及內(nèi)存空間的使用率,避免內(nèi)存空間的浪費(fèi)。
一、序言
近年來,隨著C語言的進(jìn)一步推廣使用,絕大多數(shù)的工程師都傾向于使用C語言進(jìn)行單片機(jī)系統(tǒng)開發(fā),匯編語言由于可讀性、通用性、可移植性差的原因,很難滿足產(chǎn)品開發(fā)的需求。但是匯編語言具有執(zhí)行效率高、占用內(nèi)存空間小等特點(diǎn),在某些應(yīng)用領(lǐng)域還是具有無可替代的作用。
本文結(jié)合Keil μVision2程序開發(fā)流程,描述了51單片機(jī)匯編程序多文件編譯的實(shí)現(xiàn)方法。通過多文件編譯的使用,大大提高了匯編程序代碼的可讀性、可擴(kuò)展性,同時(shí)也很大程度地提高程序代碼的執(zhí)行效率以及內(nèi)存空間的使用率,避免內(nèi)存空間的浪費(fèi)。
二、Keil μVision2程序開發(fā)流程簡(jiǎn)介
Keil μVision2是美國(guó)Keil Software公司出品的51系列兼容單片機(jī)軟件集成開發(fā)環(huán)境,該軟件提供宏匯編器、鏈接/定位器、庫(kù)管理器、調(diào)試器以及目標(biāo)文件轉(zhuǎn)換器等工具,是51單片機(jī)系統(tǒng)開發(fā)的首選工具。
Keil μVision2集成開發(fā)環(huán)境的編譯流程如下:首先宏匯編器對(duì)匯編源程序文件進(jìn)行編譯,生成擴(kuò)展名為.OBJ的目標(biāo)文件和擴(kuò)展名為.LST的列表文件,緊接著鏈接/定位器將所有的.OBJ文件進(jìn)行絕對(duì)地址分配,鏈接生成包含絕對(duì)地址的目標(biāo)文件和擴(kuò)展名為.M51的地址文件,最后由目標(biāo)文件轉(zhuǎn)換器生成可用于編程器燒寫、擴(kuò)展名為.HEX的可執(zhí)行文件。
三、匯編程序多文件編譯實(shí)現(xiàn)
在Keil μVision2集成開發(fā)環(huán)境下,我們可以根據(jù)不同的硬件模塊、功能模塊分開編寫應(yīng)用子程序,進(jìn)行模塊化管理,實(shí)現(xiàn)多文件編譯,這樣就可以大大提高匯編程序代碼的可讀性、可擴(kuò)展性。以下首先對(duì)段和模塊的概念進(jìn)行描述。
一個(gè)段可以是一塊程序代碼或者是一個(gè)數(shù)據(jù)塊。根據(jù)其地址空間是否可以被鏈接/定位器更改,段可以分為可定位段和絕對(duì)地址段。在定義可重定位段的時(shí)候需要對(duì)其段名、類型及其屬性進(jìn)行定義。一個(gè)段可以分在不同的程序模塊中,只要具有相同的段名,在編譯過程中鏈接/定位器會(huì)把它們合并到一起。在定義絕對(duì)地址段的時(shí)候直接人為分配絕對(duì)地址,鏈接/定位器不能對(duì)改地址進(jìn)行更改。絕對(duì)地址段沒有段名,也不能給其他段結(jié)合。
模塊是一個(gè)可以被單獨(dú)編譯的代碼單元,可以包含一個(gè)或多個(gè)段或者部分段,一個(gè)模塊既可以是單個(gè)文本文件,也可以通過INCLUDE指令把幾個(gè)文本文件合并在一起。在程序編譯過程中,匯編器會(huì)把一個(gè)模塊編譯為一個(gè)目標(biāo)文件,也就是一個(gè)模塊對(duì)應(yīng)一個(gè).OBJ文件。
根據(jù)以上對(duì)段和模塊的描述,匯編程序的多文件編譯可以通過以下三個(gè)方法來實(shí)現(xiàn):
1、通過INCLUDE指令合并源文件
在代碼編寫時(shí),通過INCLUDE指令可以將一個(gè)源文件插入到當(dāng)前源文件中,這樣匯編器在編譯的時(shí)候就會(huì)將INCLUDE指令之后的文件合并到當(dāng)前文件進(jìn)行編譯,生成一個(gè)擴(kuò)展名為.OBJ的目標(biāo)文件。INCLUDE指令的格式如下:
$ INCLUDE (文件名)
通過該方式實(shí)現(xiàn)多文件編譯時(shí),插入的源文件既可以是擴(kuò)展名為.ASM的匯編源程序文件,也可以是擴(kuò)展名為.INC的包含文件。注意在被包含的源文件結(jié)尾不能有END指令,否則編譯會(huì)停止運(yùn)行。
2、通過絕對(duì)地址段實(shí)現(xiàn)多文件編譯
Keil μVision2中提供以下定義絕對(duì)地址段的指令,通過這些指令可以定義代碼段和各種數(shù)據(jù)段,并指定其絕對(duì)地址。
由于絕對(duì)地址段在定義的時(shí)候?qū)Φ刂愤M(jìn)行了分配,鏈接/定位器不能夠?qū)ζ涞刂愤M(jìn)行更改,因此很容易造成地址重疊或者內(nèi)存空間浪費(fèi),而且在后續(xù)對(duì)程序進(jìn)行維護(hù)、升級(jí)的時(shí)候很有可能需要重新對(duì)地址進(jìn)行分配,非常不利于程序的擴(kuò)展和維護(hù)。因此絕對(duì)地址段通常是用在某些特定的場(chǎng)合,例如確定中斷向量的入口地址、數(shù)據(jù)存儲(chǔ)空間等。
3、通過可重定位段實(shí)現(xiàn)多文件編譯
在Keil μVision2中,通過SEGMENT指令即可定義可重定位段。定義可重定位段時(shí)必須指定段的名稱和存儲(chǔ)類型,其格式如下:
四、總結(jié)
通過以上三種方式,均可以實(shí)現(xiàn)多文件編譯,但是在實(shí)際使用過程中,INCLUDE指令通常用于包含特殊功能寄存器的定義等;絕對(duì)地址段則通常用于確定中斷向量的入口地址、數(shù)據(jù)存儲(chǔ)空間;而可重定位段的方式則廣泛地用于各種代碼段或數(shù)據(jù)段的定義。
通過多文件編譯的方式,解決了單文件編譯會(huì)導(dǎo)致程序文件過于臃腫、可讀性差、不便于維護(hù)等缺點(diǎn),大大提高匯編程序代碼的可讀性以及可維護(hù)性。
參考文獻(xiàn)
[1] Keil Software. A51/AX51/A251 Macro Assembler and Utilities.2001.
[2]孫涵芳,徐愛卿.MCS-51/96系列單片機(jī)原理及應(yīng)用(修訂版).1996.
(作者單位:1、珠海格力電器股份有限公司;2、格力電器(合肥)有限公司)