版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第4章匯編語言程序開發(fā)工具
內(nèi)容提要
可編程DSP芯片開發(fā)需要一套完整的軟、硬件開發(fā)工具。通??煞殖纱a生成工具和代碼調(diào)試工具兩大類。代碼生成工具是指將高級語言或匯編語言編寫的DSP程序轉(zhuǎn)換成可執(zhí)行的DSP芯片目標(biāo)代碼的工具程序,主要包括匯編器、鏈接器和C編譯器以及一些輔助工具程序等。
代碼調(diào)試工具包括C/匯編語言源碼調(diào)試器、仿真器等。
本章主要介紹代碼生成工具,包括’C54x軟件開發(fā)流程、匯編語言程序的編寫、編輯、匯編和鏈接過程、COFF段的一般概念、匯編器和鏈接器處理段的方法以及程序的重定位等。
2024/8/81第4章匯編語言程序開發(fā)工具
4.1
TMS320C54x軟件開發(fā)過程
4.2匯編語言程序的編輯、匯編和鏈接過程4.3
COFF的一般概念4.4源程序的匯編4.5鏈接器的使用2024/8/82第4章匯編語言程序開發(fā)工具4.1TMS320C54x軟件開發(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。
2024/8/83第4章匯編語言程序開發(fā)工具4.1TMS320C54x軟件開發(fā)過程1.
’C54x應(yīng)用軟件開發(fā)流程
’C54x應(yīng)用軟件的開發(fā)可在TI公司提供的開發(fā)環(huán)境中進行,用戶可以用C/C++語言或匯編語言編寫源文件,經(jīng)C編譯器、匯編器生成COFF格式的目標(biāo)文件,再用鏈接器進行鏈接,生成在’C54x上可執(zhí)行的目標(biāo)代碼,然后利用調(diào)試工具對可執(zhí)行的目標(biāo)代碼進行仿真和調(diào)試。
當(dāng)調(diào)試完成后,通過Hex代碼轉(zhuǎn)換工具,將調(diào)試后的可執(zhí)行目標(biāo)代碼轉(zhuǎn)換成EPROM編程器能接受的代碼,并將該代碼固化到EPROM中或加載到用戶的應(yīng)用系統(tǒng)中,以便DSP目標(biāo)系統(tǒng)脫離計算機單獨運行。
2024/8/84第4章匯編語言程序開發(fā)工具1.
’C54x應(yīng)用軟件開發(fā)流程開發(fā)過程的目的是產(chǎn)生一個可以由’C54x目標(biāo)系統(tǒng)執(zhí)行的模塊。C源文件C編譯器匯編源文件匯編器匯編源文件COFF目標(biāo)文件鏈接器可執(zhí)行的COFF文件宏源文件存檔器宏庫存檔器目標(biāo)文件庫建庫工具運行時支持庫EPROM編程器交叉引用列表器調(diào)試工具TMS320C54x絕對地址列表器HEX代碼轉(zhuǎn)換工具2024/8/85第4章匯編語言程序開發(fā)工具2.
’C54x的開發(fā)工具TI公司提供的DSP開發(fā)環(huán)境和工具主要包括以下三個局部:代碼生成工具代碼調(diào)試工具實時操作系統(tǒng)2024/8/86第4章匯編語言程序開發(fā)工具2.
’C54x的開發(fā)工具(1)代碼生成工具:C編譯器:用來將C/C++語言源程序自動編譯為’C54x的匯編語言源程序。匯編器:用來將匯編語言源文件匯編成機器語言COFF目標(biāo)文件。鏈接器:將匯編生成的、可重新定位的COFF目標(biāo)模塊組合成一個可執(zhí)行的COFF目標(biāo)模塊。文檔管理器:允許用戶將一組文件〔源文件或目標(biāo)文件〕集中為一個文檔文件庫。2024/8/87第4章匯編語言程序開發(fā)工具2.
’C54x的開發(fā)工具
助記符指令—代數(shù)式指令翻譯器:用來將包含助記符指令的匯編語言源文件轉(zhuǎn)換成包含代數(shù)式指令的匯編語言源文件。
建庫實用程序:用來建立用戶自己使用的、并用C/C++語言編寫的支持運行的庫函數(shù)。
十六進制轉(zhuǎn)換程序:可以很方便地將COFF目標(biāo)文件轉(zhuǎn)換成TI、Intel、Motorola等公司的目標(biāo)文件格式。(1)代碼生成工具:2024/8/88第4章匯編語言程序開發(fā)工具2.
’C54x的開發(fā)工具(1)代碼生成工具:
絕對制表程序:將鏈接后的目標(biāo)文件作為輸入,生成.abs輸出文件。
交叉引用制表程序:利用目標(biāo)文件生成一個交叉引用清單,列出鏈接的源文件中的符號以及它們的定義和引用情況。2024/8/89第4章匯編語言程序開發(fā)工具2.
’C54x的開發(fā)工具(2)代碼調(diào)試工具:
C/匯編語言源碼調(diào)試器:與軟件仿真器、評價模塊、軟件開發(fā)系統(tǒng)、軟件仿真器等配合使用。軟件仿真器:是一種模擬DSP芯片各種功能并在非實時條件下進行軟件調(diào)試的調(diào)試工具,它不需目標(biāo)硬件支持,只需在計算機上運行。初學(xué)者工具DSK:是TI公司提供給初學(xué)者進行DSP編程練習(xí)的一套廉價的實時軟件調(diào)試工具。2024/8/810第4章匯編語言程序開發(fā)工具2.
’C54x的開發(fā)工具(2)代碼調(diào)試工具:
軟件開發(fā)系統(tǒng)SWDS:是一塊PC插卡,可提供低本錢的評價和實時軟件開發(fā),還可用來進行軟件調(diào)試,程序可在DSP芯片上實時運行??蓴U展的開發(fā)系統(tǒng)仿真器(XDS510):可用來進行系統(tǒng)級的集成調(diào)試,是進行DSP芯片軟硬件開發(fā)的最正確工具。評價模塊EVM板:是一種低本錢的開發(fā)板,可進行DSP芯片評價、性能評估和有限的系統(tǒng)調(diào)試。2024/8/811第4章匯編語言程序開發(fā)工具4.2匯編語言程序的編輯、匯編和鏈接過程
匯編語言源程序可以在任何一種文本編輯器中進行。如筆記本、WORD、EDIT、TC等。
當(dāng)匯編語言源程序編寫完成后,還必須經(jīng)過匯編和鏈接后才能運行。
2024/8/812第4章匯編語言程序開發(fā)工具4.2匯編語言程序的編輯、匯編和鏈接過程示意圖匯編器調(diào)試程序鏈接器文本編輯器.asm源文件.obj目標(biāo)文件.out輸出文件.cmd鏈接命令文件.lst列表文件.map存儲器映像文件十六進制轉(zhuǎn)換程序HEX500-
o-
m-
l2024/8/813第4章匯編語言程序開發(fā)工具4.2匯編語言程序的編輯、匯編和鏈接過程1.
編輯
利用各種文本編輯器,如筆記本、WORD、EDIT和TC等,可編寫匯編語言源程序。
2.
匯編當(dāng)匯編語言源程序編寫好以后,可利用’C54x的匯編器ASM500,對一個或多個源程序分別進行匯編,并生成列表文件(.lst)和目標(biāo)文件(.obj)。
2024/8/814第4章匯編語言程序開發(fā)工具4.2匯編語言程序的編輯、匯編和鏈接過程2.
匯編常用的匯編命令:
asm500%1-s-1-x調(diào)用匯編器命令
源文件名
將程序所有定義的符號放在目標(biāo)文件的符號表中
生成一個列表文件.lst
生成一個交叉匯編表
2024/8/815第4章匯編語言程序開發(fā)工具4.2匯編語言程序的編輯、匯編和鏈接過程3.
鏈接所謂鏈接,就是利用’C54x的鏈接器LNK500,根據(jù)鏈接器命令文件(d)對已匯編過的一個或多個目標(biāo)文件(.obj)進行鏈接,生成輸出文件(.out)和存儲器映像文件(.map)。常用的匯編器命令:
lnk500%1dlnk500:
調(diào)用鏈接器命令
%1d:鏈接命令文件名,該文件須指明目標(biāo)文件、輸入文件、輸出文件、鏈接選項和存儲器配置要求等。2024/8/816第4章匯編語言程序開發(fā)工具4.3
COFF的一般概念
匯編器和鏈接器生成的目標(biāo)文件,是一個可以由’C54x器件執(zhí)行的文件。這些目標(biāo)文件的格式稱之為公共目標(biāo)文件格式(COFF)。
在編寫匯編語言程序時,COFF采用代碼段和數(shù)據(jù)段的形式,以便于模塊化的編程,使編程和管理變得更加方便。
這些代碼段和數(shù)據(jù)段簡稱為段。匯編器和鏈接器提供一些偽指令來建立和管理各種各樣的段。2024/8/817第4章匯編語言程序開發(fā)工具4.3
COFF的一般概念COFF文件的根本單元
COFF文件有3種類型:COFF0、COFF1、COFF2。
每種類型的COFF文件,其標(biāo)題格式都有所不同,但數(shù)據(jù)局部是相同的。
鏈接器能夠讀/寫所有類型的COFF文件,默認(rèn)時鏈接器生成的是COFF2文件,采用-vn鏈接選項可以選擇不同類型的COFF文件。
’C54x匯編器和C編譯器產(chǎn)生的是COFF2文件。
2024/8/818第4章匯編語言程序開發(fā)工具COFF文件的根本單元1.
段(sections)
是COFF文件中最重要的概念。每個目標(biāo)文件都分成假設(shè)干段。段——是存儲器中占據(jù)相鄰空間的代碼或數(shù)據(jù)塊。一個目標(biāo)文件中的每個段都是分開的和各不相同的。COFF目標(biāo)文件都包含以下3種形式的段:.text段(文本段),通常包含可執(zhí)行代碼;.data段(數(shù)據(jù)段),通常包含初始化數(shù)據(jù);.bss段(保存空間段),通常為未初始化變量保存存儲空間。2024/8/819第4章匯編語言程序開發(fā)工具COFF文件的根本單元2.段的根本類型COFF目標(biāo)文件中的段有兩種根本類型。
初始化段
未初始化段(1)
初始化段初始化段中包含有數(shù)據(jù)或程序代碼。主要有:
.text段——已初始化段;
.data段——已初始化段;.sect段——已初始化段,由匯編器偽指令建立的自定義段。
2024/8/820第4章匯編語言程序開發(fā)工具COFF文件的根本單元2.段的根本類型COFF目標(biāo)文件中的段有兩種根本類型。(2)
未初始化段
在存儲空間中,為未初始化數(shù)據(jù)保存存儲空間。它包括:.bss段——未初始化段;.usect段——未初始化段,由匯編命令建立的命名段〔自定義段〕。2024/8/821第4章匯編語言程序開發(fā)工具COFF文件的根本單元3.
段與目標(biāo)存儲器的對應(yīng)關(guān)系
匯編器的任務(wù):在匯編過程中,根據(jù)匯編命令用適當(dāng)?shù)亩螌⒏骶植砍绦虼a和數(shù)據(jù)連在一起,構(gòu)成目標(biāo)文件。鏈接器的任務(wù):就是分配存儲單元,將目標(biāo)文件中的段重新定位到目標(biāo)系統(tǒng)的存儲器中,這一過程稱為定位或分配。2024/8/822第4章匯編語言程序開發(fā)工具3.
段與目標(biāo)存儲器的對應(yīng)關(guān)系目標(biāo)文件中的段與目標(biāo)存儲器之間的關(guān)系
目標(biāo)文件目標(biāo)存儲器.bss.data.textRAME2PROMROM2024/8/823第4章匯編語言程序開發(fā)工具
匯編器對段的處理
匯編器對段的處理是通過段偽指令來區(qū)別各個段的,并將段名相同的語句匯編在一起。匯編器有5條偽指令可識別匯編語言程序的各個局部:
●
.bss
●
.usect
●
.text
●
.data
●
.sect——定義未初始化段——定義未初始化段——定義已初始化段——定義已初始化段——定義已初始化段2024/8/824第4章匯編語言程序開發(fā)工具
匯編器對段的處理
未初始化段就是在’C54x存儲器中保存空間,通常它們被定位在RAM區(qū)。在目標(biāo)文件中,這些段中沒有確切的內(nèi)容。由這些段定義的空間僅作為臨時存儲空間,在程序運行時,可以利用這些存儲空間存放變量。未初始化段分為默認(rèn)的和命名的兩種,分別由匯編器偽指令.bss和.usect產(chǎn)生。1.未初始化段
2024/8/825第4章匯編語言程序開發(fā)工具(1).bss偽指令1.未初始化段
用于在bss段中保存假設(shè)干個空間。格式:.bss符號,字?jǐn)?shù)符號——對應(yīng)于保存的存儲空間第一個字的變量名稱??梢宰屍渌我?,也可以用.global命令定義為全局符號。字?jǐn)?shù)——表示在bss段或標(biāo)有名字的段中保存假設(shè)干個存儲單元。每調(diào)用一次.bss偽指令,匯編器在相應(yīng)的段保存更多的空間。2024/8/826第4章匯編語言程序開發(fā)工具1.未初始化段
(2).usect偽指令用于為指定的命名段保存假設(shè)干個空間。格式:符號.usect“段名〞,字?jǐn)?shù)段名——程序員為未初始化的命名段定義的名字。每調(diào)用一次.usect偽指令,匯編器在指定的命名段保存更多的空間。2024/8/827第4章匯編語言程序開發(fā)工具
匯編器對段的處理
已初始化段中包含有可執(zhí)行代碼或初始化數(shù)據(jù)。
這些段中的內(nèi)容都在目標(biāo)文件中,當(dāng)加載程序時再放到’C54x的存儲器中。每個已初始化段都是可以重新定位的,并且可以引用其他段中所定義的符號。鏈接器在鏈接時會自動地處理段間的相互引用。
已初始化段由.text、.data和.sect三個偽指令建立。2.
已初始化段2024/8/828第4章匯編語言程序開發(fā)工具已初始化命令的句法:
2.
已初始化段.text[段起點].data[段起點].sect“段名〞[,段起點]段起點——是任選項。假設(shè)選用,它為段程序計數(shù)器SPC定義一個起始值。假設(shè)默認(rèn),那么SPC從0開始。2024/8/829第4章匯編語言程序開發(fā)工具
匯編器對段的處理
當(dāng)匯編器遇到.text或.data或.sect命令時,將停止對當(dāng)前段的匯編(相當(dāng)于一條結(jié)束當(dāng)前段匯編的命令),然后將緊接著的程序代碼或數(shù)據(jù)匯編到指定的段中,直到再遇到另一條.text、.data或.sect命令為止。
當(dāng)匯編器遇到.bss或.usect命令時,并不結(jié)束當(dāng)前段的匯編,只是暫時從當(dāng)前段脫離出來,并開始對新的段進行匯編。.bss和.usect命令可以出現(xiàn)在一個已初始化段的任何位置,而不會對它的內(nèi)容發(fā)生影響。2024/8/830第4章匯編語言程序開發(fā)工具
匯編器對段的處理
命名段由用戶指定,與默認(rèn)的.text,.data和.bss段的使用相同,但它們被分開匯編。假設(shè)一局部可執(zhí)行代碼〔例如初始化程序〕不希望和.text段分配在一起,可將它們匯編進一個命名段,這樣就可定位在與.text不同的地方。也可將初始化的數(shù)據(jù)匯編到與.data段不同的地方,或者將未初始化的變量保存在與.bss段不同的位置??捎?usect和.sect兩個偽指令產(chǎn)生命名段。3.命名段〔自定義段〕2024/8/831第4章匯編語言程序開發(fā)工具.usect偽指令產(chǎn)生類似.bss的段,為變量在RAM中保存存儲空間。.sect偽指令產(chǎn)生類似.text和.data的段,可以包含代碼或數(shù)據(jù)。.sect偽指令產(chǎn)生可重新定位地址的命名段。3.
命名段產(chǎn)生命名段偽指令格式:符號.usect“段名〞,字?jǐn)?shù).sect“段名〞
可以產(chǎn)生多達32767個不同的命名段。段名可長達200個字符。
2024/8/832第4章匯編語言程序開發(fā)工具對于.sect和.usect偽指令,段名可以作為子段的參考。每次用一個新名字調(diào)用這些偽指令時,就產(chǎn)生一個新的命名段。假設(shè)用已有的段名調(diào)用這些偽指令,那么匯編器就將代碼或數(shù)據(jù)〔或保存空間〕匯編進相應(yīng)名稱的段中。不同的偽指令不能使用相同的名字。即不能用.usect創(chuàng)立了命名段,然后又用.sect創(chuàng)立一個相同名字的段。3.
命名段2024/8/833第4章匯編語言程序開發(fā)工具
匯編器對段的處理
子段是較大段中的小段。鏈接器可以像處理其他段一樣處理子段。
子段結(jié)構(gòu)可用來對存儲器空間進行更緊湊的控制,可以使存儲器空間分配更加緊密。
4.
子段子段命名格式:基段名:子段名
子段名前為基段名,隨后為冒號,最后為子段名。
2024/8/834第4章匯編語言程序開發(fā)工具對于子段,匯編器可以單獨為其分配存儲單元,或者在相同的基段名下與其他段組合在一起。
用.sect命令建立的段是已初始化的子段;用.usect命令建立的段是未初始化的子段。4.
子段例如,假設(shè)要在.text段內(nèi)建立一個稱之為_func的子段,其命令格式:.sect“.text:_func〞2024/8/835第4章匯編語言程序開發(fā)工具
匯編器對段的處理
匯編器為每個段都安排了一個單獨的程序計數(shù)器稱之為段程序計數(shù)器SPC。SPC表示在程序代碼或數(shù)據(jù)段內(nèi)當(dāng)前的地址。開始時匯編器將每個SPC置0。當(dāng)匯編器將程序代碼或數(shù)據(jù)加到段內(nèi)時,增加相應(yīng)的SPC值。假設(shè)再繼續(xù)對某個段匯編,那么相應(yīng)的SPC就在先前的數(shù)值上繼續(xù)增加。鏈接器在鏈接時要對每個段進行重新定位。5.
段程序計數(shù)器SPC2024/8/836第4章匯編語言程序開發(fā)工具【例】段命令應(yīng)用舉例。
匯編語言源程序:
.datacoeff.word044h,055h,066h.bssbuffer,8prt.word0456h.textadd:LD0Dh,Aaloop:SUB#1,A
BCaloop,AGEQ.dataivals.word0CCh,0DDh,0EEh;初始化數(shù)據(jù)段;3組數(shù)據(jù)放入.data段;在.bss段保存8個單元;0456h放入.data段;初始化文本段;1字指令;2字指令;2字指令共計5個字
;初始化數(shù)據(jù)段
;3組數(shù)據(jù)放入.data段2024/8/837第4章匯編語言程序開發(fā)工具匯編語言源程序:var2.usect“newvars〞,2inbuf.usect“newvars〞,8.textmpy:LD0Ah,Bmloop:MPY#0Ah,BBCmloop,BNOV.sect“vectors〞.word044h,088h;建立newvars命名段,保存2個單元;在newvars段保存8個單元;初始化文本段;1字指令;2字指令;2字指令共計5個字;建立vectors命名段
;2組數(shù)據(jù)放入vectors命名段2024/8/838第4章匯編語言程序開發(fā)工具經(jīng)匯編后,得列表文件〔局部〕:2**********************************3**匯編一個初始化表到.data段**4**********************************50000.data600000044coeff.word044h,055h,066h00010055000200667**********************************8**在.bss段中為變量保存空間**9**********************************100000.bssbuffer,811**********************************12**仍然在.data段中**13**********************************1400030456prt.word0456h2024/8/839第4章匯編語言程序開發(fā)工具15**********************************16**匯編代碼到.text段**17**********************************180000.text190000100dadd:LD0Dh,A200001f010aloop:SUB#1,A00020001210003f842BCaloop,AGEQ00040001’22**********************************23**匯編另一個初始化表到.data段**24**********************************250004.data26000400ccivals.word0CCh,0DDh,0EEh000500dd000600ee27**********************************28**為更多的變量定義另一個段**29**********************************300000var2.usect“newvars〞,2310001inbuf.usect“newvars〞,82024/8/840第4章匯編語言程序開發(fā)工具32****************************************33**匯編更多代碼到.text段**34****************************************350005.text360005110ampy:LD0Ah,B370006f166mloopMPY#0Ah,B0007000a380008f868BCmloop,BNOV00090006’39****************************************40**為中斷向量.vectors定義一個自定義段**41****************************************420000.sect“vectors〞4300000044.word044h,088h00010088源程序的行號
段程序計數(shù)器目標(biāo)代碼匯編語言源程序2024/8/841第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個存儲單元?!駈ewvars段——用.usect命令建立的命名段,為變量保存10個存儲單元。2024/8/842第4章匯編語言程序開發(fā)工具經(jīng)匯編后,得列表文件〔局部〕:2*******************************3**匯編一個初始化表到.data段**4*******************************50000.data600000044coeff.word044h,055h,066h00010055000200667*******************************8**在.bss段中為變量保存空間**9*******************************100000.bssbuffer,811*******************************12**仍然在.data段中**13*******************************1400030456prt.word0456h行號目標(biāo)代碼段名100df0100001f8420001110af166000aF8680006004400550066045600cc00dd00ee00440088
沒有數(shù)據(jù)保留10個字50000.data600000044coeff.word044h,055h,066h100000.bssbuffer,81400030456prt.word0456h.data
6
00446
00556
006610
.bss
沒有數(shù)據(jù)保存8個字14
04562024/8/843第4章匯編語言程序開發(fā)工具15********************************16**匯編代碼到.text段**17********************************180000.text190000100dadd:LD0Dh,A200001f010aloop:SUB#1,A00020001210003f842BCaloop,AGEQ00040001’22**********************************23**匯編另一個初始化表到.data段**24**********************************250004.data26000400ccivals.word0CCh,0DDh,0EEh000500dd000600ee27********************************28**為更多的變量定義另一個段**29********************************300000var2.usect“newvars〞,2310001inbuf.usect“newvars〞,8行號目標(biāo)代碼段名100df0100001f8420001110af166000aF868000666614004400550066045600cc00dd00ee.data00440088
10沒有數(shù)據(jù)保留8個字.bss沒有數(shù)據(jù)保留10個字.text
180000.text190000100dadd:LD0Dh,A19
100d200001f010aloop:SUB#1,A20
f01020
0001210003f842BCaloop,AGEQ21
f84221
0001250004.data26000400ccivals.word0CCh,0DDh,0EEh.data
26
00cc26
00dd26
00ee300000var2.usect“newvars〞,2newvars
30
保存2個字310001inbuf.usect“newvars〞,831
保存8個字2024/8/844第4章匯編語言程序開發(fā)工具32*********************************33**匯編更多代碼到.text段**34*********************************350005.text360005110ampy:LD0Ah,B370006f166mloopMPY#0Ah,B0007000a380008f868BCmloop,BNOV00090006’39****************************************40**為中斷向量.vectors定義一個自定義段**41****************************************420000.sect“vectors〞4300000044.word044h,088h00010088行號目標(biāo)代碼段名1920202121100df0100001f8420001110af166000aF8680006.text66614262626004400550066045600cc00dd00ee.data00440088
10沒有數(shù)據(jù)保留8個字.bss3031沒有數(shù)據(jù)保留10個字newvars350005.text.text
360005110ampy:LD0Ah,B36
110a370006f166mloopMPY#0Ah,B37
f16837
000a380008f868BCmloop,BNOV38
f86838
0006420000.sect“vectors〞vectors
4300000044.word044h,088h43
004443
00882024/8/845第4章匯編語言程序開發(fā)工具
鏈接器對段的處理
鏈接器是開發(fā)’C54x器件必不可少的開發(fā)工具之一,它對段處理時有2個主要任務(wù):
①
將一個或多個COFF目標(biāo)文件中的各種段作為鏈接器的輸入段,經(jīng)鏈接后在一個執(zhí)行的COFF輸出模塊中建立各個輸出段;
②在程序裝入時對其重新定位,為各個輸出段選定存儲器地址。
2024/8/846第4章匯編語言程序開發(fā)工具
鏈接器對段的處理
鏈接器有2條偽指令支持上述任務(wù):
●MEMORY偽指令——用來定義目標(biāo)系統(tǒng)的存儲器配置空間,包括對存儲器各局部命名,以及規(guī)定它們的起始地址和長度?!馭ECTIONS偽指令——用來指定鏈接器將輸入段組合成輸出段方式,以及輸出段在存儲器中的位置,也可用于指定子段。假設(shè)未使用偽指令,那么鏈接器將使用目標(biāo)處理器默認(rèn)的方法將段放入存儲空間。2024/8/847第4章匯編語言程序開發(fā)工具
鏈接器對段的處理1.默認(rèn)的存儲器分配鏈接器可對多個目標(biāo)文件進行鏈接。假設(shè)鏈接文件中不使用MEMORY和SECTIONS命令,那么為默認(rèn)方式。每個目標(biāo)文件都有.text,.data、.bss段和命名段。假設(shè)采用默認(rèn)鏈接,鏈接器將對多個目標(biāo)文件中的各個段進行組合,形成各自的對應(yīng)段,并將各個段配置到所指定的存儲器中,形成可執(zhí)行的目標(biāo)模塊。在默認(rèn)的方式下,鏈接器將從存儲器的0080h開始,對組合后的各段進行存儲器配置。2024/8/848第4章匯編語言程序開發(fā)工具默認(rèn)的存儲器分配:
①將所有.text段組合在一起,形成一個.text段,并分配到程序存儲器中;
②將多個目標(biāo)文件中的.data段組合在一起,分配到緊接著.text段的程序存儲空間中;
③將.bss段組合,配置到數(shù)據(jù)存儲器中;
④組合命名段。初始化的命名段按順序分配到緊隨.data段的程序存儲器,而未初始化命名段將被配置到緊隨.bss段的數(shù)據(jù)存儲器中。
1.默認(rèn)的存儲器分配2024/8/849第4章匯編語言程序開發(fā)工具默認(rèn)的存儲器分配過程:File1.obj.text1.data1.bss1table_1(初始化的命名段)u_vars1(未初始化的命名段)File2.obj.text2.data2.bss2table_2(初始化的命名段)u_vars2(未初始化的命名段)FFT(初始化的命名段)程序存儲器數(shù)據(jù)存儲器.text.text1.text2.data.data1.data2.bss.bss1.bss2tabletable_1table_2u_vars1u_vars1u_vars2FFTFFT沒有使用沒有配置沒有配置沒有使用2024/8/850第4章匯編語言程序開發(fā)工具
鏈接器對段的處理2.段放入存儲器空間假設(shè)不希望鏈接器將所有的.text段結(jié)合在一起形成單個的.text段,就不能采用默認(rèn)的方式。由于DSP硬件系統(tǒng)中可能配置多種類型的存儲器,假設(shè)要把某一段分配到特定類型的存儲器中,或?qū)⒚闻渲锰囟ǖ牡刂?,那么需采用MEMORY和SECTIONS偽指令來配置。假設(shè)不采用默認(rèn)的方式,通常需要建立一個鏈接命令文件,在命令文件中用MEMORY和SECTIONS偽指令定義存儲器和配置段地址。2024/8/851第4章匯編語言程序開發(fā)工具
鏈接器對程序的重新定位1.
鏈接器重新定位匯編器對每個段匯編時都是從0地址開始,而所有需要重新定位的符號(標(biāo)號)在段內(nèi)都是相對于0地址的。事實上,所有段都不可能從存儲器中0地址單元開始,因此鏈接器必須對各個段進行重新定位。
重新定位的方法:將各個段配置到存儲器中,使每個段都有一個適宜的起始地址;將符號變量調(diào)整到相對于新的段地址的位置;將引用調(diào)整到重新定位后的符號,這些符號反映了調(diào)整后的新符號值。2024/8/852第4章匯編語言程序開發(fā)工具1.
鏈接器重新定位匯編器在需要引用重新定位的符號處都留了一個重定位入口。鏈接器在對符號重新定位時,利用這些入口修正對符號的引用值。
【例】一段采用助記符指令編寫的程序,經(jīng)匯編后得列表文件如下:
1
.refX2
.refZ30000.text40000F073
BY
;產(chǎn)生一個重定位入口
00010006’50002F073
BZ
;產(chǎn)生一個重定位入口
00030000!60004F020
LD#X,A
;產(chǎn)生一個重定位入口
00050000!70006F7E0
Y:RESET
2024/8/853第4章匯編語言程序開發(fā)工具1.
鏈接器重新定位程序中有三個符號:
X、Z——是在另一個模塊中定義的;Y——在.text段中定義的。當(dāng)程序匯編時,X、Z的值為0——未定義的外部符號
Y的值為6——相對于.text段地址0定義匯編器形成了兩個重定位入口:
X和Z:在.text段中為一次外部引用,用符號!表示;Y:是一次內(nèi)部引用,用符號’表示。鏈接時,X重新定位在地址7100h
.text段起始地址重新定位在7200hY的重新定位值為7204h。2024/8/854第4章匯編語言程序開發(fā)工具1.
鏈接器重新定位
鏈接器利用兩個重定位入口,對目標(biāo)文件中的兩次引用進行修正:變成
f073
7204變成
f020
7100
f073
BY
0004’
f020
LD#X,A
0000!
2024/8/855第4章匯編語言程序開發(fā)工具
鏈接器對程序的重新定位2.
運行時間重新定位在實際運行中,有時需要將代碼裝入存儲器的一個地方,而在另一個地方運行。
如:一些關(guān)鍵的執(zhí)行代碼必須裝在系統(tǒng)的ROM中,但運行時希望在較快的RAM中進行。
利用SECTIONS偽指令選項可讓鏈接器對其定位2次,其方法:
①使用裝入關(guān)鍵字設(shè)置裝入地址;
②使用運行關(guān)鍵字設(shè)置它的運行地址。2024/8/856第4章匯編語言程序開發(fā)工具
鏈接器對程序的重新定位2.
運行時間重新定位裝入地址確定段的原始數(shù)據(jù)或代碼裝入的位置,而任何對段的使用〔例如其中的標(biāo)號〕,那么參考它的運行地址。在應(yīng)用中必須將該段從裝入地址復(fù)制到運行地址。如果只為段提供了一次定位〔裝入或運行〕,那么該段將只定位一次,并且裝入和運行地址相同。如果提供了2個地址,那么段將被自動定位。2024/8/857第4章匯編語言程序開發(fā)工具
程序裝入
鏈接器產(chǎn)生可執(zhí)行的COFF目標(biāo)文件。可執(zhí)行的目標(biāo)文件模塊與鏈接器輸入的目標(biāo)文件具有相同的COFF格式。為了運行程序,在可執(zhí)行模塊中的數(shù)據(jù)必須傳輸或裝入目標(biāo)系統(tǒng)存儲器中。
可以采用以下方法裝入程序:
使用調(diào)試工具轉(zhuǎn)入程序
’C54x的調(diào)試工具包括軟件模擬器,XDS仿真器和集成系統(tǒng)CCS。它們都具有內(nèi)部的裝入器,調(diào)用裝入器的LOAD命令,裝入器將程序復(fù)制到目標(biāo)系統(tǒng)的存儲器中。采用Hex轉(zhuǎn)換工具轉(zhuǎn)入程序可以使用轉(zhuǎn)換工具Hex500,將可執(zhí)行COFF目標(biāo)模塊轉(zhuǎn)換成幾種其他目標(biāo)格式文件,然后將轉(zhuǎn)換后的文件通過編程器將程序裝〔燒〕進EPROM。2024/8/858第4章匯編語言程序開發(fā)工具
COFF文件中的符號
COFF文件中有一個符號表,主要用來存儲程序中有關(guān)符號的信息。鏈接器在執(zhí)行程序定位時,要使用符號表提供的信息,而調(diào)試工具也要使用該表來提供符號調(diào)試。
1.
外部符號
是指在一個模塊中定義、而在另一個模塊中引用的符號。它可以用偽指令.def、.ref或.global來定義。
●.def在當(dāng)前模塊中定義,并可在別的模塊中使用的符號;
●.ref在當(dāng)前模塊中使用,但在別的模塊中定義的符號;
●.global可以是上面的任何一種情況。
2024/8/859第4章匯編語言程序開發(fā)工具1.
外部符號【例】說明代碼段中外部符號的定義。
x:ADD#56h,ABy.defx
.refy
;定義x
;引用y
;x在此模塊中定義,可為別
的模塊引用
;y在這里引用,它在別的模
塊中定義
2024/8/860第4章匯編語言程序開發(fā)工具
COFF文件中的符號2.
符號表每當(dāng)遇到一個外部符號,無論是定義的還是引用的,匯編器都將在符號表中產(chǎn)生一個條目。匯編器還產(chǎn)生一個指到每段的專門符號,鏈接器使用這些符號將其他引用符號重新定位。
2024/8/861第4章匯編語言程序開發(fā)工具4.4源程序的匯編
匯編器的作用是將匯編語言源程序轉(zhuǎn)換成機器語言目標(biāo)文件。這些目標(biāo)文件都是公共目標(biāo)文件格式(COFF)。匯編語言源程序文件可以包含匯編命令、匯編語言指令和宏指令。匯編命令用來控制匯編的過程,包括列表格式、符號定義和將源代碼放入塊的方式等。2024/8/862第4章匯編語言程序開發(fā)工具4.4源程序的匯編
匯編器包括如下功能:①將匯編語言源程序匯編成一個可重新定位的目標(biāo)文件(.obj文件)。②根據(jù)需要,可以生成一個列表文件(.lst文件),并對該列表進行控制。③將程序代碼分成假設(shè)干個段,每個段的目標(biāo)代碼都有一個SPC(段程序計數(shù)器)管理。2024/8/863第4章匯編語言程序開發(fā)工具4.4源程序的匯編
匯編器包括如下功能:
④
定義和引用全局符號,如果需要可以在列表文件后面附加一張交叉引用表。
⑤
對條件程序塊進行匯編。
⑥
支持宏功能,允許定義宏命令。
⑦
為每個目標(biāo)代碼塊設(shè)置一個程序計數(shù)器SPC。
2024/8/864第4章匯編語言程序開發(fā)工具4.4源程序的匯編
匯編程序的運行
’C54x的匯編程序名為asm500.exe。要運行匯編程序,可鍵入如下命令:asm500
[inputfile
[objectfile
[listingfile]]]
[-options]
Asm500
:運行匯編程序asm
500.exe的命令。
inputfile
:匯編源文件名,默認(rèn)擴展名為.asm。
objectfile
:匯編程序生成的’C54x目標(biāo)文件,擴展名為.obj。假設(shè)不提供目標(biāo)文件名,那么匯編程序就用輸入文件或目標(biāo)文件名。listingfile
:匯編器產(chǎn)生的列表文件名,默認(rèn)擴展名為.lst。-options
:
匯編器的選項,為匯編器的使用提供各種選擇。2024/8/865第4章匯編語言程序開發(fā)工具
匯編時的列表文件
匯編器對源程序匯編時,如果采用-l選項,匯編后將生成一個列表文件。列表文件中包括源程序語句和目標(biāo)代碼。
每個列表文件的頂部有兩行匯編程序的標(biāo)題、一行空行以及頁號行。.title命令提供的文件名打印在頁號行左側(cè);頁號打印在此行的右側(cè)。
源文件的每一行都會在列表文件中生成一行。其內(nèi)容包括行號、段程序計數(shù)器SPC的數(shù)值、匯編后的目標(biāo)代碼,以及源程序語句。一條指令可以生成1或2個字的目標(biāo)代碼。匯編器為第2字單獨列一行,并列出了SPC的數(shù)值和目標(biāo)代碼。
2024/8/866第4章匯編語言程序開發(fā)工具4.5
鏈接器的使用鏈接器的主要任務(wù)是根據(jù)鏈接命令文件(d),將一個或多個COFF目標(biāo)文件鏈接起來,生成存儲器映像文件(.map)和可執(zhí)行的輸出文件(.out)。
在鏈接過程中,鏈接器將各個目標(biāo)文件合并,并完成以下工作:●
將各個段配置到目標(biāo)系統(tǒng)的存儲器。
●
對各個符號和段進行重新定位,并給它們指定一個最終的地址。
●
解決輸入文件之間未定義的外部引用。2024/8/867第4章匯編語言程序開發(fā)工具
鏈接器的運行
1.
運行鏈接程序
’C54x鏈接器的運行命令:
lnk500
[-options]filename1…filenamen
lnk500:
運行鏈接器命令。-options:
鏈接命令選項??梢猿霈F(xiàn)在命令行或鏈接命令文件的任何位置。filenames:
文件名??梢允悄繕?biāo)文件、鏈接命令文件或文件庫。所有文件擴展名的默認(rèn)值為.obj。2024/8/868第4章匯編語言程序開發(fā)工具1.
運行鏈接程序
’C54x鏈接器的運行,有三種方法:
(1)鍵入命令:
lnk500
鏈接器會提示如下信息:
Commandfiles:Objectfiles[.obj]:OutputFiles[a.out]:Options:(要求鍵入一個或多個命令文件)
(要求鍵入一個或多個需要鏈接的目標(biāo)文件)(要求鍵入一個鏈接器所生成的輸出文件名)(要求附加一個鏈接選項)2024/8/869第4章匯編語言程序開發(fā)工具1.
運行鏈接程序
(2)
鍵入命令:
lnk500
file1.obj
file2.obj
-olink.out
在命令行中指定選項和文件名。
目標(biāo)文件:
file1.obj、file2.obj
命令選項:
-o
輸出文件:
link.out
將兩個目標(biāo)文件進行鏈接,生成一個可執(zhí)行的輸出文件link.out。2024/8/870第4章匯編語言程序開發(fā)工具1.
運行鏈接程序
(3)
鍵入命令:
lnk500linkerdlinkerd:鏈接命令文件。在執(zhí)行上述命令之前,需將鏈接的目標(biāo)文件、鏈接命令選項以及存儲器配置要求等編寫到鏈接命令文件linkerd中。
例如:希望完成第二種命令的鏈接,在鏈接命令文件中,應(yīng)包含如下內(nèi)容:
file1.objfile2.obj-olink.out
2024/8/871第4章匯編語言程序開發(fā)工具
鏈接器的運行
2.
鏈接命令選項在鏈接時,連接器通過鏈接命令選項控制鏈接操作。鏈接命令選項可以放在命令行或命令文件中,所有選項前面必須加一短劃線“-〞。除-l和-i選項外,其他選項的先后順序并不重要。選項之間可以用空格分開。最常用選項為-m和-o,分別表示輸出的地址分配表映像文件名和輸出可執(zhí)行文件名。2024/8/872第4章匯編語言程序開發(fā)工具2.
鏈接命令選項鏈接命令選項選項含義-a
生成一個絕對地址的、可執(zhí)行的輸出模塊。所建立的絕對地址輸出文件中不包含重新定位信息。如果既不用-a
選項,也不用-r選項,鏈接器就像規(guī)定-a選項那樣處理。
-ar
生成一個可重新定位、可執(zhí)行的目標(biāo)模塊。這里采用了-a和-r兩個選項(可以分開寫成-a-r,也可以連在一起寫作-ar),與-a選項相比,-ar選項還在輸出文件中保留有重新定位信息。
-eglobal_symbol
定義一個全局符號,這個符號所對應(yīng)的程序存儲器地址,就是使用開發(fā)工具調(diào)試這個鏈接后的可執(zhí)行文件時程序開始執(zhí)行時的地址(稱為入口地址)。當(dāng)加載器將一個程序加載到目標(biāo)存儲器時,程序計數(shù)器(PC)被初始化到入口地址,然后從這個地址開始執(zhí)行程序。
2024/8/873第4章匯編語言程序開發(fā)工具2.
鏈接命令選項鏈接命令選項選項含義-ffill_vale
對輸出模塊各段之間的空單元設(shè)置一個16位數(shù)值(fill_value),如果不用-f選項,則這些空單元都置0。
-idir
更改搜索文檔庫算法,先到dir(目錄)中搜索。此選項必須出現(xiàn)在-l選項之前。
-lfilename命名一個文檔庫文件作為鏈接器的輸入文件;filename為文檔庫的某個文件名。此選項必須出現(xiàn)在-i選項之后。
-mfilename生成一個.map映像文件,filename是映像文件的文件名。.map文件中說明存儲器配置、輸入、輸出段布局以及外部符號重定位之后的地址等。
-ofilename
對可執(zhí)行輸出模塊命名。如果默認(rèn),則此文件名為a.out。
-r
生成一個可重新定位的輸出模塊。當(dāng)利用-r選項且不用-a選項時,鏈接器生成一個不可執(zhí)行的文件。
2024/8/874第4章匯編語言程序開發(fā)工具
鏈接器命令文件的編寫與使用鏈接命令文件用來為鏈接器提供鏈接信息,可將鏈接操作所需的信息放在一個文件中,這在屢次使用同樣的鏈接信息時,可以方便地調(diào)用。在鏈接命令文件中,可使用MEMORY和SECTIONS偽指令,為實際應(yīng)用指定存儲器結(jié)構(gòu)和地址的映射。MEMORY——用來指定目標(biāo)存儲器結(jié)構(gòu)。SECTIONS——用來控制段的構(gòu)成與地址分配。2024/8/875第4章匯編語言程序開發(fā)工具
鏈接器命令文件的編寫與使用鏈接命令文件為ASCⅡ文件,可包含以下內(nèi)容:
(1)
輸入文件名,用來指定目標(biāo)文件、存檔庫或其他命令文件。
(2)
鏈接器選項,它們在命令文件中的使用方法與在命令行中相同。
(3)
MEMORY和SECTIONS鏈接偽指令,用來指定目標(biāo)存儲器結(jié)構(gòu)和地址分配。
(4)
賦值說明,用于給全局符號定義和賦值。2024/8/876第4章匯編語言程序開發(fā)工具例如:可根據(jù)給出鏈接命令,編寫完成該命令操作的鏈接器命令文件linkd。
lnk500a.objb.obj-mprog.map-oprog.out該命令是將兩個目標(biāo)文件a.obj和b.obj進行鏈接,生成一個映像文件prog.map和一個可執(zhí)行的輸出文件prog.out。鏈接命令文件的內(nèi)容如下:
a.obj/*第一個輸入文件名*/b.obj/*第二個輸入文件名*/-mprog.map/*指定map文件的選項*/-oprog.out/*指定輸出文件的選項*/2024/8/877第4章匯編語言程序開發(fā)工具
【例】鏈接器命令文件舉例。
a.objb.obj/*輸入文件名*/
-oprog.out/*指定輸出文件的選項*/-mprog.map/*指定map文件的選項*/
MEMORY/*MEMORY偽指令*/
{PAGE0:ROM:origin=1000h,length=0100hPAGE1:RAM:origin=0100h,length=0100h}SECTIONS/*SECTIONS偽指令*/
{.text:>ROM.data:>ROM.bss:>RAM}
2024/8/878第4章匯編語言程序開發(fā)工具注意:在命令文件中,不能采用以下符號作為段名或符號名:
alignDSECTlenorunALIGNflengthorgRUNattrfillLENGTHoriginSECTIONSATTRFILLloadORIGINspareblockgroupLOADpagetypeBLOCKGROUPMEMORYPAGETYPECOPYl(小寫L)NOLOADrangeUNION2024/8/879第4章匯編語言程序開發(fā)工具4.5.4MEMORY指令
MEMORY指令用來規(guī)定目標(biāo)存儲器的結(jié)構(gòu)。在實際的應(yīng)用中,目標(biāo)系統(tǒng)所配置的存儲器是各不相同的,通過MEMORY指令,可以進行各種各樣的存儲器配置。MEMORY指令的句法:
MEMORY{PAGE0:name1[(attr)]:origin=constant,length=constant;PAGEn:namen[(attr)]:origin=constant,length=constant;}
指令字存儲區(qū)間說明語句書寫方式:①已大寫MEMORY指令字開始;
②由大括號括起來的存儲器區(qū)間說明。存儲區(qū)間:存儲頁面區(qū)間名稱區(qū)間屬性起始地址區(qū)間長度2024/8/880第4章匯編語言程序開發(fā)工具4.5.4MEMORY指令存儲區(qū)間說明語句:
PAGE:指定存儲器空間頁面,最多為255頁,取決于目標(biāo)存儲器的配置。每一個PAGE代表一個完全獨立的地址空間。通常,PAGE0用于程序存儲器;PAGE1用于數(shù)據(jù)存儲器。假設(shè)沒有規(guī)定PAGE,那么鏈接器默認(rèn)為PAGE0。2024/8/881第4章匯編語言程序開發(fā)工具4.5.4MEMORY指令存儲區(qū)間說明語句:
name:存儲器區(qū)間名稱。可由用字母、$、.、_等組成。存儲器區(qū)間為內(nèi)部記號,因此不需要保存在輸出文件或者符號表中。不同PAGE上的存儲器區(qū)間可以取相同的名字,但在同一PAGE內(nèi)的名字不能相同,且不許重疊配置。2024/8/882第4章匯編語言程序開發(fā)工具4.5.4MEMORY指令存儲區(qū)間說明語句:
attr:
為任選項,用來為命名的存儲器區(qū)間規(guī)
定1~4個屬性。
當(dāng)對輸出段定位時,可利用屬性限制輸出段分配到一定的存儲區(qū)間。
屬性選項共有4項:
R
規(guī)定可以對存儲器執(zhí)行讀操作。
W規(guī)定可以對存儲器執(zhí)行寫操作。
X
規(guī)定存儲器可以裝入可執(zhí)行的程序代碼。I規(guī)定可以對存儲器進行初始化。假設(shè)未選屬性,可將輸出段不受限制地定位到任何一個存儲器的位置。任何一個沒有規(guī)定屬性的存儲器(包括所有默認(rèn)方式的存儲器)都有全部4項屬性。2024/8/883第4章匯編語言程序開發(fā)工具4.5.4MEMORY指令存儲區(qū)間說明語句:
origin:用來指定存儲區(qū)間的起始地址,可簡寫為org或o。其值以字為單位,可以用十進制、八進制或十六進制數(shù)表示。
Length:
用來指定存儲器空間的長度,可簡寫為len或l,其值以字為單位,可以用十進制、八進制或十六進制數(shù)表示。2024/8/884第4章匯編語言程序開發(fā)工具4.5.4MEMORY指令存儲區(qū)間說明語句:
fill:
為任選項。用來為沒有定位輸出段的存儲器空單元充填一個數(shù),鍵入fill或f均可。該值是2個字節(jié)的整型常數(shù),可以是十進制數(shù)、八進制數(shù)或十六制數(shù)。2024/8/885第4章匯編語言程序開發(fā)工具【例】用MEMORY偽指令編寫連接命令文件。要求:
程序存儲器:4K字ROM,起始地址為C00h,取名為ROM。
數(shù)據(jù)存儲器:32字RAM,起始地址為60h,取名為SCR。
512字RAM,起始地址為80h,取名為CHIP。file1.objfiel2.obj-oProg.outMEMORY{
PAGE0:
ROM:origin=C00h,length=1000h
PAGE1:
SCR:origin=60h,length=20h
CHIP:origin=80h,length=200h}
兩個輸入文件鏈接命令選項指令字頁面名稱區(qū)間名稱起始地址區(qū)間長度2024/8/886第4章匯編語言程序開發(fā)工具【例】用MEMORY偽指令編寫連接命令文件。file1.objfiel2.obj-oProg.outMEMORY{ PAGE0:
ROM:org=C00h,len=1000hPAGE1:
SCR:org=60h,len=20h
CHIP
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度專業(yè)自駕旅游包車代駕服務(wù)合同
- 2025年度棚改項目回遷房買賣合同范本
- 2025年桉樹種植基地環(huán)保設(shè)施建設(shè)與運營合同3篇
- 2025版智能城市基礎(chǔ)設(shè)施建設(shè)招投標(biāo)與合同管理指導(dǎo)文件2篇
- 萬科旅游房產(chǎn)買賣合同(2024年專用)3篇
- 二零二五年度專業(yè)配音演員獨家聘用合同范本4篇
- 二零二五年度太陽能熱水系統(tǒng)施工合同規(guī)范文本4篇
- 二零二五年度創(chuàng)業(yè)公司股權(quán)激勵及期權(quán)授予合同3篇
- 二零二五年度團隊旅游數(shù)據(jù)共享合同
- 2025年度寫字樓退租合同(含辦公家具設(shè)備退還明細(xì))4篇
- 企業(yè)文化融入中華傳統(tǒng)文化的實施方案
- 9.1增強安全意識 教學(xué)設(shè)計 2024-2025學(xué)年統(tǒng)編版道德與法治七年級上冊
- 《化工設(shè)備機械基礎(chǔ)(第8版)》全套教學(xué)課件
- 人教版八年級數(shù)學(xué)下冊舉一反三專題17.6勾股定理章末八大題型總結(jié)(培優(yōu)篇)(學(xué)生版+解析)
- 2024屆上海高考語文課內(nèi)古詩文背誦默寫篇目(精校版)
- DL-T5024-2020電力工程地基處理技術(shù)規(guī)程
- 初中數(shù)學(xué)要背誦記憶知識點(概念+公式)
- 駕照體檢表完整版本
- 農(nóng)產(chǎn)品農(nóng)藥殘留檢測及風(fēng)險評估
- 農(nóng)村高中思想政治課時政教育研究的中期報告
- 20100927-宣化上人《愣嚴(yán)咒句偈疏解》(簡體全)
評論
0/150
提交評論