匯編語言程序的開發(fā)工具_第1頁
匯編語言程序的開發(fā)工具_第2頁
匯編語言程序的開發(fā)工具_第3頁
匯編語言程序的開發(fā)工具_第4頁
匯編語言程序的開發(fā)工具_第5頁
已閱讀5頁,還剩117頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第4章匯編語言程序的開發(fā)工具現(xiàn)在是1頁\一共有122頁\編輯于星期五知識要點:本章介紹了TMS320C54x軟件開發(fā)流程、匯編語言程序的編寫、編譯和鏈接過程,重點介紹了COFF段的一般概念、匯編器和鏈接器處理段的方法以及程序的重定位方法等?,F(xiàn)在是2頁\一共有122頁\編輯于星期五4.1TMS320C54x軟件開發(fā)流程’C54x的應(yīng)用軟件開發(fā)主要完成以下的工作:首先是選擇編程語言編寫源程序?!疌54x提供兩種編程語言:匯編語言和C/C++語言。當源程序編寫好后,選擇開發(fā)環(huán)境,’C54x提供了兩種開發(fā)環(huán)境。一種是非集成開發(fā)環(huán)境,如圖4.1.1。另一種是集成開發(fā)環(huán)境,簡稱CCS。CCS在Windows操作系統(tǒng)下運行,它集成了非集成開發(fā)環(huán)境的所有功能,并擴展了許多其他的功能。在后面的章節(jié)中會有介紹。現(xiàn)在是3頁\一共有122頁\編輯于星期五

現(xiàn)在是4頁\一共有122頁\編輯于星期五如果源程序是C/C++語言,需調(diào)用’C54x的C編譯器將其編譯成匯編語言,并送入’C54x的匯編器進行匯編。對于用匯編語言編寫的程序則直接送給匯編器進行匯編,匯編后產(chǎn)生COFF格式的目標文件,再用鏈接器進行鏈接,生成在’C54x可執(zhí)行的COFF格式的目標代碼,并利用調(diào)試工具對可執(zhí)行的目標代碼進行調(diào)試?,F(xiàn)在是5頁\一共有122頁\編輯于星期五對’C54x應(yīng)用程序的開發(fā)提供以下幾個開發(fā)調(diào)試工具:

C/匯編語言源碼調(diào)試器與軟件仿真器、評價模塊、軟件開發(fā)系統(tǒng)、軟件模擬器等開發(fā)工具配合使用。

軟件仿真模擬器

集成開發(fā)環(huán)境CCS

DSK

軟件開發(fā)系統(tǒng)SWDS

可擴展的開發(fā)系統(tǒng)仿真器(XDS510)

評價模塊(EVM板)

現(xiàn)在是6頁\一共有122頁\編輯于星期五4.2匯編語言程序的編輯、

匯編和鏈接過程匯編語言源程序可以在任何一種文本編輯器中進行。當匯編語言源程序完成后,還必須經(jīng)過匯編和鏈接后才能進行。下圖給出了匯編語言程序的編輯、匯編和鏈接過程:文本編輯器匯編器鏈接器調(diào)試程序.cmd鏈接命令文件.lst列表文件轉(zhuǎn)換程序.asm源文件.obj目標文件.out輸出文件-l-m.map存儲器映像文件現(xiàn)在是7頁\一共有122頁\編輯于星期五①編輯利用各種文本編輯器,如記事本、WORD、EDIT等,可編寫匯編語言源程序。②匯編當匯編語言源程序編寫好以后,可利用’C54x的匯編器ASM500,對一個或多個源程序進行匯編,生成.lst文件和.obj文件。常用匯編命令為:asm500%1 -s-l-x現(xiàn)在是8頁\一共有122頁\編輯于星期五③鏈接鏈接就是利用’C54x的鏈接器LNK500,根據(jù)鏈接器命令文件(.cmd)對已匯編過的一個或多個目標文件(.obj)進行鏈接,生成存儲器映像文件(.map)和輸出文件(.out)。

常用鏈接命令為lnk500%1.cmd現(xiàn)在是9頁\一共有122頁\編輯于星期五④調(diào)試對輸出文件(.out)調(diào)試可以采用多種手段,現(xiàn)介紹如下:

◆軟件仿真器進行調(diào)試◆硬件仿真器進行調(diào)試◆評價模塊進行調(diào)試⑤固化用戶程序調(diào)試完成后,利用HEX500格式轉(zhuǎn)換器對ROM編程,或?qū)PROM編程,最后安裝到用戶的的應(yīng)用系統(tǒng)中?,F(xiàn)在是10頁\一共有122頁\編輯于星期五4.3COFF的一般概念匯編器和鏈接器生成的目標文件,是一個可以由’C54x器件執(zhí)行的文件。這些目標文件的格式稱為公共目標文件格式(CommonObjectFileFormat,縮寫為COFF)。

COFF采用代碼段和數(shù)據(jù)段的形式,因此便于模塊化的編程。現(xiàn)在是11頁\一共有122頁\編輯于星期五4.3.1COFF文件的基本單元COFF文件有3種類型:COFF0、COFF1、COFF2。每種類型的COFF文件的標題格式都有所不同,但數(shù)據(jù)部分卻是相同的。段是COFF文件中最重要的概念。每個目標文件都分成若干段。段是在存儲器圖中占據(jù)相鄰空間的代碼或數(shù)據(jù)塊?,F(xiàn)在是12頁\一共有122頁\編輯于星期五所有的COFF目標文件都包含以下3種形式段:

◆.text段,通常包含可執(zhí)行代碼;◆.data段,通常包含初始化數(shù)據(jù);◆.bss段,通常為未初始化變量保留存儲空間。此外,匯編器和鏈接器可以建立、命名和鏈接自定義段。這種自定義段是程序員自已定義的段,使用起來與.data、.text、及.bss段類似。它的好處是在目標文件中與.data、.text、及.bss分開匯編,鏈接時作為一個單獨部分分配到存儲器中?,F(xiàn)在是13頁\一共有122頁\編輯于星期五COFF目標文件有以下兩種基本類型的段。①初始化段初始化段中包含有數(shù)據(jù)或程序代碼。包括:

