版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、2022/8/12 10:501第4章 匯編語言程序開發(fā)工具 內(nèi)容提要 可編程DSP芯片開發(fā)需要一套完整的軟、硬件開發(fā)工具。通??煞殖纱a生成工具和代碼調(diào)試工具兩大類。 代碼生成工具是指將高級語言或匯編語言編寫的DSP程序轉(zhuǎn)換成可執(zhí)行的DSP芯片目標代碼的工具程序,主要包括匯編器、鏈接器和C編譯器以及一些輔助工具程序等。 代碼調(diào)試工具包括C/匯編語言源碼調(diào)試器、仿真器等。 本章主要介紹代碼生成工具,包括C54x軟件開發(fā)流程、匯編語言程序的編寫、編輯、匯編和鏈接過程、COFF段的一般概念、匯編器和鏈接器處理段的方法以及程序的重定位等。 2022/8/12 10:502第4章 匯編語言程序開發(fā)工具
2、 4.1 TMS320C54x軟件開發(fā)過程 4.2 匯編語言程序的編輯、匯編和鏈接過程 4.3 COFF的一般概念 4.4 源程序的匯編4.5 鏈接器的使用2022/8/12 10:503第4章 匯編語言程序開發(fā)工具4.1 TMS320C54x軟件開發(fā)過程 C54x的應(yīng)用軟件開發(fā)主要完成以下工作:(1) 選擇編程語言編寫源程序 C54x提供2種編程語言,即匯編語言和C/C+語言。 對于完成一般功能的代碼,這兩種語言都可使用,但對于一些運算量很大的關(guān)鍵代碼,最好采用匯編語言來完成,以提高程序的運算效率。(2) 選擇開發(fā)工具和環(huán)境 C54x提供了兩種開發(fā)環(huán)境。即非集成開發(fā)環(huán)境和集成開發(fā)環(huán)境CCS。
3、 2022/8/12 10:504第4章 匯編語言程序開發(fā)工具4.1 TMS320C54x軟件開發(fā)過程 1. C54x應(yīng)用軟件開發(fā)流程 C54x應(yīng)用軟件的開發(fā)可在TI公司提供的開發(fā)環(huán)境中進行,用戶可以用C/C+語言或匯編語言編寫源文件,經(jīng)C編譯器、匯編器生成COFF格式的目標文件,再用鏈接器進行鏈接,生成在C54x上可執(zhí)行的目標代碼,然后利用調(diào)試工具對可執(zhí)行的目標代碼進行仿真和調(diào)試。 當調(diào)試完成后,通過Hex代碼轉(zhuǎn)換工具,將調(diào)試后的可執(zhí)行目標代碼轉(zhuǎn)換成EPROM編程器能接受的代碼,并將該代碼固化到EPROM中或加載到用戶的應(yīng)用系統(tǒng)中,以便DSP目標系統(tǒng)脫離計算機單獨運行。 2022/8/12
4、10:505第4章 匯編語言程序開發(fā)工具1. C54x應(yīng)用軟件開發(fā)流程 開發(fā)過程的目的是產(chǎn)生一個可以由C54x目標系統(tǒng)執(zhí)行的模塊。C源文件C編譯器匯編源文件匯編器匯編源文件COFF目標文件鏈接器可執(zhí)行的COFF文件宏源文件存檔器宏庫存檔器目標文件庫建庫工具運行時支持庫EPROM編程器交叉引用列表器調(diào)試工具TMS320C54x絕對地址列表器HEX代碼轉(zhuǎn)換工具2022/8/12 10:506第4章 匯編語言程序開發(fā)工具2. C54x的開發(fā)工具 TI公司提供的DSP開發(fā)環(huán)境和工具主要包括以下三個部分: 代碼生成工具 代碼調(diào)試工具 實時操作系統(tǒng)2022/8/12 10:507第4章 匯編語言程序開發(fā)工
5、具2. C54x的開發(fā)工具(1)代碼生成工具: C編譯器:用來將C/C+語言源程序自動編譯為C54x的匯編語言源程序。 匯編器:用來將匯編語言源文件匯編成機器語言COFF目標文件。 鏈接器:將匯編生成的、可重新定位的COFF目標模塊組合成一個可執(zhí)行的COFF目標模塊。 文檔管理器:允許用戶將一組文件(源文件或目標文件)集中為一個文檔文件庫。 2022/8/12 10:508第4章 匯編語言程序開發(fā)工具2. C54x的開發(fā)工具 助記符指令代數(shù)式指令翻譯器:用來將包含助記符指令的匯編語言源文件轉(zhuǎn)換成包含代數(shù)式指令的匯編語言源文件。 建庫實用程序:用來建立用戶自己使用的、并用C/C+語言編寫的支持運
6、行的庫函數(shù)。 十六進制轉(zhuǎn)換程序:可以很方便地將COFF目標文件轉(zhuǎn)換成TI、Intel、Motorola等公司的目標文件格式。 (1)代碼生成工具:2022/8/12 10:509第4章 匯編語言程序開發(fā)工具2. C54x的開發(fā)工具(1)代碼生成工具: 絕對制表程序:將鏈接后的目標文件作為輸入,生成.abs輸出文件。 交叉引用制表程序:利用目標文件生成一個交叉引用清單,列出鏈接的源文件中的符號以及它們的定義和引用情況。 2022/8/12 10:5010第4章 匯編語言程序開發(fā)工具2. C54x的開發(fā)工具(2)代碼調(diào)試工具: C/匯編語言源碼調(diào)試器:與軟件仿真器、評價模塊、軟件開發(fā)系統(tǒng)、軟件仿真
7、器等配合使用。 軟件仿真器:是一種模擬DSP芯片各種功能并在非實時條件下進行軟件調(diào)試的調(diào)試工具,它不需目標硬件支持,只需在計算機上運行。 初學者工具DSK:是TI公司提供給初學者進行DSP編程練習的一套廉價的實時軟件調(diào)試工具。 2022/8/12 10:5011第4章 匯編語言程序開發(fā)工具2. C54x的開發(fā)工具(2)代碼調(diào)試工具: 軟件開發(fā)系統(tǒng)SWDS:是一塊PC插卡,可提供低成本的評價和實時軟件開發(fā),還可用來進行軟件調(diào)試,程序可在DSP芯片上實時運行。 可擴展的開發(fā)系統(tǒng)仿真器(XDS510):可用來進行系統(tǒng)級的集成調(diào)試,是進行DSP芯片軟硬件開發(fā)的最佳工具。 評價模塊EVM板:是一種低成本
8、的開發(fā)板,可進行DSP芯片評價、性能評估和有限的系統(tǒng)調(diào)試。 2022/8/12 10:5012第4章 匯編語言程序開發(fā)工具4.2 匯編語言程序的編輯、匯編和鏈接過程 匯編語言源程序可以在任何一種文本編輯器中進行。如筆記本、WORD、EDIT、TC等。 當匯編語言源程序編寫完成后,還必須經(jīng)過匯編和鏈接后才能運行。 2022/8/12 10:5013第4章 匯編語言程序開發(fā)工具4.2 匯編語言程序的編輯、匯編和鏈接過程 示意圖匯編器調(diào)試程序鏈接器文本編輯器.asm源文件.obj目標文件.out輸出文件. cmd鏈接命令文件. lst列表文件. map存儲器映像文件十六進制轉(zhuǎn)換程序HEX500- o
9、- m- l2022/8/12 10:5014第4章 匯編語言程序開發(fā)工具4.2 匯編語言程序的編輯、匯編和鏈接過程 1. 編輯 利用各種文本編輯器,如筆記本、WORD、EDIT和TC等,可編寫匯編語言源程序。 2. 匯編 當匯編語言源程序編寫好以后,可利用C54x的匯編器ASM500,對一個或多個源程序分別進行匯編,并生成列表文件(.lst)和目標文件(.obj)。 2022/8/12 10:5015第4章 匯編語言程序開發(fā)工具4.2 匯編語言程序的編輯、匯編和鏈接過程 2. 匯編 常用的匯編命令: asm500 %1 s 1 x 調(diào)用匯編器命令 源文件名 將程序所有定義的符號放在目標文件的
10、符號表中 生成一個列表文件.lst 生成一個交叉匯編表 2022/8/12 10:5016第4章 匯編語言程序開發(fā)工具4.2 匯編語言程序的編輯、匯編和鏈接過程 3. 鏈接 所謂鏈接,就是利用C54x的鏈接器LNK500,根據(jù)鏈接器命令文件(.cmd)對已匯編過的一個或多個目標文件(.obj)進行鏈接,生成輸出文件(.out)和存儲器映像文件(.map) 。 常用的匯編器命令: lnk500 %1.cmd lnk500: 調(diào)用鏈接器命令 %1.cmd: 鏈接命令文件名,該文件須指明目標文件、輸入文件、輸出文件、鏈接選項和存儲器配置要求等。 2022/8/12 10:5017第4章 匯編語言程序
11、開發(fā)工具4.3 COFF的一般概念 匯編器和鏈接器生成的目標文件,是一個可以由C54x器件執(zhí)行的文件。這些目標文件的格式稱之為公共目標文件格式(COFF)。 在編寫匯編語言程序時,COFF采用代碼段和數(shù)據(jù)段的形式,以便于模塊化的編程,使編程和管理變得更加方便。 這些代碼段和數(shù)據(jù)段簡稱為段。匯編器和鏈接器提供一些偽指令來建立和管理各種各樣的段。 2022/8/12 10:5018第4章 匯編語言程序開發(fā)工具4.3 COFF的一般概念 4.3.1 COFF文件的基本單元 COFF文件有3種類型:COFF0、COFF1、COFF2。 每種類型的COFF文件,其標題格式都有所不同,但數(shù)據(jù)部分是相同的。
12、 鏈接器能夠讀/寫所有類型的COFF文件,默認時鏈接器生成的是COFF2文件,采用-vn鏈接選項可以選擇不同類型的COFF文件。 C54x匯編器和C編譯器產(chǎn)生的是COFF2文件。 2022/8/12 10:5019第4章 匯編語言程序開發(fā)工具4.3.1 COFF文件的基本單元 1. 段(sections) 是COFF文件中最重要的概念。每個目標文件都分成若干段。 段是存儲器中占據(jù)相鄰空間的代碼或數(shù)據(jù)塊。一個目標文件中的每個段都是分開的和各不相同的。 COFF目標文件都包含以下3種形式的段: .text 段(文本段),通常包含可執(zhí)行代碼; .data 段(數(shù)據(jù)段),通常包含初始化數(shù)據(jù); .bss
13、 段(保留空間段),通常為未初始化變量保留存儲空間。2022/8/12 10:5020第4章 匯編語言程序開發(fā)工具4.3.1 COFF文件的基本單元 2. 段的基本類型 COFF目標文件中的段有兩種基本類型。 初始化段 未初始化段(1) 初始化段 初始化段中包含有數(shù)據(jù)或程序代碼。主要有: .text段已初始化段; .data段已初始化段; .sect段已初始化段,由匯編器偽指令建立 的自定義段。 2022/8/12 10:5021第4章 匯編語言程序開發(fā)工具4.3.1 COFF文件的基本單元 2. 段的基本類型 COFF目標文件中的段有兩種基本類型。(2) 未初始化段 在存儲空間中,為未初始化
14、數(shù)據(jù)保留存儲空間。它包括: .bss段未初始化段; .usect段未初始化段,由匯編命令建立的命 名段(自定義段)。2022/8/12 10:5022第4章 匯編語言程序開發(fā)工具4.3.1 COFF文件的基本單元 3. 段與目標存儲器的對應(yīng)關(guān)系 匯編器的任務(wù):在匯編過程中,根據(jù)匯編命令用適當?shù)亩螌⒏鞑糠殖绦虼a和數(shù)據(jù)連在一起,構(gòu)成目標文件。 鏈接器的任務(wù):就是分配存儲單元,將目標文件中的段重新定位到目標系統(tǒng)的存儲器中,這一過程稱為定位或分配。 2022/8/12 10:5023第4章 匯編語言程序開發(fā)工具3. 段與目標存儲器的對應(yīng)關(guān)系目標文件中的段與目標存儲器之間的關(guān)系 目標文件目標存儲器.b
15、ss.data.textRAME2PROMROM2022/8/12 10:5024第4章 匯編語言程序開發(fā)工具4.3.2 匯編器對段的處理 匯編器對段的處理是通過段偽指令來區(qū)別各個段的,并將段名相同的語句匯編在一起。 匯編器有5條偽指令可識別匯編語言程序的各個部分: .bss .usect .text .data .sect定義未初始化段定義未初始化段定義已初始化段定義已初始化段定義已初始化段2022/8/12 10:5025第4章 匯編語言程序開發(fā)工具4.3.2 匯編器對段的處理 未初始化段就是在C54x存儲器中保留空間,通常它們被定位在RAM區(qū)。在目標文件中,這些段中沒有確切的內(nèi)容。 由這
16、些段定義的空間僅作為臨時存儲空間,在程序運行時,可以利用這些存儲空間存放變量。 未初始化段分為默認的和命名的兩種,分別由匯編器偽指令.bss和.usect產(chǎn)生。 1. 未初始化段 2022/8/12 10:5026第4章 匯編語言程序開發(fā)工具(1) .bss偽指令1. 未初始化段 用于在bss段中保留若干個空間。 格式: .bss 符號, 字數(shù)符號對應(yīng)于保留的存儲空間第一個字的變量名稱。 可以讓其他段引用,也可以用.global命令定義為全 局符號。 字數(shù)表示在bss段或標有名字的段中保留若干個存儲單元。 每調(diào)用一次.bss偽指令,匯編器在相應(yīng)的段保留更多的空間。 2022/8/12 10:5
17、027第4章 匯編語言程序開發(fā)工具1. 未初始化段 (2) .usect偽指令 用于為指定的命名段保留若干個空間。 格式: 符號 .usect “段名”, 字數(shù)段名程序員為未初始化的命名段定義的名字。 每調(diào)用一次.usect偽指令,匯編器在指定的命名段保留更多的空間。 2022/8/12 10:5028第4章 匯編語言程序開發(fā)工具4.3.2 匯編器對段的處理 已初始化段中包含有可執(zhí)行代碼或初始化數(shù)據(jù)。 這些段中的內(nèi)容都在目標文件中,當加載程序時再放到C54x的存儲器中。每個已初始化段都是可以重新定位的,并且可以引用其他段中所定義的符號。鏈接器在鏈接時會自動地處理段間的相互引用。 已初始化段由.
18、text、.data和.sect三個偽指令建立。2. 已初始化段 2022/8/12 10:5029第4章 匯編語言程序開發(fā)工具 已初始化命令的句法: 2. 已初始化段 .text 段起點 .data 段起點 .sect “段名”,段起點段起點是任選項。 若選用,它為段程序計數(shù)器SPC定義一個起始值。 若默認,則SPC從0開始。 2022/8/12 10:5030第4章 匯編語言程序開發(fā)工具4.3.2 匯編器對段的處理 當匯編器遇到.text或.data或.sect命令時,將停止對當前段的匯編(相當于一條結(jié)束當前段匯編的命令),然后將緊接著的程序代碼或數(shù)據(jù)匯編到指定的段中,直到再遇到另一條.t
19、ext、.data或.sect命令為止。 當匯編器遇到.bss或.usect命令時,并不結(jié)束當前段的匯編,只是暫時從當前段脫離出來,并開始對新的段進行匯編。 .bss和.usect命令可以出現(xiàn)在一個已初始化段的任何位置,而不會對它的內(nèi)容發(fā)生影響。 2022/8/12 10:5031第4章 匯編語言程序開發(fā)工具4.3.2 匯編器對段的處理 命名段由用戶指定,與默認的.text,.data和.bss段的使用相同,但它們被分開匯編。 假如一部分可執(zhí)行代碼(例如初始化程序)不希望和.text段分配在一起,可將它們匯編進一個命名段,這樣就可定位在與.text不同的地方。也可將初始化的數(shù)據(jù)匯編到與.dat
20、a段不同的地方,或者將未初始化的變量保留在與.bss段不同的位置。 可用.usect和.sect兩個偽指令產(chǎn)生命名段。3. 命名段(自定義段) 2022/8/12 10:5032第4章 匯編語言程序開發(fā)工具 .usect偽指令產(chǎn)生類似.bss的段,為變量在RAM中保留存儲空間。 .sect偽指令產(chǎn)生類似.text和.data的段,可以包含代碼或數(shù)據(jù)。.sect偽指令產(chǎn)生可重新定位地址的命名段。3. 命名段 產(chǎn)生命名段偽指令格式: 符號 .usect “段名”,字數(shù) .sect “段名” 可以產(chǎn)生多達32767個不同的命名段。段名可長達200個字符。 2022/8/12 10:5033第4章 匯
21、編語言程序開發(fā)工具 對于.sect和.usect偽指令,段名可以作為子段的參考。 每次用一個新名字調(diào)用這些偽指令時,就產(chǎn)生一個新的命名段。 若用已有的段名調(diào)用這些偽指令,則匯編器就將代碼或數(shù)據(jù)(或保留空間)匯編進相應(yīng)名稱的段中。 不同的偽指令不能使用相同的名字。即不能用.usect創(chuàng)建了命名段,然后又用.sect創(chuàng)建一個相同名字的段。 3. 命名段 2022/8/12 10:5034第4章 匯編語言程序開發(fā)工具4.3.2 匯編器對段的處理 子段是較大段中的小段。鏈接器可以像處理其他段一樣處理子段。 子段結(jié)構(gòu)可用來對存儲器空間進行更緊湊的控制,可以使存儲器空間分配更加緊密。 4. 子段 子段命名
22、格式: 基段名: 子段名 子段名前為基段名,隨后為冒號,最后為子段名。 2022/8/12 10:5035第4章 匯編語言程序開發(fā)工具 對于子段,匯編器可以單獨為其分配存儲單元,或者在相同的基段名下與其他段組合在一起。 用.sect命令建立的段是已初始化的子段; 用.usect命令建立的段是未初始化的子段。 4. 子段 例如,若要在.text段內(nèi)建立一個稱之為_func的子段,其命令格式: .sect “.text:_func” 2022/8/12 10:5036第4章 匯編語言程序開發(fā)工具4.3.2 匯編器對段的處理 匯編器為每個段都安排了一個單獨的程序計數(shù)器稱之為段程序計數(shù)器SPC。 SP
23、C表示在程序代碼或數(shù)據(jù)段內(nèi)當前的地址。開始時匯編器將每個SPC置0。當匯編器將程序代碼或數(shù)據(jù)加到段內(nèi)時,增加相應(yīng)的SPC值。若再繼續(xù)對某個段匯編,則相應(yīng)的SPC就在先前的數(shù)值上繼續(xù)增加。 鏈接器在鏈接時要對每個段進行重新定位。 5. 段程序計數(shù)器SPC 2022/8/12 10:5037第4章 匯編語言程序開發(fā)工具【例4.3.1】段命令應(yīng)用舉例。 匯編語言源程序: .datacoeff .word 044h,055h,066h .bss buffer,8 prt .word 0456h .textadd: LD 0Dh,A aloop:SUB #1,A BC aloop,AGEQ .datai
24、vals .word 0CCh,0DDh,0EEh ;初始化數(shù)據(jù)段 ;3組數(shù)據(jù)放入.data段 ;在.bss段保留8個單元 ;0456h放入.data段 ;初始化文本段 ;1字指令 ;2字指令 ;2字指令共計5個字 ;初始化數(shù)據(jù)段 ;3組數(shù)據(jù)放入.data段2022/8/12 10:5038第4章 匯編語言程序開發(fā)工具匯編語言源程序:var2 .usect “newvars”,2 inbuf .usect “newvars”,8 .text mpy: LD 0Ah,B mloop: MPY #0Ah,B BC mloop,BNOV .sect “vectors” .word 044h,088h
25、 ;建立newvars命名段,保留2個單元 ;在newvars段保留8個單元 ;初始化文本段 ;1字指令 ;2字指令 ;2字指令共計5個字 ;建立vectors命名段 ;2組數(shù)據(jù)放入vectors命名段2022/8/12 10:5039第4章 匯編語言程序開發(fā)工具經(jīng)匯編后,得列表文件(部分): 2 *3 * 匯編一個初始化表到.data段 *4 *5 0000 .data6 0000 0044 coeff .word 044h,055h,066h 0001 0055 0002 00667 *8 * 在.bss段中為變量保留空間 *9 *10 0000 .bss buffer,811 *12 *
26、 仍然在.data 段中 *13 *14 0003 0456 prt .word 0456h2022/8/12 10:5040第4章 匯編語言程序開發(fā)工具15 *16 * 匯編代碼到.text段 *17 *18 0000 .text19 0000 100d add: LD 0Dh,A20 0001 f010 aloop: SUB #1, A 0002 0001 21 0003 f842 BC aloop,AGEQ 0004 0001 22 *23 * 匯編另一個初始化表到.data 段 * 24 *25 0004 .data 26 0004 00cc ivals .word 0CCh,0DDh
27、,0EEh 0005 00dd 0006 00ee27 *28 * 為更多的變量定義另一個段 *29 *30 0000 var2 .usect “newvars”,2 31 0001 inbuf .usect “newvars”,8 2022/8/12 10:5041第4章 匯編語言程序開發(fā)工具32 *33 * 匯編更多代碼到.text段 *34 *35 0005 .text 36 0005 110a mpy: LD 0Ah,B 37 0006 f166 mloop MPY #0Ah,B 0007 000a 38 0008 f868 BC mloop,BNOV 0009 0006 39 *40
28、 * 為中斷向量.vectors定義一個自定義段 * 41 *42 0000 .sect “vectors” 43 0000 0044 .word 044h,088h 0001 0088 源程序的行號 段程序計數(shù)器目標代碼匯編語言源程序2022/8/12 10:5042第4章 匯編語言程序開發(fā)工具 匯編語言源程序經(jīng)過匯編后,共建立了5個段: .text段文本段,段內(nèi)有10個字可執(zhí)行 的程序代碼。 .data段已初始化的數(shù)據(jù)段,段內(nèi)有7 個字的數(shù)據(jù)。 vectors段用.sect命令生成的命名段, 段內(nèi)有2個字的初始化數(shù)據(jù)。 .bss段未初始化的數(shù)據(jù)段,在存儲器中 為變量保留8個存儲單元。 ne
29、wvars段用.usect命令建立的命名段, 為變量保留10個存儲單元。 2022/8/12 10:5043第4章 匯編語言程序開發(fā)工具經(jīng)匯編后,得列表文件(部分): 2 *3 * 匯編一個初始化表到.data段 *4 *5 0000 .data6 0000 0044 coeff .word 044h,055h,066h 0001 0055 0002 00667 *8 * 在.bss段中為變量保留空間 *9 *10 0000 .bss buffer,811 *12 * 仍然在.data 段中 *13 *14 0003 0456 prt .word 0456h5 0000 .data6 0000
30、 0044 coeff .word 044h,055h,066h10 0000 .bss buffer,814 0003 0456 prt .word 0456h.data 6 00446 00556 006610 .bss 沒有數(shù)據(jù)保留8個字14 04562022/8/12 10:5044第4章 匯編語言程序開發(fā)工具15 *16 * 匯編代碼到.text段 *17 *18 0000 .text19 0000 100d add: LD 0Dh,A20 0001 f010 aloop: SUB #1, A 0002 0001 21 0003 f842 BC aloop,AGEQ 0004 000
31、1 22 *23 * 匯編另一個初始化表到.data 段 * 24 *25 0004 .data 26 0004 00cc ivals .word 0CCh,0DDh,0EEh 0005 00dd 0006 00ee27 *28 * 為更多的變量定義另一個段 *29 *30 0000 var2 .usect “newvars”,2 31 0001 inbuf .usect “newvars”,8 .text 18 0000 .text19 0000 100d add: LD 0Dh,A19 100d20 0001 f010 aloop: SUB #1, A20 f01020 000121 00
32、03 f842 BC aloop,AGEQ21 f84221 000125 0004 .data26 0004 00cc ivals .word 0CCh,0DDh,0EEh.data 26 00cc26 00dd26 00ee30 0000 var2 .usect “newvars”,2newvars 30 保留2個字31 0001 inbuf .usect “newvars”,831 保留8個字2022/8/12 10:5045第4章 匯編語言程序開發(fā)工具32 *33 * 匯編更多代碼到.text段 *34 *35 0005 .text 36 0005 110a mpy: LD 0Ah,B
33、 37 0006 f166 mloop MPY #0Ah,B 0007 000a 38 0008 f868 BC mloop,BNOV 0009 0006 39 *40 * 為中斷向量.vectors定義一個自定義段 * 41 *42 0000 .sect “vectors” 43 0000 0044 .word 044h,088h 0001 0088 35 0005 .text.text 36 0005 110a mpy: LD 0Ah,B 36 110a37 0006 f166 mloop MPY #0Ah,B37 f16837 000a38 0008 f868 BC mloop,BNOV
34、38 f86838 000642 0000 .sect “vectors”vectors 43 0000 0044 .word 044h,088h43 004443 00882022/8/12 10:5046第4章 匯編語言程序開發(fā)工具4.3.3 鏈接器對段的處理 鏈接器是開發(fā)C54x器件必不可少的開發(fā)工具之一,它對段處理時有2個主要任務(wù): 將一個或多個COFF目標文件中的各種段作為鏈接器的輸入段,經(jīng)鏈接后在一個執(zhí)行的COFF輸出模塊中建立各個輸出段; 在程序裝入時對其重新定位,為各個輸出段選定存儲器地址。 2022/8/12 10:5047第4章 匯編語言程序開發(fā)工具4.3.3 鏈接器對段的
35、處理 鏈接器有2條偽指令支持上述任務(wù): MEMORY偽指令用來定義目標系統(tǒng)的存儲器配置空間,包括對存儲器各部分命名,以及規(guī)定它們的起始地址和長度。 SECTIONS偽指令用來指定鏈接器將輸入段組合成輸出段方式,以及輸出段在存儲器中的位置,也可用于指定子段。 若未使用偽指令,則鏈接器將使用目標處理器默認的方法將段放入存儲空間。 2022/8/12 10:5048第4章 匯編語言程序開發(fā)工具4.3.3 鏈接器對段的處理 1. 默認的存儲器分配 鏈接器可對多個目標文件進行鏈接。若鏈接文件中不使用MEMORY和SECTIONS命令,則為默認方式。 每個目標文件都有.text,.data、.bss段和命
36、名段。若采用默認鏈接,鏈接器將對多個目標文件中的各個段進行組合,形成各自的對應(yīng)段,并將各個段配置到所指定的存儲器中,形成可執(zhí)行的目標模塊。 在默認的方式下,鏈接器將從存儲器的0080h開始,對組合后的各段進行存儲器配置。2022/8/12 10:5049第4章 匯編語言程序開發(fā)工具 默認的存儲器分配: 將所有.text段組合在一起,形成一個.text段,并分配到程序存儲器中; 將多個目標文件中的.data段組合在一起,分配到緊接著.text段的程序存儲空間中; 將.bss段組合,配置到數(shù)據(jù)存儲器中; 組合命名段。初始化的命名段按順序分配到緊隨.data段的程序存儲器,而未初始化命名段將被配置到
37、緊隨.bss段的數(shù)據(jù)存儲器中。 1. 默認的存儲器分配 2022/8/12 10:5050第4章 匯編語言程序開發(fā)工具 默認的存儲器分配過程:.text.text1.text2.data.data1.data2 .bss.bss1.bss2tabletable_1table_2u_vars1u_vars1u_vars2FFTFFT沒有使用沒有配置沒有配置沒有使用2022/8/12 10:5051第4章 匯編語言程序開發(fā)工具4.3.3 鏈接器對段的處理 2. 段放入存儲器空間 若不希望鏈接器將所有的.text段結(jié)合在一起形成單個的.text段,就不能采用默認的方式。 由于DSP硬件系統(tǒng)中可能配置
38、多種類型的存儲器,若要把某一段分配到特定類型的存儲器中,或?qū)⒚闻渲锰囟ǖ牡刂?,則需采用MEMORY和SECTIONS偽指令來配置。 若不采用默認的方式,通常需要建立一個鏈接命令文件,在命令文件中用MEMORY和SECTIONS偽指令定義存儲器和配置段地址。 2022/8/12 10:5052第4章 匯編語言程序開發(fā)工具4.3.4 鏈接器對程序的重新定位 1. 鏈接器重新定位 匯編器對每個段匯編時都是從0地址開始,而所有需要重新定位的符號(標號)在段內(nèi)都是相對于0地址的。事實上,所有段都不可能從存儲器中0地址單元開始,因此鏈接器必須對各個段進行重新定位。 重新定位的方法: 將各個段配置到存儲
39、器中,使每個段都有一個 合適的起始地址; 將符號變量調(diào)整到相對于新的段地址的位置; 將引用調(diào)整到重新定位后的符號,這些符號 反映了調(diào)整后的新符號值。 2022/8/12 10:5053第4章 匯編語言程序開發(fā)工具1. 鏈接器重新定位 匯編器在需要引用重新定位的符號處都留了一個重定位入口。鏈接器在對符號重新定位時,利用這些入口修正對符號的引用值。 【例4.3.2】一段采用助記符指令編寫的程序,經(jīng)匯編后得列表文件如下: 1 . ref X2 . ref Z3 0000 . text4 0000 F073 B Y ;產(chǎn)生一個重定位入口 0001 00065 0002 F073 B Z ;產(chǎn)生一個重定
40、位入口 0003 0000!6 0004 F020 LD #X,A ;產(chǎn)生一個重定位入口 0005 0000!7 0006 F7E0 Y: RESET 2022/8/12 10:5054第4章 匯編語言程序開發(fā)工具1. 鏈接器重新定位 程序中有三個符號: X、Z是在另一個模塊中定義的; Y在.text段中定義的。 當程序匯編時,X、Z的值為0未定義的外部符號 Y的值為6相對于.text段地址0定義 匯編器形成了兩個重定位入口: X和Z:在.text段中為一次外部引用,用符號!表示; Y:是一次內(nèi)部引用,用符號表示。 鏈接時,X重新定位在地址7100h .text段起始地址重新定位在7200h
41、Y的重新定位值為7204h。 2022/8/12 10:5055第4章 匯編語言程序開發(fā)工具1. 鏈接器重新定位 鏈接器利用兩個重定位入口,對目標文件中的兩次引用進行修正:變成 f073 7204變成 f020 7100 f073 B Y 0004 f020 LD #X,A 0000! 2022/8/12 10:5056第4章 匯編語言程序開發(fā)工具4.3.4 鏈接器對程序的重新定位 2. 運行時間重新定位 在實際運行中,有時需要將代碼裝入存儲器的一個地方,而在另一個地方運行。 如:一些關(guān)鍵的執(zhí)行代碼必須裝在系統(tǒng)的ROM中,但運行時希望在較快的RAM中進行。 利用SECTIONS偽指令選項可讓鏈
42、接器對其定位2次,其方法: 使用裝入關(guān)鍵字設(shè)置裝入地址; 使用運行關(guān)鍵字設(shè)置它的運行地址。2022/8/12 10:5057第4章 匯編語言程序開發(fā)工具4.3.4 鏈接器對程序的重新定位 2. 運行時間重新定位 裝入地址確定段的原始數(shù)據(jù)或代碼裝入的位置,而任何對段的使用(例如其中的標號),則參考它的運行地址。在應(yīng)用中必須將該段從裝入地址復(fù)制到運行地址。 如果只為段提供了一次定位(裝入或運行),則該段將只定位一次,并且裝入和運行地址相同。如果提供了2個地址,則段將被自動定位。 2022/8/12 10:5058第4章 匯編語言程序開發(fā)工具4.3.5 程序裝入 鏈接器產(chǎn)生可執(zhí)行的COFF目標文件。
43、可執(zhí)行的目標文件模塊與鏈接器輸入的目標文件具有相同的COFF格式。為了運行程序,在可執(zhí)行模塊中的數(shù)據(jù)必須傳輸或裝入目標系統(tǒng)存儲器中。 可以采用以下方法裝入程序: 使用調(diào)試工具轉(zhuǎn)入程序 C54x的調(diào)試工具包括軟件模擬器,XDS仿真器和集成系統(tǒng)CCS。它們都具有內(nèi)部的裝入器,調(diào)用裝入器的LOAD命令,裝入器將程序復(fù)制到目標系統(tǒng)的存儲器中。 采用Hex轉(zhuǎn)換工具轉(zhuǎn)入程序 可以使用轉(zhuǎn)換工具Hex500,將可執(zhí)行COFF目標模塊轉(zhuǎn)換成幾種其他目標格式文件,然后將轉(zhuǎn)換后的文件通過編程器將程序裝(燒)進EPROM。 2022/8/12 10:5059第4章 匯編語言程序開發(fā)工具4.3.6 COFF文件中的符號
44、 COFF文件中有一個符號表,主要用來存儲程序中有關(guān)符號的信息。鏈接器在執(zhí)行程序定位時,要使用符號表提供的信息,而調(diào)試工具也要使用該表來提供符號調(diào)試。 1. 外部符號 是指在一個模塊中定義、而在另一個模塊中引用的符號。它可以用偽指令.def、.ref或.global來定義。 .def在當前模塊中定義,并可在別的模塊中使用的符號; .ref 在當前模塊中使用,但在別的模塊中定義的符號; .global可以是上面的任何一種情況。 2022/8/12 10:5060第4章 匯編語言程序開發(fā)工具1. 外部符號【例4.3.3】說明代碼段中外部符號的定義。 x: ADD #56h,A B y .def x
45、 .ref y ;定義x ;引用y ;x在此模塊中定義,可為別 的模塊引用 ;y在這里引用,它在別的模 塊中定義 2022/8/12 10:5061第4章 匯編語言程序開發(fā)工具4.3.6 COFF文件中的符號 2. 符號表 每當遇到一個外部符號,無論是定義的還是引用的,匯編器都將在符號表中產(chǎn)生一個條目。 匯編器還產(chǎn)生一個指到每段的專門符號,鏈接器使用這些符號將其他引用符號重新定位。 2022/8/12 10:5062第4章 匯編語言程序開發(fā)工具4.4 源程序的匯編 匯編器的作用是將匯編語言源程序轉(zhuǎn)換成機器語言目標文件。這些目標文件都是公共目標文件格式(COFF)。 匯編語言源程序文件可以包含匯
46、編命令、匯編語言指令和宏指令。 匯編命令用來控制匯編的過程,包括列表格式、符號定義和將源代碼放入塊的方式等。 2022/8/12 10:5063第4章 匯編語言程序開發(fā)工具4.4 源程序的匯編 匯編器包括如下功能: 將匯編語言源程序匯編成一個可重新定位的目標文件(.obj文件)。 根據(jù)需要,可以生成一個列表文件(.lst文件),并對該列表進行控制。 將程序代碼分成若干個段,每個段的目標代碼都有一個SPC(段程序計數(shù)器)管理。 2022/8/12 10:5064第4章 匯編語言程序開發(fā)工具4.4 源程序的匯編 匯編器包括如下功能: 定義和引用全局符號,如果需要可以在列表文件后面附加一張交叉引用表
47、。 對條件程序塊進行匯編。 支持宏功能,允許定義宏命令。 為每個目標代碼塊設(shè)置一個程序計數(shù)器SPC。 2022/8/12 10:5065第4章 匯編語言程序開發(fā)工具4.4 源程序的匯編 4.4.1 匯編程序的運行 C54x的匯編程序名為asm500.exe。要運行匯編程序,可鍵入如下命令: asm500 input file object file listing file -options Asm500 : 運行匯編程序asm 500.exe的命令。 input file : 匯編源文件名,默認擴展名為.asm。 object file : 匯編程序生成的C54x目標文件,擴展名為.obj。
48、 若不提供目標文件名,則匯編程序就用輸入文件 或目標文件名。listing file : 匯編器產(chǎn)生的列表文件名,默認擴展名為.lst。 -options : 匯編器的選項,為匯編器的使用提供各種選擇。 2022/8/12 10:5066第4章 匯編語言程序開發(fā)工具4.4.2 匯編時的列表文件 匯編器對源程序匯編時,如果采用-l選項,匯編后將生成一個列表文件。列表文件中包括源程序語句和目標代碼。 每個列表文件的頂部有兩行匯編程序的標題、一行空行以及頁號行。.title命令提供的文件名打印在頁號行左側(cè);頁號打印在此行的右側(cè)。 源文件的每一行都會在列表文件中生成一行。其內(nèi)容包括行號、段程序計數(shù)器S
49、PC的數(shù)值、匯編后的目標代碼,以及源程序語句。一條指令可以生成1或2個字的目標代碼。匯編器為第2字單獨列一行,并列出了SPC的數(shù)值和目標代碼。 2022/8/12 10:5067第4章 匯編語言程序開發(fā)工具4.5 鏈接器的使用 鏈接器的主要任務(wù)是根據(jù)鏈接命令文件(.cmd),將一個或多個COFF目標文件鏈接起來,生成存儲器映像文件(.map)和可執(zhí)行的輸出文件(.out)。 在鏈接過程中,鏈接器將各個目標文件合并,并完成以下工作: 將各個段配置到目標系統(tǒng)的存儲器。 對各個符號和段進行重新定位,并給它們指 定一個最終的地址。 解決輸入文件之間未定義的外部引用。 2022/8/12 10:5068
50、第4章 匯編語言程序開發(fā)工具4.5.1 鏈接器的運行 1. 運行鏈接程序 C54x鏈接器的運行命令: lnk500 -options 1 n lnk500: 運行鏈接器命令。-options: 鏈接命令選項??梢猿霈F(xiàn)在命令行或鏈接命令文 件的任何位置。: 文件名??梢允悄繕宋募?、鏈接命令文件或文 件庫。所有文件擴展名的默認值為.obj。2022/8/12 10:5069第4章 匯編語言程序開發(fā)工具1. 運行鏈接程序 C54x鏈接器的運行,有三種方法: (1) 鍵入命令: lnk500 鏈接器會提示如下信息: Command files:Object files .obj: Output Fil
51、es a.out: Options: (要求鍵入一個或多個命令文件) (要求鍵入一個或多個需要鏈接的目標文件) (要求鍵入一個鏈接器所生成的輸出文件名)(要求附加一個鏈接選項 )2022/8/12 10:5070第4章 匯編語言程序開發(fā)工具1. 運行鏈接程序 (2) 鍵入命令: lnk500 -o link.out 在命令行中指定選項和文件名。 目標文件: 、 命令選項: -o 輸出文件: link.out 將兩個目標文件進行鏈接,生成一個可執(zhí)行的輸出文件link.out。2022/8/12 10:5071第4章 匯編語言程序開發(fā)工具1. 運行鏈接程序 (3) 鍵入命令: lnk500 lin
52、ker.cmd linker.cmd: 鏈接命令文件。 在執(zhí)行上述命令之前,需將鏈接的目標文件、鏈接命令選項以及存儲器配置要求等編寫到鏈接命令文件linker.cmd中。 例如:希望完成第二種命令的鏈接,在鏈接命令文件中,應(yīng)包含如下內(nèi)容: -o link.out 2022/8/12 10:5072第4章 匯編語言程序開發(fā)工具4.5.1 鏈接器的運行 2. 鏈接命令選項 在鏈接時,連接器通過鏈接命令選項控制鏈接操作。 鏈接命令選項可以放在命令行或命令文件中,所有選項前面必須加一短劃線“-”。除-l和-i選項外,其他選項的先后順序并不重要。 選項之間可以用空格分開。最常用選項為-m和-o,分別表示
53、輸出的地址分配表映像文件名和輸出可執(zhí)行文件名。 2022/8/12 10:5073第4章 匯編語言程序開發(fā)工具2. 鏈接命令選項 鏈接命令選項選 項含 義 -a 生成一個絕對地址的、可執(zhí)行的輸出模塊。所建立的絕 對地址輸出文件中不包含重新定位信息。如果既不用-a 選項,也不用-r選項,鏈接器就像規(guī)定-a選項那樣處理。 -ar 生成一個可重新定位、可執(zhí)行的目標模塊。這里采用了 -a和-r兩個選項(可以分開寫成-a -r,也可以連在一起 寫作-ar),與-a選項相比,-ar選項還在輸出文件中保留 有重新定位信息。 -e global_symbol 定義一個全局符號,這個符號所對應(yīng)的程序存儲器地址,
54、 就是使用開發(fā)工具調(diào)試這個鏈接后的可執(zhí)行文件時程序 開始執(zhí)行時的地址(稱為入口地址)。當加載器將一個程 序加載到目標存儲器時,程序計數(shù)器(PC)被初始化到入 口地址,然后從這個地址開始執(zhí)行程序。 2022/8/12 10:5074第4章 匯編語言程序開發(fā)工具2. 鏈接命令選項 鏈接命令選項選 項含 義 -f fill_vale 對輸出模塊各段之間的空單元設(shè)置一個16位數(shù)值 (fill_value),如果不用-f選項,則這些空單元都置0。 -i dir 更改搜索文檔庫算法,先到dir(目錄)中搜索。此選項 必須出現(xiàn)在-l選項之前。 -l 命名一個文檔庫文件作為鏈接器的輸入文件; 為文檔庫的某個文
55、件名。此選項必須出現(xiàn)在-i選項之后。 -m 生成一個.map映像文件,是映像文件的文件名。 .map文件中說明存儲器配置、輸入、輸出段布局以及外 部符號重定位之后的地址等。 -o 對可執(zhí)行輸出模塊命名。如果默認,則此文件名為a.out。 -r 生成一個可重新定位的輸出模塊。當利用-r選項且不用 -a選項時,鏈接器生成一個不可執(zhí)行的文件。 2022/8/12 10:5075第4章 匯編語言程序開發(fā)工具4.5.2 鏈接器命令文件的編寫與使用 鏈接命令文件用來為鏈接器提供鏈接信息,可將鏈接操作所需的信息放在一個文件中,這在多次使用同樣的鏈接信息時,可以方便地調(diào)用。 在鏈接命令文件中,可使用MEMOR
56、Y和SECTIONS偽指令,為實際應(yīng)用指定存儲器結(jié)構(gòu)和地址的映射。 MEMORY用來指定目標存儲器結(jié)構(gòu)。 SECTIONS用來控制段的構(gòu)成與地址分配。 2022/8/12 10:5076第4章 匯編語言程序開發(fā)工具4.5.2 鏈接器命令文件的編寫與使用 鏈接命令文件為ASC文件,可包含以下內(nèi)容: (1) 輸入文件名,用來指定目標文件、存檔庫或其他命令文件。 (2) 鏈接器選項,它們在命令文件中的使用方法與在命令行中相同。 (3) MEMORY和SECTIONS鏈接偽指令,用來指定目標存儲器結(jié)構(gòu)和地址分配。 (4) 賦值說明,用于給全局符號定義和賦值。2022/8/12 10:5077第4章 匯
57、編語言程序開發(fā)工具 例如:可根據(jù)給出鏈接命令,編寫完成該命令操作的鏈接器命令文件link.cmd。 lnk500 a.obj b.obj -m prog.map -o prog.out 該命令是將兩個目標文件a.obj和b.obj進行鏈接,生成一個映像文件prog.map和一個可執(zhí)行的輸出文件prog.out。 鏈接命令文件的內(nèi)容如下: a.obj /*第一個輸入文件名*/ b.obj /*第二個輸入文件名*/ -m prog.map /*指定map文件的選項*/ -o prog.out /*指定輸出文件的選項*/2022/8/12 10:5078第4章 匯編語言程序開發(fā)工具 【例4.5.1】
58、 鏈接器命令文件舉例。 a.obj b.obj /* 輸入文件名 */ -o prog.out /*指定輸出文件的選項*/ -m prog.map /*指定map文件的選項*/ MEMORY /*MEMORY 偽指令*/ PAGE 0: ROM:origin=1000h, length=0100h PAGE 1: RAM:origin=0100h, length=0100h SECTIONS /*SECTIONS偽指令*/ .text : ROM .data : ROM .bss : RAM 2022/8/12 10:5079第4章 匯編語言程序開發(fā)工具注意:在命令文件中,不能采用下列符號作為
59、段名或符號名: align DSECT len o run ALIGN f length org RUN attr fill LENGTH origin SECTIONS ATTR FILL load ORIGIN spare block group LOAD page type BLOCK GROUP MEMORY PAGE TYPE COPY l(小寫L) NOLOAD range UNION2022/8/12 10:5080第4章 匯編語言程序開發(fā)工具4.5.4 MEMORY指令 MEMORY指令用來規(guī)定目標存儲器的結(jié)構(gòu)。 在實際的應(yīng)用中,目標系統(tǒng)所配置的存儲器是各不相同的,通過MEMO
60、RY指令,可以進行各種各樣的存儲器配置。 MEMORY指令的句法: MEMORY PAGE0:name 1(attr):origin=constant, length=constant; PAGEn:name n(attr):origin=constant, length=constant; 指令字存儲區(qū)間說明語句書寫方式: 已大寫MEMORY指令字開始; 由大括號括起來的存儲器區(qū)間說明。存儲區(qū)間:存儲頁面區(qū)間名稱區(qū)間屬性起始地址區(qū)間長度2022/8/12 10:5081第4章 匯編語言程序開發(fā)工具4.5.4 MEMORY指令 存儲區(qū)間說明語句: PAGE: 指定存儲器空間頁面,最多為255頁
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度智慧城市建設(shè)合作外包合同范本3篇
- 2024年挖掘機配件供應(yīng)與售后服務(wù)合同3篇
- 學生節(jié)約勤儉之星事跡(10篇)
- 春節(jié)日記模板資料五篇
- 海洋平臺課程設(shè)計報告
- 家長會班長發(fā)言稿資料15篇
- 物流企業(yè)小課堂課程設(shè)計
- 收銀員個人離職申請書
- 病毒測試課程設(shè)計
- 智能互聯(lián)課程設(shè)計
- 典型地鐵突發(fā)事件應(yīng)急管理案例分析上海地鐵碰撞事故
- 手術(shù)室護理實踐指南術(shù)中低體溫預(yù)防
- (病理科)提高HE切片優(yōu)良率PDCA
- Creo-7.0基礎(chǔ)教程-配套課件
- 全國火車站編碼
- 違規(guī)建筑綜合整頓行動方案(二篇)
- 管理實訓(xùn)第四章目標管理的簡單應(yīng)用
- 2022-2023學年廣東深圳龍崗區(qū)七年級上冊期末地理試卷及答案
- 聚乙烯材料在污水吸附處理中的應(yīng)用研究
- 淺談貫流鍋爐在日本的應(yīng)用
- 《中華民族大團結(jié)》(初中) 全冊教案(共12課)
評論
0/150
提交評論