◆.text段是已初始化段;◆.data段是已初始化段;◆.sect匯編器偽指令建立的自定義段也是已初始化段?,F(xiàn)在是14頁\一共有122頁\編輯于星期五②未初始化段在存儲空間中,它為未初始化數(shù)據(jù)保留存儲空間。包括:

◆.bss段未初始化段;◆.usect匯編命令建立的自定義段也是未初始化段。現(xiàn)在是15頁\一共有122頁\編輯于星期五鏈接器的一個任務(wù)就是分配存儲單元,即把各個段重新定位到目標存儲器中,如下圖:現(xiàn)在是16頁\一共有122頁\編輯于星期五鏈接器的功能之一是將目標文件中的段重新定位到目標系統(tǒng)的存儲器中,該功能稱為定位或分配。大多數(shù)系統(tǒng)都包含有幾種存儲器,通過對各個段的重新定位,可以使目標存儲器得到更加有效的利用。現(xiàn)在是17頁\一共有122頁\編輯于星期五4.3.2匯編器對段的處理匯編器對段的處理是通過段偽指令來區(qū)別各個段,并將段名相同的語句匯編在一起。匯編器有5條命令可識別匯編語言程序的各個部分。這5條命令是:

◆.bss(未初始化段)◆.usect(未初始化段)◆.text(已初始化段)◆.data(已初始化段)◆.sect(已初始化段)現(xiàn)在是18頁\一共有122頁\編輯于星期五①未初始化段.bss和.usect命令生成未初始化段。未初始化段就是’C54x存儲器中的保留空間,通常將它們定位到RAM區(qū)。在目標文件中,這些段沒有確切的內(nèi)容;在程序運行時,可以利用這些存儲空間存放變量。這兩條命令句法如下:.bss 符號,字數(shù).usect “段名”,字數(shù)現(xiàn)在是19頁\一共有122頁\編輯于星期五符號—對應(yīng)于保留的存儲空間第一個字的變量名稱,可讓其它段引用,也可以定義為全局符號;字數(shù)—表示在.bss段或標有名字的段中保留多少個存儲單元;段名—程序員為自定義未初始化段起的名字。②已初始化段.text、.data和.sect命令生成已初始化段。已初始化段中包含有可執(zhí)行代碼或初始化數(shù)據(jù)。這些段中的內(nèi)容都在目標文件中,當加載程序時再放到’C54x的存儲器中。每一個已初始化段都是可以重新定位的,并且可以引用其他段中所定義的符號?,F(xiàn)在是20頁\一共有122頁\編輯于星期五3條初始化命令的句法如下:.text [段起點].data [段起點]·sect “段名”[,段起點]其中,段起點是任選項。如果選用,它就是為段計數(shù)器(SPC)定義的一個起始值。如果默認,則SPC從0開始。當匯編器遇到.text、.data和.sect命令時,將停止對當前段的匯編,然后將緊接著的程序代碼或數(shù)據(jù)匯編到指定段中,直到再遇到另一條.text、.data和.sect命令為止?,F(xiàn)在是21頁\一共有122頁\編輯于星期五當匯編器遇到.bss或.usect命令時,并不結(jié)束當前段的匯編,只是暫時從當前段脫離出來,并開始對新的段進行匯編。段的構(gòu)成要經(jīng)過一個反復(fù)的過程?,F(xiàn)在是22頁\一共有122頁\編輯于星期五③命名段命名段由用戶指定,與默認的.text,.data和.bss段的使用相同,但它們被分開匯編。例如,重復(fù)使用.text段建成單個.text段,在鏈接時,這個.text段被作為單個單元定位。

現(xiàn)在是23頁\一共有122頁\編輯于星期五假如不希望一部分可執(zhí)行代碼和.text段分配在一起,可將它們匯編進一個命名段,這樣就可定位在與.text段不同的地方,也可將初始化的數(shù)據(jù)匯編到與.data段不同的地方,或者將未初始化的變量保留在與.bss段不同的位置。此時,可用以下兩個產(chǎn)生命名段的偽指令:.usect偽指令產(chǎn)生類似.bss段,為變量在RAM中保留存儲空間。.sect偽指令產(chǎn)生類似.text和.data段,可以包含代碼和數(shù)據(jù)。.sect偽指令產(chǎn)生地址可重新定位的命名段?,F(xiàn)在是24頁\一共有122頁\編輯于星期五這兩個偽指令的使用句法為:符號 .usect“段名”,字數(shù) .sect“段名”可以產(chǎn)生多達32767不同的命名段。不同的偽指令不能使用相同的名字,也就是說,不能用.usect創(chuàng)建命名段,然后用.sect再創(chuàng)建一個相同名字的段。現(xiàn)在是25頁\一共有122頁\編輯于星期五④子段子段是較大段中的小段。鏈接器可以像處理段一樣處理子段。子段結(jié)構(gòu)可用來對存儲器間進行更緊湊的控制,可以使存儲器圖更加緊密。子段的命名的句法為:基段名: 子段名例如,若要在.text段內(nèi)建立一個稱之為_func的子段,可以用如下的命令:.sect “.text:_func”現(xiàn)在是26頁\一共有122頁\編輯于星期五⑤段程序計數(shù)器(SPC)匯編器為每個段都安排了一個單獨的程序計數(shù)器——段程序計數(shù)器,簡稱SPC。SPC表示一個程序代碼或數(shù)據(jù)段內(nèi)當前的地址。開始時匯編器將每個SPC置0。當匯編器將程序代碼或數(shù)據(jù)加到一個段內(nèi)時,相應(yīng)的SPC就增加。如果再繼續(xù)對某個段匯編,則相應(yīng)的SPC就在先前的數(shù)值上繼續(xù)增加。鏈接器在鏈接時要對每個段重新定位。

現(xiàn)在是27頁\一共有122頁\編輯于星期五下例列出的是一個匯編語言程序匯編后的.lst文件。.lst文件由4個部分組成,即第一部分(Field1):源程序行號第二部分(Field2):段程序計數(shù)器第三部分(Field3):目標代碼第四部分(Field4):源程序現(xiàn)在是28頁\一共有122頁\編輯于星期五5 0000 .data6 00000044coeff.word 044h,055h,066h 00010055 0002006610 0000 .bssbuffer,814 00030456prt.word 0456h18 0000 .text19 0000 100d add: LD 0Dh,A20 0001 f010 aloop: SUB #1,A 0002 000121 0003 f842 BC aloop,AGEQ25 0004 0001’ 0004 .data 0004 00cc ivals .word 0CCh,0DDh,0EEh 0005 00dd 0006 00ee現(xiàn)在是29頁\一共有122頁\編輯于星期五30 0000 var2 .usect “newvars”,231 0001 inbuf .usect “newvars”,835 0005 text36 0005 110a mpy: LD 0Ah,B37 0006 f166 mloop: MPY #0Ah,B 0007 000a38 0008 f868 0009 0006’42 0000 .sect “vectors”43 0000 0044 .word 044h,088h44 0001 0088現(xiàn)在是30頁\一共有122頁\編輯于星期五在此例中,共建立了5個段:

◆.text段內(nèi)有10個字的程序代碼◆.data段內(nèi)有7個字的數(shù)據(jù)◆vectors是一個用.sect命令生成的自定義段,段內(nèi)有2個字的已初始化數(shù)據(jù)◆.bss在存儲器中為變量保留8個存儲單元◆.newvars是一個用.usect命令建立的自定義段,它在存儲器中為變量保留10個存儲單元?,F(xiàn)在是31頁\一共有122頁\編輯于星期五

在此例中建立的5個段如圖4.3.2。

現(xiàn)在是32頁\一共有122頁\編輯于星期五4.3.3鏈接器對段的處理鏈接器是開發(fā)TMS320C54x器件必不可少的開發(fā)工具,它對段處理時有兩個任務(wù):其一是將一個或多個COFF目標文件中的各種段作為鏈接器的輸入段,經(jīng)鏈接后在一個執(zhí)行的COFF輸出模塊中建立各個輸出段;其二是為各個輸出段選定存儲器地址?,F(xiàn)在是33頁\一共有122頁\編輯于星期五鏈接器有2條偽指令支持上述任務(wù)。

◆MEMORY偽指令。用來定義目標系統(tǒng)的存儲器分配空間,包括對存儲器各部分命名,及規(guī)定它們的起始地址和長度。◆SECTIONS偽指令。它告訴連接器如何將輸入段組合成輸出段,及將輸出段放在存儲器中的什么位置。

現(xiàn)在是34頁\一共有122頁\編輯于星期五①默認的存儲器分配書圖4.3.3說明了兩個文件的鏈接過程。4.3.3兩個文件的鏈接過程現(xiàn)在是35頁\一共有122頁\編輯于星期五圖4.3.3中,鏈接器對目標文件file1.obj和file2.obj進行鏈接。每個目標文件中,都有.text、.data和.bss段,此外還有自定義段。鏈接器將兩個文件的.text段組合在一起,以形成一個.text段,然后再將兩個文件的.data段和.bss段以及最后自定義段組合在一起。現(xiàn)在是36頁\一共有122頁\編輯于星期五②段放入存儲器空間圖4.3.3說明了鏈接器結(jié)合段的默認方法,有時希望采用其他的結(jié)合方法。例如,可能不希望將所有的.text段結(jié)合在一起形成單個的.text段,或者希望將命名段放在.data的前面。若希望將段放在指定類型的存儲器中,此時可采用MEMORY和SECTIONS偽指令。現(xiàn)在是37頁\一共有122頁\編輯于星期五4.3.4鏈接器對程序的重新定位①鏈接器重新定位匯編器處理每個段都是從地址0開始,而所有需要重新定位的符號(標號)在段內(nèi)都是相對于地址0的。事實上,所有段都不可能從存儲器中地址0單元開始,因此鏈接器必須通過以下方法對各個段進行重新定位:現(xiàn)在是38頁\一共有122頁\編輯于星期五

◆將各個段定位到存儲器空間中,這樣一來每個段都能從一個恰當?shù)牡刂烽_始;◆將符號變量調(diào)整到相對于新的段地址的位置;◆將引用調(diào)整到重新定位后的符號,這些符號反映了調(diào)整后的新符號值?,F(xiàn)在是39頁\一共有122頁\編輯于星期五匯編器在需要引用重新定位的符號處都留了一個重定位入口。鏈接器在對符號重新定位時,利用這些入口修正對符號的引用值。下面舉例說明:1 .ref X;符號X、Y、Z需要重新定位2 .ref Z;X、Z是在另一個模塊中定義的3 0000 .text;Y是在這個模塊的.text段定義的4 0000 F073 B Y;產(chǎn)生一個重新定位入口 0001 0006’;Y的值為6,X和Z值為05 0002 F073 B Z;產(chǎn)生一個重新定位入口 0003 0000!6 0004 F020 LD #X, A;產(chǎn)生一個重新定位入口 0005 0000!7 0006 F7E0 Y: RESET現(xiàn)在是40頁\一共有122頁\編輯于星期五假設(shè)鏈接時X重新定位地址7100H,.text段重新定位到從地址7200H開始,那么Y的重新定位值為7204H。鏈接器利用重定位入口,對目標文件中的兩次引用進行修正。f073BY變成f0730004’7204’f020LD#X,A變成f0200000’7100②運行時間重新定位有時,希望將代碼裝入存儲器的一個地方,而在另一個地方運行。現(xiàn)在是41頁\一共有122頁\編輯于星期五例如一些關(guān)鍵的執(zhí)行代碼必須裝在系統(tǒng)的ROM中,但希望在較快的RAM中運行,鏈接器提供了一個處理該問題的簡單方法,利用SECTIONS偽指令選項可讓鏈接器定位兩次,第一次使用裝入關(guān)鍵字設(shè)置裝入地址,再使用運行關(guān)鍵字設(shè)置它的運行地址。如果只為段提供一次定位,則該段將只定位一次,并且裝入和運行地址相同。未初始化的段(例如.bss)不能裝入,所以它僅有的有意義的地址為運行地址,鏈接器只對沒有初始化的段定位一次?,F(xiàn)在是42頁\一共有122頁\編輯于星期五4.3.5程序裝入鏈接器產(chǎn)生可執(zhí)行的COFF目標文件。可執(zhí)行的目標文件模塊與鏈接器輸入的目標文件具有相同的COFF格式,但在可執(zhí)行的目標文件中,對段進行結(jié)合并在目標存儲器中進行重新定位。為了運行程序,在可執(zhí)行模塊中的數(shù)據(jù)必須傳輸或裝入目標系統(tǒng)存儲器。現(xiàn)在是43頁\一共有122頁\編輯于星期五有兩種方法可以用來裝入程序,選哪種方法取決于執(zhí)行環(huán)境。

◆TMS320C54x調(diào)試工具。包括軟件模擬器、XDS仿真器和集成系統(tǒng)CCS。它們都具有內(nèi)部裝入器,包含調(diào)用LOAD命令。裝入器讀取可執(zhí)行文件,將程序復(fù)制到目標系統(tǒng)的存儲器中。◆采用Hex轉(zhuǎn)換工具。例如Hex500,將可執(zhí)行COFF目標模塊轉(zhuǎn)換成幾種其他目標格式文件,然后將轉(zhuǎn)換后的文件寫入EPROM?,F(xiàn)在是44頁\一共有122頁\編輯于星期五4.3.6COFF文件中的符號COFF文件中有一個符號表,主要用來存儲程序中有關(guān)符號的消息,鏈接時對符號進行重新定位要用到該表,調(diào)試程序也要用到它。現(xiàn)在是45頁\一共有122頁\編輯于星期五①外部符號外部符號,是在一個模塊中定義、又可以在另一個模塊中引用的符號??梢杂脗沃噶?def、.ref或.global來定義某些符號為外部符號。

◆.def指令在當前模塊中定義,并可在別的模塊中使用的符號◆.ref指令在當前模塊中使用在別的模塊中定義的符號◆.global指令可以是上面的任何一種情況現(xiàn)在是46頁\一共有122頁\編輯于星期五例:以下的代碼段說明上面的定義x: ADD #56h, A B y.def x.ref y匯編時,匯編器把x和y都放在目標文件的符號表中。當這個文件與其它目標文件鏈接時,遇到x,就定義了其它文件不能識別的x,同樣遇到符號y時,鏈接器就檢查其他文件對y的定義??傊溄悠鞅仨毷顾玫姆柵c相應(yīng)的定義相匹配。現(xiàn)在是47頁\一共有122頁\編輯于星期五②符號表每當遇到一個外部符號,匯編器都將符號表中產(chǎn)生一個條目。匯編器還產(chǎn)生一個指到每段的專門符號,鏈接器使用這些符號來對其他符號重新定位?,F(xiàn)在是48頁\一共有122頁\編輯于星期五4.4源程序的匯編匯編器的作用是將匯編語言源程序轉(zhuǎn)換成機器語言目標文件。這些目標文件都是公共目標文件格式(COFF)。匯編語言源程序文件包括匯編命令、匯編語言指令和宏指令。匯編命令用來控制匯編的過程,包括列表格式、符號定義和將源代碼放入塊的方式等?,F(xiàn)在是49頁\一共有122頁\編輯于星期五匯編器包括如下功能:①將匯編語言源程序匯編成一個可重新定位的目標文件;②根據(jù)需要,可以生成一個列表文件,并對該列表進行控制;③將程序代碼分成若干個段,每個段的目標代碼都有一個SPC管理;

現(xiàn)在是50頁\一共有122頁\編輯于星期五④定義和引用全局符號,如果需要可以在列表文件后面附加一張交叉引用表;⑤對條件程序塊進行匯編;⑥支持宏功能,允許定義宏命令;⑦為每個目標代碼塊設(shè)置一個程序計數(shù)器SPC。現(xiàn)在是51頁\一共有122頁\編輯于星期五4.4.1匯編程序的運行’C54x的匯編程序名為asm500.exe。要運行匯編程序,可輸入如下命令:asm500 [inputfile[objectfile[listingfile]]][-options]inputfile—匯編源文件名,默認擴展名.asm。objectfile—匯編程序生成的目標文件。.objlistingfile—匯編程序生成的列表文件。.lst現(xiàn)在是52頁\一共有122頁\編輯于星期五4.4.2匯編時的列表文件匯編器對源程序匯編時,如果采用-l選項,匯編后將產(chǎn)生一個列表文件。列表文件中包括源程序語句和目標代碼。下面是一個列表文件的例子,用來說明它的各部分的內(nèi)容?,F(xiàn)在是53頁\一共有122頁\編輯于星期五.globalRESET,INT0,INT1,INT2.globalTINT,RINT,XINT,USER.globalISR0,ISR1,ISR2.globaltime,rcv,xmt,proc

Initmac.macro*initializemacroSSBXOVMLD#0,DPLD#7,ARPLD#037h,ARSBXINTM.endm*******************************復(fù)位中斷向量******************************000000 .sect“reset”000000F073RESET:Binit0000010008+000002F073

INT0:BISR00000030000!000004F073INT2:BISR10000050000!000006F073INT2:BISR20000070000!2223*000000.sect

“ints”000000F073TINTBtime0000010000!000002F073XINTBrcv0000030000!000004F073XINTBxmt0000050000!000006F073USERBproc0000070000!29**********************30*初始化處理器31**********************現(xiàn)在是54頁\一共有122頁\編輯于星期五000008init:initmac1*initializemacro1 000008 F7B9 SSBX OVM1 000009 EA00 LD#0,DP1 00000a F4A7 LD#7,ARP1 00000b E837 LD#37H,A1 00000c F6BB RSBX INTM︸行號SPC目標代碼源程序語句現(xiàn)在是55頁\一共有122頁\編輯于星期五

如例所示,列表文件可以分成4個部分。

◆Field1:源程序語句的行號碼,用十進制數(shù)表示?!鬎ield2:段程序計數(shù)器,用十六進制表示?!鬎ield3:目標代碼,用十六進制表示。后面的記號表示在鏈接時需要重新定位。?。何炊x的外部引用’:.text段重新定位”:.data段重新定位+:.sect段重新定位-:.bss和.usect段重新定位◆Field4:源程序語句?,F(xiàn)在是56頁\一共有122頁\編輯于星期五4.4.3匯編偽指令匯編偽指令用于為程序提供數(shù)據(jù)并指示匯編程序如何匯編源程序,是匯編語言程序的一個重要內(nèi)容。

現(xiàn)在是57頁\一共有122頁\編輯于星期五匯編偽指令可完成以下工作:

◆將代碼和數(shù)據(jù)匯編進指定的段;◆為未初始化的變量在存儲器中保留空間;◆控制清單文件是否產(chǎn)生;◆初始化存儲器;◆匯編條件代碼塊;◆定義全局變量;◆為匯編器指定可以獲得宏的庫;◆考察符號調(diào)試的信息?,F(xiàn)在是58頁\一共有122頁\編輯于星期五’C54x匯編器共有64條匯編偽指令,根據(jù)他們的功能,可以將其分成8類:

①對各種段進行定義的命令,如.bss、.data等②對常數(shù)(數(shù)據(jù)和存儲器)進行初始化的命令,如.bes、byte、.field、float等③調(diào)整SPC(段寄存器),如.align④對輸出列表文件格式化的命令,如.drlist⑤引用其他文件的命令,如copy⑥控制條件匯編的命令,如.break⑦在匯編時定義符號的命令,如.asg⑧執(zhí)行其他功能的命令,如.algebraic現(xiàn)在是59頁\一共有122頁\編輯于星期五①定義段的偽指令定義段的偽指令用于定義相應(yīng)的匯編語言程序段。表4.4.2列出了定義段的偽指令的助記符以及語法格式和注釋。.text—

此段存放程序代碼。.data—

此段存放初始化了的數(shù)據(jù)。.bss—

此段存入未初始化的變量。.sect'名稱'—

定義一個有名段,放初始化了的數(shù)據(jù)或程序代碼。現(xiàn)在是60頁\一共有122頁\編輯于星期五例4.4.2以實例說明如何應(yīng)用定義段的偽指令。該例是一個輸出清單文件,第一列為行號,第二列位SPC的值,每段有它自己的SPC。當代碼第一次放在段中時,其SPC等于0。在其他的代碼段被匯編后,若繼續(xù)將代碼匯編進該段,則它的SPC繼續(xù)計數(shù),就好像沒有受到干擾?,F(xiàn)在是61頁\一共有122頁\編輯于星期五例4.4.2中偽指令執(zhí)行以下任務(wù):

◆.text初始化值為1,2,3,4,5,6,7,8的字;◆.data初始化值為9,10,11,12,13,14,15,16var_defs初始化值為17,18字◆.bss保留19個字的空間◆.usect保留20個字的空間◆.bss和.usect偽指令既不結(jié)束當前的段也不開始新段,它們保留指定數(shù)量的空間,然后匯編器開始將代碼或數(shù)據(jù)匯編當前的段?,F(xiàn)在是62頁\一共有122頁\編輯于星期五123000000 .text0000000001 .word1,200000100020000020003 .word3,4000003000478910000000 .data0000000009 .word9,10000001000A000002000B .word11,12000003000C1415161718000000 .sect“var_defs”200000000011 .word17,18000001001221222324000004 .data000004000D .word13000000 .bsssym,19000006000F .word15,16000007001029303132000004 .text0000040005 .word5,60000040006000000usym .usect“xy”,200000060007.word

0000070008現(xiàn)在是63頁\一共有122頁\編輯于星期五②初始化常數(shù)的偽指令初始化常數(shù)的偽指令為當前段的匯編常數(shù)值。表4.4.3列出了初始化常數(shù)的偽指令的助記符以及語法格式和注釋。.bytevalue1[,…valuen]初始化當前段里的一個或多個連續(xù)字,每個值的寬度限制為8位。fieldvalue[,sizeinbits]初始化一個可變長度的域,將單個值放入當前字的指定位域中。.wordvalue1[,…valuen]初始化一個或多個16位整數(shù),即把16位的值放到當前段的連續(xù)字中。.longvalue1[,…valuen]初始化一個或多個32位整數(shù),即把32位的值放到當前段的2個連續(xù)字中?,F(xiàn)在是64頁\一共有122頁\編輯于星期五例4.4.3圖4.4.1比較了.byte,.int,.long,.xlong,.float,.xloat,.word,.string指令。見p117現(xiàn)在是65頁\一共有122頁\編輯于星期五在這個例子中假定已經(jīng)匯編了以下的代碼:

00000000aa .byte 0AAh,0BBh00000000bb0000020ccc .word 0CCCh0000030eee .xlong 0EEEEFFFh 000004efff000006eeee .long 0EEEEFFFFh 000007ffff000008dddd .int 0DDDDh0000093fff .xfloat 1.99999900000affac00000c3fff .float 1.999999 00000dffac00000e0068 00000f0065 000010006c 0000110070現(xiàn)在是66頁\一共有122頁\編輯于星期五

③對準段程序計數(shù)器的偽指令對準段程序計數(shù)器的偽指令包括:.align偽指令和.even偽指令。表4.4.4列出了對準段程序計數(shù)器的偽指令的助記符以及語法格式和注釋。偽指令助記符及格式描述.align.even用于將段程序計數(shù)器對準在1~128字的邊界用于使SPC指到下一個字的邊界表4.4.4對準段程序計數(shù)器的偽指令現(xiàn)在是67頁\一共有122頁\編輯于星期五⑴.align偽指令的操作必須是在20~216之間且等于2的冪。例如:操作數(shù)為1時,對準SPC到字的邊界;操作數(shù)為2時,對準SPC到長字/偶字的邊界;操作數(shù)為128時,對準SPC到頁面的邊界;沒有操作數(shù)時,.align偽指令默認為頁面邊界。

現(xiàn)在是68頁\一共有122頁\編輯于星期五⑵.even偽指令等效于指定.align偽指令的操作數(shù)為1的情形。當.even操作數(shù)為2時,將SPC對準到下一個長字的邊界。任何在當前字中沒有使用的位都填充0.現(xiàn)在是69頁\一共有122頁\編輯于星期五圖4.4.2說明了.align偽指令的使用情況。

現(xiàn)在是70頁\一共有122頁\編輯于星期五假定匯編了以下的代碼:

0000004000 .field2,30000004160 .field11,8 .align20000020045.string“Errorcnt” 0000030072 0000040072 000005006f 0000060072 0000070063 000008006e 00000900745 .align0000800004 .byte4現(xiàn)在是71頁\一共有122頁\編輯于星期五

④格式化輸出清單文件的偽指令

現(xiàn)在是72頁\一共有122頁\編輯于星期五

⑤引用其他文件的偽指令引用其他文件的偽指令為引用其他文件提供信息。如表4.4.6:

現(xiàn)在是73頁\一共有122頁\編輯于星期五

⑥條件匯編偽指令條件匯編偽指令用來通知匯編器按照表達式計算出的結(jié)果的真假,決定是否對某段代碼進行匯編。有兩組偽指令用于條件代碼塊的匯編:⑴.if/.elseif/.else/.endif偽指令用于通知匯編器按照表達式的計算結(jié)果,對某段代碼塊進行條件匯編。⑵.loop/.break/.endloop偽指令用于通知匯編器按照表達式的計算結(jié)果重復(fù)匯編一個代碼塊?,F(xiàn)在是74頁\一共有122頁\編輯于星期五條件匯編偽指令的助記符及語法格式見表4.4.7:

現(xiàn)在是75頁\一共有122頁\編輯于星期五

⑦定義宏的偽指令常用的定義宏的偽指令如表4.4.8:

現(xiàn)在是76頁\一共有122頁\編輯于星期五

⑧匯編時間符號偽指令匯編時間符號偽指令用于使符號名與常數(shù)值或字符串等價起來。匯編時間符號偽指令如表4.4.9:

現(xiàn)在是77頁\一共有122頁\編輯于星期五.struct/.endstruct偽指令允許將信息組織到結(jié)構(gòu)體中,以便將同類的元素分在一組。然后由匯編器完成結(jié)構(gòu)體成員偏離地址的計算。.struct/.endstruct偽指令不分配存儲器,只是簡單地產(chǎn)生一個可重復(fù)使用的符號模板。.tag將結(jié)構(gòu)體與一個標號聯(lián)系起來,.tag偽指令不分配存儲器,且結(jié)構(gòu)體的標記符必須使用之前先定義好?,F(xiàn)在是78頁\一共有122頁\編輯于星期五例.struct/.endstruct偽指令舉例1 REAL_REC.struct;結(jié)構(gòu)體標記2 0000NOM .int;member1=030001DEN.int;member2=140002REAL_LEN.endstruct;real_len=2560000000001-ADD7;訪問結(jié)構(gòu)體成員89000000 .bssREAL,REAL_LEN

REAL+REAL_REC.DEN,A現(xiàn)在是79頁\一共有122頁\編輯于星期五.union/.endunion偽指令通過創(chuàng)建符號模板,提供在相同的存儲區(qū)域內(nèi)管理多種不同的數(shù)據(jù)類型方法。.union不分配任何存儲器,它允許類型和大小不同的定義臨時存儲在相同存儲器空間?,F(xiàn)在是80頁\一共有122頁\編輯于星期五例.union/.endunion偽指令舉例1 .globalemployid2xample.union;union標記30000ival.word;menber1=int40000fval.float;menber2=float50000sval.string;menber3=string60002real_len.endunion;real_len=278000000.bssemplyid,real_len;指定空間910employid.tagxample;聲明結(jié)構(gòu)實例110000000000-ADDemplyid.fval,A;訪問union成員現(xiàn)在是81頁\一共有122頁\編輯于星期五

⑨混合偽指令書中表4.4.10列出了常用的混合偽指令:

現(xiàn)在是82頁\一共有122頁\編輯于星期五.newblock偽指令用于復(fù)位局部標號。局部標號是形式為$n或name?的符號。當它們出現(xiàn)在標號域時被定義。局部標號可用作跳轉(zhuǎn)指令的操作數(shù)。.newblock偽指令通過在它們被使用后將它們復(fù)位的方式來限制局部標號的使用范圍。現(xiàn)在是83頁\一共有122頁\編輯于星期五4.4.4宏定義和宏調(diào)用’C54x匯編器支持宏指令語言。利用宏指令,可以使源程序變得簡短。宏的使用以下3個步驟。①定義宏。有兩種方法定義宏:

◆可在源文件的開始定義宏,或者在.include/.copy的文件中定義?!粼诤陰熘卸x。②調(diào)用宏。③擴展宏。

現(xiàn)在是84頁\一共有122頁\編輯于星期五宏指令與子程序一樣,都是重復(fù)執(zhí)行某一段程序,但兩者是有區(qū)別的,有以下兩點:①宏指令和子程序都可以被多次調(diào)用,但是把子程序匯編成目標代碼的過程只進行一次,而在用到宏指令的每個地方都要對宏指令中的語句逐條地進行匯編。②在調(diào)用之前,由于子程序不使用參數(shù),故子程序所需要的寄存器等都必須事先設(shè)置好,而對于宏指令來說,由于可以使用參數(shù),調(diào)用時只要直接代入?yún)?shù)就行了?,F(xiàn)在是85頁\一共有122頁\編輯于星期五宏定義格式如下:macname.macro[parameter1][,…,parametern]modelstatementsormacrodirectives[.mexit].endm現(xiàn)在是86頁\一共有122頁\編輯于星期五宏調(diào)用格式如下:

[label][:]macname[parameter1][,…,parametern]現(xiàn)在是87頁\一共有122頁\編輯于星期五例4.4.7宏定義、宏調(diào)用和宏展開舉例1*23*add34*5* ADDRP=P1+P2+P367add3 .macro P1,P2,P3,ADDRP8 9LDP1,A10ADDP2,A11 ADDP3,A現(xiàn)在是88頁\一共有122頁\編輯于星期五12 STLA,ADDRP13 .endm141516 .globalabc,def,ghi,adr17000000add3abc,def,ghi,adr10000001000! LDabc,A10000010000!ADDdef,A10000020000!ADDghi,A10000048000!STLA,adr現(xiàn)在是89頁\一共有122頁\編輯于星期五4.5鏈接器的使用鏈接器的主要任務(wù)是:根據(jù)鏈接命令文件,將一個或多個COFF目標文件鏈接起來,生成存儲器映像文件和可執(zhí)行的輸出文件,如下圖:

LNK500鏈接命令或鏈接命令文件(.cmd文件)存儲器映像文件(.map文件)一個或多個目標文件(.out文件)可執(zhí)行輸出文件(.out文件)現(xiàn)在是90頁\一共有122頁\編輯于星期五在鏈接過程中,鏈接器將各個目標文件合并起來,并完成以下工作:

◆將各個段配置到目標系統(tǒng)的存儲器?!魧Ω鱾€符號和段進行重新定位,并給它們指定一個最終的地址?!艚鉀Q輸入文件之間未定義的外部引用。現(xiàn)在是91頁\一共有122頁\編輯于星期五4.5.1鏈接器的運行①運行鏈接程序’C54x的鏈接器名為lnk500.exe。運行鏈接器有三種命令:lnk500lnk500file1.objfile2.obj-olink.outlnk500linker.cmd說明:⒈使用第一種命令時,鏈接器會提示有關(guān)信息。現(xiàn)在是92頁\一共有122頁\編輯于星期五⒉使用第二種命令時,鏈接器是以file1.obj和file2.obj為目標文件進行鏈接,生成一個名為link.out的可執(zhí)行輸出文件。⒊使用第三種命令時,需將鏈接的目標文件、連接選項以及存儲器配置要求等編寫到鏈接命令文件linker.cmd中。以第二種命令為例,鏈接命令文件linker.cmd應(yīng)包含如下內(nèi)容。file1.objfile2.obj-olink.out②鏈接器選項表4.5.1列出了常用’C54x鏈接器選項。在鏈接時,一般通過鏈接器選項(如-o)控制連接器操作。現(xiàn)在是93頁\一共有122頁\編輯于星期五4.5.2鏈接器命令文件的編寫與使用鏈接命令文件是將鏈接的信息放在一個文件中,這在多次使用同樣的鏈接信息時,可以方便調(diào)用。

在命令文件中可使用兩個十分有用的偽指令MEMORY和SECTIONS,用來指定實際應(yīng)用中的存儲器結(jié)構(gòu)和地址的映射?,F(xiàn)在是94頁\一共有122頁\編輯于星期五在命令行中不能使用這兩個偽指令,命令文件都是ASCⅡ文件,可包含以下內(nèi)容:①輸入文件名,用來指定目標文件、存檔庫或其他命令文件。②鏈接器選項,它們在命令文件中的使用方法與在命令行中相同。③MEMORY和SECTIONS鏈接偽指令,MEMORY用來指定目標存儲器結(jié)構(gòu),SECTIONS用來控制段的構(gòu)成與地址分配。④賦值說明,用于給全局符號定義和賦值。現(xiàn)在是95頁\一共有122頁\編輯于星期五對于如下鏈接器命令:

lnk500a.objb.obj-mprog.map-oprog.out

可以將上述命令行中的內(nèi)容寫成一個鏈接器命令文件link.cmd,內(nèi)容如下:a.obj /*第一個輸入文件名*/b.obj/*第二個輸入文件名*/-mprog.map/*指定map文件的選項*/-oprog.out/*指定輸出文件的選項*/現(xiàn)在是96頁\一共有122頁\編輯于星期五執(zhí)行鏈接器命令:lnk500 link.cmd就可以將兩個目標文件a.obj和b.obj鏈接起來,并生成一個映像文件prog.map和一個可執(zhí)行的輸出文件prog.out,其效果與前面帶-m和帶-o選項的鏈接器命令完全一樣?,F(xiàn)在是97頁\一共有122頁\編輯于星期五

例鏈接器命令文件舉例a.objb.obj/*輸入文件名*/-oprog.out/*指定輸出文件的選項*/-mprog.map/*指定map文件的選項*/MEMORY/*MEMORY偽指令*/{PAGE0:ROM:orgin=1000h,length=0100hPAGE1:RAM:orgin=0100h,length=0100h}SECTIONS/*SECTIONS偽指令*/{.text:>ROM.data:>ROM.bss:>RAM}現(xiàn)在是98頁\一共有122頁\編輯于星期五鏈接器命令文件都是ASCⅡ碼文件,由上例可見,主要包含如下內(nèi)容:①輸入文件名,就是要鏈接的目標文件和文檔庫文件,或者是其他的命令文件。②鏈接器選項,這些選項既可以用在鏈接命令行,也可以編在命令文件中。③MEMORY和SECTIONS都是鏈接器命令,MEMORY命令定義目標存儲器的配置,SECTIONS命令規(guī)定各個段放在存儲器的什么位置。

現(xiàn)在是99頁\一共有122頁\編輯于星期五4.5.3目標庫目標庫是包含完全目標文件作為成員的存檔文件。通常將一組有關(guān)的模塊組合在一起形成一個庫。使用目標庫可減少鏈接的時間和可執(zhí)行模塊的長度。指定庫的次序是很重要的,因為鏈接器在搜索庫時僅僅包括那些具有可用來分辨沒有定義的符號的成員?,F(xiàn)在是100頁\一共有122頁\編輯于星期五下面是鏈接幾個文件和庫的例子,假設(shè):①輸入文件f1.obj和f2.obj均引用了一個名為clrscr的外部函數(shù);②輸入文件f1.obj引用了符號origin;③輸入文件f2.obj引用了符號fillclr;④庫libc.libc的成員Member0包含orign的定義;⑤庫libc.liba的成員Member3包含fillclr的定義;⑥兩個庫成員Member3包含fillclr定義;現(xiàn)在是101頁\一共有122頁\編輯于星期五若輸入命令:lnk500f1.objliba.libf2.objlibc.lib則引用分辨如下:①庫libc.liba的成員Member1滿足對clrscr引用,因為f2.obj引用它之前,庫被搜索并定義了clrscr。②庫libc.libc的成員Member0滿足對origin的引用。③庫libc.liba的成員Member3滿足對fillclr的引用?,F(xiàn)在是102頁\一共有122頁\編輯于星期五但如果輸入命令:lnk500f1.objf2.objlibc.libliba.lib則所有對clrscr的引用都由庫libc.libc的成員Member1滿足。現(xiàn)在是103頁\一共有122頁\編輯于星期五4.5.4MEMORY命令鏈接器應(yīng)當確定輸出各段放在存儲器的什么位置。要達到這個目的,首先應(yīng)當有一個目標存儲器的模型。MEMORY命令就是用來規(guī)定目標存儲器的模型。通過這條命令,可以定義系統(tǒng)中所包含的各種形式的存儲器,以及它們占據(jù)的地址范圍?,F(xiàn)在是104頁\一共有122頁\編輯于星期五例4.5.2使用MEMORY偽指令的鏈接器命令文件的例子file1.objfile2.obj-oProg.outMEMORY{PAGE0:ROM: origin=C00h,length=1000hPAGE1:SCRATCH:origin=60h,length=20h ONCHIP:origin=80h,length=200h}現(xiàn)在是105頁\一共有122頁\編輯于星期五例4.5.2中MEMORY命令所定義的系統(tǒng),其存儲器配置如下:程序存儲器:4KROM,起始地址C00h,取名為ROM。數(shù)據(jù)存儲器:32字RAM,起始地址60h,取名為SCRATCH。512字RAM,起始地址80h,取名為ONCHIP.現(xiàn)在是106頁\一共有122頁\編輯于星期五MEMORY命令一般句法如下:MEMORY{PAGE0:name1[(attr)]:origin=constant,length=constant;PAGEn:namen[(attr)]:oringin=constant,length=constant;}現(xiàn)在是107頁\一共有122頁\編輯于星期五PAGE—代表一個完全獨立的存儲空間,頁號n最多為255。通常PAGE0定為程序存儲器,PAGE1定為數(shù)據(jù)存儲器。如果沒規(guī)定,默認為PAGE0。name—對存儲區(qū)間取名。attr—這是任選項,為命名區(qū)規(guī)定1~4個屬性:

R—可對存儲器執(zhí)行讀操作;

W—可對存儲器執(zhí)行寫操作;

X—存儲器可以裝入可執(zhí)行的程序代碼;

I—可對存儲器進行初始化。如果一項屬性都沒選,則存儲器具有全部4項屬性。Origin—規(guī)定存儲區(qū)的起始地址。Length—指定存儲空間的長度?,F(xiàn)在是108頁\一共有122頁\編輯于星期五4.5.5SECTIONS命令SECTIONS命令的任務(wù)如下:

◆說明如何將輸入段組合成輸出段?!粼诳蓤?zhí)行程序中定義輸出段。◆規(guī)定輸出段在存儲器中的存放位置?!粼试S重新命名輸出段?,F(xiàn)在是109頁\一共有122頁\編輯于星期五SECTIONS命令一般句法如下:SECTIONS{name:[property,property,property,…]name:[property,property,property,…]name:[property,property,property,…]}在連接命令文件中,SECTIONS命令用大寫字母,緊隨其后并用大括號括起來的是關(guān)于輸出段的詳細說明。每一個輸出段的說明都從段名開始,段名后面是一行說明段的內(nèi)容和如何給段分配存儲單元的性能參數(shù)。一個段可能的性能參數(shù)有:現(xiàn)在是110頁\一共有122頁\編輯于星期五◆Loadallocation,由它定義將輸出段加載到存儲器中的什么位置。句法:load=allocation或>allocation或allocation具體寫法有多種形式,例如.text:load=0x1000.text:load>ROM.text:PAGE0.bss:load>(RW)現(xiàn)在是111頁\一共有122頁\編輯于星期五◆runallocation,由它定義輸出段在存儲器的什么位置上開始運行。句法:run=allocation或run>allocation鏈接器為每個輸出段在目標存儲器中分配兩個地址:一個是加載的地址,另一個是執(zhí)行程序的地址。通常,這兩個地址是相同的,可以認為每個輸出段只有一個地址?,F(xiàn)在是112頁\一共有122頁\編輯于星期五有時要把程序的加載區(qū)分開,只要用SECTIONS命令讓鏈接器對這個段定位兩次就行了。一次是設(shè)置加載地址,另一次是設(shè)置運行地址。例如:.fir: load=ROM, run=RAM◆Input_sections,用它定義有哪些輸入段組成輸出段。句法:{Input_sections}現(xiàn)在是113頁\一共有122頁\編輯于星期五多數(shù)情況下,在SECTIONS命令中不列出每個輸入文件的輸入段的段名,即SECTIONS{.text:.data:.bss}這樣,在鏈接時,鏈接器就將所有輸入文件的.text段鏈接成.text輸出段(其他段也一樣)現(xiàn)在是114頁\一共有122頁\編輯于星期五當然,也可以明確地用文件名和段名來規(guī)定輸入段,即SECTIONS{.text: /*創(chuàng)建.text輸出段*/{f1.obj(.text)/*鏈接來自f1.obj文件中的.text段*/f2.obj(sec1)/*鏈接來自f2.obj文件中的sec1段*/f3.obj/*鏈接來自f3.obj文件中的所有段*/f4.obj(.text,sec2)/*鏈接來自f4.obj文件中的.text和sec2段*/}}現(xiàn)在是115頁\一共有122頁\編輯于星期五4.5.6多個文件的鏈接實例 .title “example.asm” .mmregsstack .usect “STACK”,10h .bss a,4 .bss x,4 .bss y,1 .def start .datatable: .word 1,2,3.4 .word 8,6,4,2 .textstart: STM #0,SWWSR STM #STACK+10h,SP RPT #7 MVPD table,*AR1+ CALL SUMend: B endSUM: STM #a,AR

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論