




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第4章匯編語(yǔ)言程序的開發(fā)工具 知識(shí)要點(diǎn):本章介紹了TMS320C54x軟件開發(fā)流程、匯編語(yǔ)言程序的編寫、編譯和鏈接過程,重點(diǎn)介紹了COFF段的一般概念、匯編器和鏈接器處理段的方法以及程序的重定位方法等。4.1 TMS320C54x軟件開發(fā)流程 C54x的應(yīng)用軟件開發(fā)主要完成以下的工作: 首先是選擇編程語(yǔ)言編寫源程序。C54x提供兩種編程語(yǔ)言:匯編語(yǔ)言和C/C+語(yǔ)言。 當(dāng)源程序編寫好后,選擇開發(fā)環(huán)境, C54x提供了兩種開發(fā)環(huán)境。一種是非集成開發(fā)環(huán)境,如圖4.1.1。另一種是集成開發(fā)環(huán)境,簡(jiǎn)稱CCS。CCS在Windows操作系統(tǒng)下運(yùn)行,它集成了非集成開發(fā)環(huán)境的所有功能,并擴(kuò)展了許多其他的功能。
2、在后面的章節(jié)中會(huì)有介紹。 如果源程序是C/C+語(yǔ)言,需調(diào)用C54x的C編譯器將其編譯成匯編語(yǔ)言,并送入C54x的匯編器進(jìn)行匯編。對(duì)于用匯編語(yǔ)言編寫的程序則直接送給匯編器進(jìn)行匯編,匯編后產(chǎn)生COFF格式的目標(biāo)文件,再用鏈接器進(jìn)行鏈接,生成在C54x可執(zhí)行的COFF格式的目標(biāo)代碼,并利用調(diào)試工具對(duì)可執(zhí)行的目標(biāo)代碼進(jìn)行調(diào)試。 對(duì)C54x應(yīng)用程序的開發(fā)提供以下幾個(gè)開發(fā)調(diào)試工具: C/匯編語(yǔ)言源碼調(diào)試器與軟件仿真器、評(píng)價(jià)模塊、軟件開發(fā)系統(tǒng)、軟件模擬器等開發(fā)工具配合使用。 軟件仿真模擬器 集成開發(fā)環(huán)境CCS DSK 軟件開發(fā)系統(tǒng)SWDS 可擴(kuò)展的開發(fā)系統(tǒng)仿真器(XDS510) 評(píng)價(jià)模塊(EVM板) 4.2
3、 匯編語(yǔ)言程序的編輯、匯編和鏈接過程 匯編語(yǔ)言源程序可以在任何一種文本編輯器中進(jìn)行。當(dāng)匯編語(yǔ)言源程序完成后,還必須經(jīng)過匯編和鏈接后才能進(jìn)行。 下圖給出了匯編語(yǔ)言程序的編輯、匯編和鏈接過程: 文本編輯器匯編器鏈接器調(diào)試程序.cmd鏈接命令文件.lst列表文件轉(zhuǎn)換程序.asm源文件.obj目標(biāo)文件.out輸出文件-l-m.map存儲(chǔ)器映像文件 編輯 利用各種文本編輯器,如記事本、WORD、EDIT等,可編寫匯編語(yǔ)言源程序。 匯編 當(dāng)匯編語(yǔ)言源程序編寫好以后,可利用C54x的匯編器ASM500,對(duì)一個(gè)或多個(gè)源程序進(jìn)行匯編,生成.lst文件和.obj文件。 常用匯編命令為: asm500 %1 -s
4、-l -x 鏈接 鏈接就是利用C54x的鏈接器LNK500,根據(jù)鏈接器命令文件(.cmd)對(duì)已匯編過的一個(gè)或多個(gè)目標(biāo)文件(.obj)進(jìn)行鏈接,生成存儲(chǔ)器映像文件(.map)和輸出文件(.out)。 常用鏈接命令為 lnk500 %1.cmd 調(diào)試 對(duì)輸出文件(.out)調(diào)試可以采用多種手段,現(xiàn)介紹如下: 軟件仿真器進(jìn)行調(diào)試 硬件仿真器進(jìn)行調(diào)試 評(píng)價(jià)模塊進(jìn)行調(diào)試 固化用戶程序 調(diào)試完成后,利用HEX500格式轉(zhuǎn)換器對(duì)ROM編程,或?qū)PROM編程,最后安裝到用戶的的應(yīng)用系統(tǒng)中。4.3 COFF的一般概念 匯編器和鏈接器生成的目標(biāo)文件,是一個(gè)可以由C54x器件執(zhí)行的文件。這些目標(biāo)文件的格式稱為公共
5、目標(biāo)文件格式(Common Object File Format, 縮寫為COFF)。 COFF采用代碼段和數(shù)據(jù)段的形式,因此便于模塊化的編程。4.3.1 COFF文件的基本單元 COFF文件有3種類型:COFF0、COFF1、COFF2。每種類型的COFF文件的標(biāo)題格式都有所不同,但數(shù)據(jù)部分卻是相同的。 段是COFF文件中最重要的概念。每個(gè)目標(biāo)文件都分成若干段。 段是在存儲(chǔ)器圖中占據(jù)相鄰空間的代碼或數(shù)據(jù)塊。 所有的COFF目標(biāo)文件都包含以下3種形式段: .text段,通常包含可執(zhí)行代碼; .data段,通常包含初始化數(shù)據(jù); .bss段,通常為未初始化變量保留存儲(chǔ)空間。 此外,匯編器和鏈接器可
6、以建立、命名和鏈接自定義段。這種自定義段是程序員自已定義的段,使用起來(lái)與.data、.text、及.bss段類似。它的好處是在目標(biāo)文件中與.data、.text、及.bss分開匯編,鏈接時(shí)作為一個(gè)單獨(dú)部分分配到存儲(chǔ)器中。 COFF目標(biāo)文件有以下兩種基本類型的段。 初始化段 初始化段中包含有數(shù)據(jù)或程序代碼。包括: .text段是已初始化段; .data段是已初始化段; .sect匯編器偽指令建立的自定義段也是已初始化段。 未初始化段 在存儲(chǔ)空間中,它為未初始化數(shù)據(jù)保留存儲(chǔ)空間。包括: .bss段未初始化段; .usect匯編命令建立的自定義段也是未初始化段。 鏈接器的一個(gè)任務(wù)就是分配存儲(chǔ)單元,即
7、把各個(gè)段重新定位到目標(biāo)存儲(chǔ)器中,如下圖: 鏈接器的功能之一是將目標(biāo)文件中的段重新定位到目標(biāo)系統(tǒng)的存儲(chǔ)器中,該功能稱為定位或分配。 大多數(shù)系統(tǒng)都包含有幾種存儲(chǔ)器,通過對(duì)各個(gè)段的重新定位,可以使目標(biāo)存儲(chǔ)器得到更加有效的利用。4.3.2 匯編器對(duì)段的處理 匯編器對(duì)段的處理是通過段偽指令來(lái)區(qū)別各個(gè)段,并將段名相同的語(yǔ)句匯編在一起。匯編器有5條命令可識(shí)別匯編語(yǔ)言程序的各個(gè)部分。這5條命令是: .bss(未初始化段) .usect(未初始化段) .text(已初始化段) .data(已初始化段) .sect(已初始化段) 未初始化段 .bss和.usect命令生成未初始化段。未初始化段就是C54x存儲(chǔ)器中
8、的保留空間,通常將它們定位到RAM區(qū)。在目標(biāo)文件中,這些段沒有確切的內(nèi)容;在程序運(yùn)行時(shí),可以利用這些存儲(chǔ)空間存放變量。 這兩條命令句法如下: .bss符號(hào),字?jǐn)?shù) .usect“段名”,字?jǐn)?shù) 符號(hào)對(duì)應(yīng)于保留的存儲(chǔ)空間第一個(gè)字的變量名稱,可讓其它段引用,也可以定義為全局符號(hào); 字?jǐn)?shù)表示在.bss段或標(biāo)有名字的段中保留多少個(gè)存儲(chǔ)單元; 段名程序員為自定義未初始化段起的名字。 已初始化段 .text、.data和.sect命令生成已初始化段。已初始化段中包含有可執(zhí)行代碼或初始化數(shù)據(jù)。這些段中的內(nèi)容都在目標(biāo)文件中,當(dāng)加載程序時(shí)再放到C54x的存儲(chǔ)器中。每一個(gè)已初始化段都是可以重新定位的,并且可以引用其他
9、段中所定義的符號(hào)。 3條初始化命令的句法如下: .text段起點(diǎn) .data段起點(diǎn) sect“段名”,段起點(diǎn) 其中,段起點(diǎn)是任選項(xiàng)。如果選用,它就是為段計(jì)數(shù)器(SPC)定義的一個(gè)起始值。如果默認(rèn),則SPC從0開始。當(dāng)匯編器遇到.text、.data和.sect命令時(shí),將停止對(duì)當(dāng)前段的匯編,然后將緊接著的程序代碼或數(shù)據(jù)匯編到指定段中,直到再遇到另一條.text、.data和.sect命令為止。 當(dāng)匯編器遇到.bss或.usect命令時(shí),并不結(jié)束當(dāng)前段的匯編,只是暫時(shí)從當(dāng)前段脫離出來(lái),并開始對(duì)新的段進(jìn)行匯編。 段的構(gòu)成要經(jīng)過一個(gè)反復(fù)的過程。 命名段 命名段由用戶指定,與默認(rèn)的.text,.data
10、和.bss段的使用相同,但它們被分開匯編。 例如,重復(fù)使用.text段建成單個(gè).text段,在鏈接時(shí),這個(gè).text段被作為單個(gè)單元定位。 假如不希望一部分可執(zhí)行代碼和.text段分配在一起,可將它們匯編進(jìn)一個(gè)命名段,這樣就可定位在與.text段不同的地方,也可將初始化的數(shù)據(jù)匯編到與.data段不同的地方,或者將未初始化的變量保留在與.bss段不同的位置。此時(shí),可用以下兩個(gè)產(chǎn)生命名段的偽指令: .usect偽指令產(chǎn)生類似.bss段,為變量在RAM中保留存儲(chǔ)空間。 .sect偽指令產(chǎn)生類似.text和.data段,可以包含代碼和數(shù)據(jù)。 .sect偽指令產(chǎn)生地址可重新定位的命名段。 這兩個(gè)偽指令的
11、使用句法為: 符號(hào).usect “段名”,字?jǐn)?shù) .sect “段名” 可以產(chǎn)生多達(dá)32767不同的命名段。不同的偽指令不能使用相同的名字,也就是說,不能用.usect 創(chuàng)建命名段,然后用.sect 再創(chuàng)建一個(gè)相同名字的段。 子段 子段是較大段中的小段。 鏈接器可以像處理段一樣處理子段。子段結(jié)構(gòu)可用來(lái)對(duì)存儲(chǔ)器間進(jìn)行更緊湊的控制,可以使存儲(chǔ)器圖更加緊密。 子段的命名的句法為: 基段名:子段名 例如,若要在.text段內(nèi)建立一個(gè)稱之為_func的子段,可以用如下的命令: .sect“.text: _func” 段程序計(jì)數(shù)器(SPC) 匯編器為每個(gè)段都安排了一個(gè)單獨(dú)的程序計(jì)數(shù)器段程序計(jì)數(shù)器,簡(jiǎn)稱SPC
12、。 SPC表示一個(gè)程序代碼或數(shù)據(jù)段內(nèi)當(dāng)前的地址。開始時(shí)匯編器將每個(gè)SPC置0。當(dāng)匯編器將程序代碼或數(shù)據(jù)加到一個(gè)段內(nèi)時(shí),相應(yīng)的SPC就增加。如果再繼續(xù)對(duì)某個(gè)段匯編,則相應(yīng)的SPC就在先前的數(shù)值上繼續(xù)增加。鏈接器在鏈接時(shí)要對(duì)每個(gè)段重新定位。 下例列出的是一個(gè)匯編語(yǔ)言程序匯編后的.lst文件。.lst文件由4個(gè)部分組成,即 第一部分(Field1):源程序行號(hào) 第二部分(Field2):段程序計(jì)數(shù)器 第三部分(Field3):目標(biāo)代碼 第四部分(Field4):源程序50000 .data60000 0044 coeff .word044h,055h,066h0001 00550002 006610
13、0000.bss buffer, 8140003 0456 prt .word0456h180000.text190000100dadd:LD0Dh,A200001f010aloop:SUB#1, A00020001210003f842BCaloop, AGEQ25000400010004.data000400ccivals.word0CCh,0DDh,0EEh000500dd000600ee300000var2 .usect“newvars”, 2310001inbuf .usect“newvars”, 8350005 text360005110a mpy:LD0Ah,B370006f166
14、 mloop: MPY#0Ah,B0007000a380008f86800090006420000 .sect “vectors”4300000044 .word 044h, 088h4400010088 在此例中,共建立了5個(gè)段: .text段內(nèi)有10個(gè)字的程序代碼 .data段內(nèi)有7個(gè)字的數(shù)據(jù) vectors是一個(gè)用.sect命令生成的自定義段,段內(nèi)有2個(gè)字的已初始化數(shù)據(jù) .bss在存儲(chǔ)器中為變量保留8個(gè)存儲(chǔ)單元 .newvars是一個(gè)用.usect命令建立的自定義段,它在存儲(chǔ)器中為變量保留10個(gè)存儲(chǔ)單元。 在此例中 建立的5個(gè)段如圖4.3.2。 4.3.3 鏈接器對(duì)段的處理 鏈接器是開發(fā)
15、TMS320C54x器件必不可少的開發(fā)工具,它對(duì)段處理時(shí)有兩個(gè)任務(wù): 其一是將一個(gè)或多個(gè)COFF目標(biāo)文件中的各種段作為鏈接器的輸入段,經(jīng)鏈接后在一個(gè)執(zhí)行的COFF輸出模塊中建立各個(gè)輸出段; 其二是為各個(gè)輸出段選定存儲(chǔ)器地址。 鏈接器有2條偽指令支持上述任務(wù)。 MEMORY偽指令。 用來(lái)定義目標(biāo)系統(tǒng)的存儲(chǔ)器分配空間,包括對(duì)存儲(chǔ)器各部分命名,及規(guī)定它們的起始地址和長(zhǎng)度。 SECTIONS偽指令。 它告訴連接器如何將輸入段組合成輸出段,及將輸出段放在存儲(chǔ)器中的什么位置。 默認(rèn)的存儲(chǔ)器分配 書圖4.3.3說明了兩個(gè)文件的鏈接過程。 4.3.3 兩個(gè)文件的鏈接過程 圖4.3.3中,鏈接器對(duì)目標(biāo)文件fil
16、e1.obj和file2.obj進(jìn)行鏈接。每個(gè)目標(biāo)文件中,都有.text、.data和.bss段,此外還有自定義段。 鏈接器將兩個(gè)文件的.text段組合在一起,以形成一個(gè).text段,然后再將兩個(gè)文件的.data段和.bss段以及最后自定義段組合在一起。 段放入存儲(chǔ)器空間 圖4.3.3說明了鏈接器結(jié)合段的默認(rèn)方法,有時(shí)希望采用其他的結(jié)合方法。 例如,可能不希望將所有的.text段結(jié)合在一起形成單個(gè)的.text段,或者希望將命名段放在.data的前面。 若希望將段放在指定類型的存儲(chǔ)器中,此時(shí)可采用MEMORY和SECTIONS偽指令。4.3.4 鏈接器對(duì)程序的重新定位 鏈接器重新定位 匯編器處理
17、每個(gè)段都是從地址0開始,而所有需要重新定位的符號(hào)(標(biāo)號(hào))在段內(nèi)都是相對(duì)于地址0的。 事實(shí)上,所有段都不可能從存儲(chǔ)器中地址0單元開始,因此鏈接器必須通過以下方法對(duì)各個(gè)段進(jìn)行重新定位: 將各個(gè)段定位到存儲(chǔ)器空間中,這樣一來(lái)每個(gè)段都能從一個(gè)恰當(dāng)?shù)牡刂烽_始; 將符號(hào)變量調(diào)整到相對(duì)于新的段地址的位置; 將引用調(diào)整到重新定位后的符號(hào),這些符號(hào)反映了調(diào)整后的新符號(hào)值。 匯編器在需要引用重新定位的符號(hào)處都留了一個(gè)重定位入口。鏈接器在對(duì)符號(hào)重新定位時(shí),利用這些入口修正對(duì)符號(hào)的引用值。下面舉例說明:1 .refX ;符號(hào)X、Y、Z需要重新定位2.refZ ;X、Z是在另一個(gè)模塊中定義的30000.text ;Y是
18、在這個(gè)模塊的.text段定義的40000 F073BY ;產(chǎn)生一個(gè)重新定位入口 0001 0006 ;Y的值為6,X和Z值為050002 F073BZ ;產(chǎn)生一個(gè)重新定位入口 0003 0000!60004 F020LD#X,A ;產(chǎn)生一個(gè)重新定位入口 0005 0000!70006 F7E0Y:RESET 假設(shè)鏈接時(shí)X重新定位地址7100H, .text段重新定位到從地址7200H開始,那么Y的重新定位值為7204H。鏈接器利用重定位入口,對(duì)目標(biāo)文件中的兩次引用進(jìn)行修正。f073 B Y 變成 f0730004 7204 f020 LD #X, A 變成 f020 0000 7100 運(yùn)行時(shí)
19、間重新定位 有時(shí),希望將代碼裝入存儲(chǔ)器的一個(gè)地方,而在另一個(gè)地方運(yùn)行。 例如一些關(guān)鍵的執(zhí)行代碼必須裝在系統(tǒng)的ROM中,但希望在較快的RAM中運(yùn)行,鏈接器提供了一個(gè)處理該問題的簡(jiǎn)單方法,利用SECTIONS偽指令選項(xiàng)可讓鏈接器定位兩次,第一次使用裝入關(guān)鍵字設(shè)置裝入地址,再使用運(yùn)行關(guān)鍵字設(shè)置它的運(yùn)行地址。 如果只為段提供一次定位,則該段將只定位一次,并且裝入和運(yùn)行地址相同。 未初始化的段(例如.bss)不能裝入,所以它僅有的有意義的地址為運(yùn)行地址,鏈接器只對(duì)沒有初始化的段定位一次。4.3.5 程序裝入 鏈接器產(chǎn)生可執(zhí)行的COFF目標(biāo)文件??蓤?zhí)行的目標(biāo)文件模塊與鏈接器輸入的目標(biāo)文件具有相同的COFF
20、格式,但在可執(zhí)行的目標(biāo)文件中,對(duì)段進(jìn)行結(jié)合并在目標(biāo)存儲(chǔ)器中進(jìn)行重新定位。 為了運(yùn)行程序,在可執(zhí)行模塊中的數(shù)據(jù)必須傳輸或裝入目標(biāo)系統(tǒng)存儲(chǔ)器。 有兩種方法可以用來(lái)裝入程序,選哪種方法取決于執(zhí)行環(huán)境。 TMS320C54x調(diào)試工具。包括軟件模擬器、XDS仿真器和集成系統(tǒng)CCS。它們都具有內(nèi)部裝入器,包含調(diào)用LOAD命令。裝入器讀取可執(zhí)行文件,將程序復(fù)制到目標(biāo)系統(tǒng)的存儲(chǔ)器中。 采用Hex轉(zhuǎn)換工具。例如Hex500,將可執(zhí)行COFF目標(biāo)模塊轉(zhuǎn)換成幾種其他目標(biāo)格式文件,然后將轉(zhuǎn)換后的文件寫入EPROM。4.3.6 COFF文件中的符號(hào) COFF文件中有一個(gè)符號(hào)表,主要用來(lái)存儲(chǔ)程序中有關(guān)符號(hào)的消息,鏈接時(shí)對(duì)
21、符號(hào)進(jìn)行重新定位要用到該表,調(diào)試程序也要用到它。 外部符號(hào) 外部符號(hào),是在一個(gè)模塊中定義、又可以在另一個(gè)模塊中引用的符號(hào)??梢杂脗沃噶?def、.ref或.global來(lái)定義某些符號(hào)為外部符號(hào)。 .def指令在當(dāng)前模塊中定義,并可在別的模塊中使用的符號(hào) .ref指令在當(dāng)前模塊中使用在別的模塊中定義的符號(hào) .global指令可以是上面的任何一種情況 例:以下的代碼段說明上面的定義 x:ADD#56h,A By .def x .ref y 匯編時(shí),匯編器把x和y都放在目標(biāo)文件的符號(hào)表中。當(dāng)這個(gè)文件與其它目標(biāo)文件鏈接時(shí),遇到x,就定義了其它文件不能識(shí)別的x, 同樣遇到符號(hào)y時(shí),鏈接器就檢查其他文件對(duì)
22、y的定義。總之鏈接器必須使所引用的符號(hào)與相應(yīng)的定義相匹配。 符號(hào)表 每當(dāng)遇到一個(gè)外部符號(hào),匯編器都將符號(hào)表中產(chǎn)生一個(gè)條目。匯編器還產(chǎn)生一個(gè)指到每段的專門符號(hào),鏈接器使用這些符號(hào)來(lái)對(duì)其他符號(hào)重新定位。4.4 源程序的匯編 匯編器的作用是將匯編語(yǔ)言源程序轉(zhuǎn)換成機(jī)器語(yǔ)言目標(biāo)文件。這些目標(biāo)文件都是公共目標(biāo)文件格式(COFF)。 匯編語(yǔ)言源程序文件包括匯編命令、匯編語(yǔ)言指令和宏指令。 匯編命令用來(lái)控制匯編的過程,包括列表格式、符號(hào)定義和將源代碼放入塊的方式等。 匯編器包括如下功能: 將匯編語(yǔ)言源程序匯編成一個(gè)可重新定 位的目標(biāo)文件; 根據(jù)需要,可以生成一個(gè)列表文件,并 對(duì)該列表進(jìn)行控制; 將程序代碼分成
23、若干個(gè)段,每個(gè)段的目 標(biāo)代碼都有一個(gè)SPC管理; 定義和引用全局符號(hào),如果需要可以在 列表文件后面附加一張交叉引用表; 對(duì)條件程序塊進(jìn)行匯編; 支持宏功能,允許定義宏命令; 為每個(gè)目標(biāo)代碼塊設(shè)置一個(gè)程序計(jì)數(shù)器 SPC。4.4.1 匯編程序的運(yùn)行 C54x的匯編程序名為asm500.exe。 要運(yùn)行匯編程序,可輸入如下命令: asm500 input file object file listing file -optionsinput file匯編源文件名,默認(rèn)擴(kuò)展名.asm。object file匯編程序生成的目標(biāo)文件。.objlisting file 匯編程序生成的列表文件。.lst-op
24、tions 匯編器使用的各種選項(xiàng),表.2 匯編時(shí)的列表文件 匯編器對(duì)源程序匯編時(shí),如果采用-l選項(xiàng),匯編后將產(chǎn)生一個(gè)列表文件。 列表文件中包括源程序語(yǔ)句和目標(biāo)代碼。 下面是一個(gè)列表文件的例子,用來(lái)說明它的各部分的內(nèi)容。1.global RESET,INT0,INT1,INT22.global TINT,RINT,XINT,USER3.global ISR0, ISR1, ISR24.global time, rcv, xmt, proc5 6 Initmac .macro7*initialize macro8 SSBX OVM9 LD #0, DP10 LD #7, ARP11
25、 LD #037h, A12 RSBX INTM13 .endm14 * 15 * 復(fù)位中斷向量復(fù)位中斷向量16 *17000000.sect “reset”18000000 F073 RESET: B init 000001 0008+19000002 F073 INT0: B ISR0 000003 0000!20000004 F073 INT2: B ISR1 000005 0000!21000006 F073 INT2: B ISR2 000007 0000!22 23*24000000 .sect “ints”25000000 F073 TINT B time 000001 0000
26、!26000002 F073 XINT B rcv 000003 0000!27000004 F073 XINT B xmt 000005 0000!28000006 F073 USER B proc 000007 0000!29 *30 * 初始化處理器初始化處理器31 *32 000008 init: initmac1 *initialize macro1000008F7B9SSBXOVM1000009EA00LD #0, DP100000aF4A7LD #7, ARP100000bE837LD #37H, A100000cF6BBRSBXINTM行行號(hào)號(hào)SPC目標(biāo)代碼源程序語(yǔ)句 如例所示
27、,列表文件可以分成4個(gè)部分。 Field1:源程序語(yǔ)句的行號(hào)碼,用十進(jìn)制數(shù)表示。 Field2:段程序計(jì)數(shù)器,用十六進(jìn)制表示。 Field3:目標(biāo)代碼,用十六進(jìn)制表示。 后面的記號(hào)表示在鏈接時(shí)需要重新定位。?。?未定義的外部引用 : .text段重新定位 ” : .data段重新定位 + : .sect段重新定位 - : .bss和.usect段重新定位 Field4:源程序語(yǔ)句。4.4.3 匯編偽指令 匯編偽指令用于為程序提供數(shù)據(jù)并指示匯編程序如何匯編源程序,是匯編語(yǔ)言程序的一個(gè)重要內(nèi)容。 匯編偽指令可完成以下工作: 將代碼和數(shù)據(jù)匯編進(jìn)指定的段; 為未初始化的變量在存儲(chǔ)器中保留空間; 控制清
28、單文件是否產(chǎn)生; 初始化存儲(chǔ)器; 匯編條件代碼塊; 定義全局變量; 為匯編器指定可以獲得宏的庫(kù); 考察符號(hào)調(diào)試的信息。 C54x匯編器共有64條匯編偽指令,根據(jù)他們的功能,可以將其分成8類: 對(duì)各種段進(jìn)行定義的命令,如.bss、.data等 對(duì)常數(shù)(數(shù)據(jù)和存儲(chǔ)器)進(jìn)行初始化的命令, 如.bes、byte、.field、float等 調(diào)整SPC(段寄存器),如.align 對(duì)輸出列表文件格式化的命令,如.drlist 引用其他文件的命令,如copy 控制條件匯編的命令,如.break 在匯編時(shí)定義符號(hào)的命令,如.asg 執(zhí)行其他功能的命令,如.algebraic 定義段的偽指令 定義段的偽指令用
29、于定義相應(yīng)的匯編語(yǔ)言程序段。表4.4.2列出了定義段的偽指令的助記符以及語(yǔ)法格式和注釋。 .text 此段存放程序代碼。 .data 此段存放初始化了的數(shù)據(jù)。 .bss 此段存入未初始化的變量。 .sect 名稱 定義一個(gè)有名段,放初始化了的數(shù)據(jù)或程序代碼。 例4.4.2以實(shí)例說明如何應(yīng)用定義段的偽指令。 該例是一個(gè)輸出清單文件,第一列為行號(hào),第二列位SPC的值,每段有它自己的SPC。當(dāng)代碼第一次放在段中時(shí),其SPC等于0。在其他的代碼段被匯編后,若繼續(xù)將代碼匯編進(jìn)該段,則它的SPC繼續(xù)計(jì)數(shù),就好像沒有受到干擾。 例4.4.2中偽指令執(zhí)行以下任務(wù): .text初始化值為1,2,3,4,5,6,
30、7,8的字; .data初始化值為9,10,11,12,13,14,15,16 var_defs初始化值為17,18字 .bss保留19個(gè)字的空間 .usect保留20個(gè)字的空間 .bss和.usect偽指令既不結(jié)束當(dāng)前的段也不開始新段,它們保留指定數(shù)量的空間,然后匯編器開始將代碼或數(shù)據(jù)匯編當(dāng)前的段。1234000000.text5000000 0001.word 1,2 000001 00026000002 0003.word 3,4 000003 00047891011000000.data12000000 0009.word 9,10 000001 000A13000002 000B.w
31、ord 11,12 000003 000C141516171819000000.sect “var_defs”20 000000 0011.word 17,18 000001 00122122232425000004.data26000004 000D.word 13,14 000005 000E27000000.bss sym, 1928000006 000F.word 15,16 000007 00102930313233 000004 .text34 000004 0005.word 5,6 000004 000635000000 usym.usect “xy”, 2036000006
32、0007 .word 000007 0008 初始化常數(shù)的偽指令 初始化常數(shù)的偽指令為當(dāng)前段的匯編常數(shù)值。表4.4.3列出了初始化常數(shù)的偽指令的助記符以及語(yǔ)法格式和注釋。 .byte value1,valuen初始化當(dāng)前段里的一個(gè)或多個(gè)連續(xù)字,每個(gè)值的寬度限制為8位。field value,size in bits 初始化一個(gè)可變長(zhǎng)度的域,將單個(gè)值放入當(dāng)前字的指定位域中。.word value1,valuen初始化一個(gè)或多個(gè)16位整數(shù),即把16位的值放到當(dāng)前段的連續(xù)字中。.long value1,valuen初始化一個(gè)或多個(gè)32位整數(shù),即把32位的值放到當(dāng)前段的2個(gè)連續(xù)字中。 例4.4.3 圖
33、4.4.1比較了.byte,.int,.long,.xlong,.float,.xloat,.word, .string指令。見p117 在這個(gè)例子中假定已經(jīng)匯編了以下的代碼: 1000000 00aa.byte0AAh, 0BBh 000000 00bb2000002 0ccc.word0CCCh3000003 0eee.xlong0EEEEFFFh000004 efff4000006 eeee.long0EEEEFFFFh000007 ffff5000008 0DDDDh6000009 3fff.xfloat1.999999 00000a ffac700000c 3fff.
34、float1.99999900000d ffac800000e 006800000f 0065000010 006c000011 0070 對(duì)準(zhǔn)段程序計(jì)數(shù)器的偽指令 對(duì)準(zhǔn)段程序計(jì)數(shù)器的偽指令包括:.align偽指令和.even偽指令。 表4.4.4列出了對(duì)準(zhǔn)段程序計(jì)數(shù)器的偽指令的助記符以及語(yǔ)法格式和注釋。 偽指令助記符及格式偽指令助記符及格式 描述描述.align.even用于將段程序計(jì)數(shù)器對(duì)準(zhǔn)在用于將段程序計(jì)數(shù)器對(duì)準(zhǔn)在1128字的邊界字的邊界用于使用于使SPC指到下一個(gè)字的邊界指到下一個(gè)字的邊界表4.4.4 對(duì)準(zhǔn)段程序計(jì)數(shù)器的偽指令 .align偽指令的操作必須是在20216之間且等于2的冪
35、。例如: 操作數(shù)為1時(shí),對(duì)準(zhǔn)SPC到字的邊界; 操作數(shù)為2時(shí),對(duì)準(zhǔn)SPC到長(zhǎng)字/偶字的邊界; 操作數(shù)為128時(shí),對(duì)準(zhǔn)SPC到頁(yè)面的邊界; 沒有操作數(shù)時(shí),.align偽指令默認(rèn)為頁(yè)面邊界。 .even偽指令等效于指定.align偽指令的操作數(shù)為1的情形。當(dāng).even操作數(shù)為2時(shí),將SPC對(duì)準(zhǔn)到下一個(gè)長(zhǎng)字的邊界。任何在當(dāng)前字中沒有使用的位都填充0. 圖4.4.2說明了.align偽指令的使用情況。 假定匯編了以下的代碼: 1000000 4000.field 2,32000000 4160.field 11,83 .align 24000002 0045 .string “Errorcnt”000
36、003 0072000004 0072000005 006f000006 0072 000007 0063000008 006e000009 00745.align5000080 0004.byte 4 格式化輸出清單文件的偽指令 格式化輸出清單文件的偽指令用于格式化輸出清單文件,如表4.4.5 引用其他文件的偽指令 引用其他文件的偽指令為引用其他文件提供信息。如表4.4.6: 條件匯編偽指令 條件匯編偽指令用來(lái)通知匯編器按照表達(dá)式計(jì)算出的結(jié)果的真假,決定是否對(duì)某段代碼進(jìn)行匯編。有兩組偽指令用于條件代碼塊的匯編: .if/.elseif/.else/.endif偽指令用于通知匯編器按照表達(dá)式的
37、計(jì)算結(jié)果,對(duì)某段代碼塊進(jìn)行條件匯編。 .loop/.break/.endloop偽指令用于通知匯編器按照表達(dá)式的計(jì)算結(jié)果重復(fù)匯編一個(gè)代碼塊。 條件匯編偽指令的助記符及語(yǔ)法格式見表4.4.7: 定義宏的偽指令 常用的定義宏的偽指令如表4.4.8: 匯編時(shí)間符號(hào)偽指令 匯編時(shí)間符號(hào)偽指令用于使符號(hào)名與常數(shù)值或字符串等價(jià)起來(lái)。 匯編時(shí)間符號(hào)偽指令如表4.4.9: .struct/.endstruct偽指令允許將信息組織到結(jié)構(gòu)體中,以便將同類的元素分在一組。然后由匯編器完成結(jié)構(gòu)體成員偏離地址的計(jì)算。 .struct/.endstruct偽指令不分配存儲(chǔ)器,只是簡(jiǎn)單地產(chǎn)生一個(gè)可重復(fù)使用的符號(hào)模板。 .t
38、ag將結(jié)構(gòu)體與一個(gè)標(biāo)號(hào)聯(lián)系起來(lái),.tag偽指令不分配存儲(chǔ)器,且結(jié)構(gòu)體的標(biāo)記符必須使用之前先定義好。 例 .struct/.endstruct偽指令舉例 1 REAL_REC .struct; 結(jié)構(gòu)體標(biāo)記 20000 NOM .int; member1=0 3 0001 DEN .int; member2=1 4 0002 REAL_LEN .endstruct;real_len=2 5 6 000000 0001- ADD 7 ;訪問結(jié)構(gòu)體成員 8 9 000000.bss REAL,REAL _LEN REAL+REAL_REC.DEN,A .union/.endunion偽指令通過創(chuàng)建符號(hào)
39、模板,提供在相同的存儲(chǔ)區(qū)域內(nèi)管理多種不同的數(shù)據(jù)類型方法。.union不分配任何存儲(chǔ)器,它允許類型和大小不同的定義臨時(shí)存儲(chǔ)在相同存儲(chǔ)器空間。 例 .union/.endunion偽指令舉例 1.global employid 2 xample .union ;union標(biāo)記 3 0000 ival .word ;menber1=int 4 0000 fval .float ;menber2=float 5 0000 sval .string ;menber3=string 6 0002 real_len .endunion ; real_len=2 7 8 000000 .bss emplyid
40、,real_len ;指定空間 9 10 employid .tag xample ;聲明結(jié)構(gòu)實(shí)例 11 000000 0000- ADD emplyid.fval,A ;訪問union成員 混合偽指令 書中表4.4.10列出了常用的混合偽指令: .newblock偽指令用于復(fù)位局部標(biāo)號(hào)。局部標(biāo)號(hào)是形式為$n或name?的符號(hào)。當(dāng)它們出現(xiàn)在標(biāo)號(hào)域時(shí)被定義。局部標(biāo)號(hào)可用作跳轉(zhuǎn)指令的操作數(shù)。.newblock偽指令通過在它們被使用后將它們復(fù)位的方式來(lái)限制局部標(biāo)號(hào)的使用范圍。4.4.4 宏定義和宏調(diào)用 C54x匯編器支持宏指令語(yǔ)言。 利用宏指令,可以使源程序變得簡(jiǎn)短。 宏的使用以下3個(gè)步驟。 定義宏
41、。有兩種方法定義宏: 可在源文件的開始定義宏,或者在.include/.copy的文件中定義。 在宏庫(kù)中定義。 調(diào)用宏。 擴(kuò)展宏。 宏指令與子程序一樣,都是重復(fù)執(zhí)行某一段程序,但兩者是有區(qū)別的,有以下兩點(diǎn): 宏指令和子程序都可以被多次調(diào)用,但是把子程序匯編成目標(biāo)代碼的過程只進(jìn)行一次,而在用到宏指令的每個(gè)地方都要對(duì)宏指令中的語(yǔ)句逐條地進(jìn)行匯編。 在調(diào)用之前,由于子程序不使用參數(shù),故子程序所需要的寄存器等都必須事先設(shè)置好,而對(duì)于宏指令來(lái)說,由于可以使用參數(shù),調(diào)用時(shí)只要直接代入?yún)?shù)就行了。 宏定義格式如下: macname .macroparameter 1,parameter n model st
42、atements or macro directives .mexit .endm 宏調(diào)用格式如下: label: macname parameter 1,parameter n 例4.4.7 宏定義、宏調(diào)用和宏展開舉例 1 * 2 3 * add3 4 * 5 *ADDRP=P1+P2+P3 6 7 add3.macroP1,P2,P3,ADDRP 8 9 LD P1,A 10 ADD P2,A 11ADD P3,A 12 STL A,ADDRP 13.endm 14 15 16.global abc,def,ghi,adr 17 000000 add3 abc,def,ghi,adr1 0
43、00000 1000! LD abc,A1 000001 0000! ADD def,A1 000002 0000! ADD ghi,A1 000004 8000! STL A,adr4.5 鏈接器的使用 鏈接器的主要任務(wù)是:根據(jù)鏈接命令文件,將一個(gè)或多個(gè)COFF目標(biāo)文件鏈接起來(lái),生成存儲(chǔ)器映像文件和可執(zhí)行的輸出文件,如下圖: LNK500鏈接命令或鏈接命令或鏈接命令文件鏈接命令文件(.cmd文件文件)存儲(chǔ)器存儲(chǔ)器映像文件映像文件(.map文件)文件)一個(gè)或一個(gè)或多個(gè)目標(biāo)文件多個(gè)目標(biāo)文件(.out文件)文件)可執(zhí)行可執(zhí)行輸出文件輸出文件(.out文件)文件) 在鏈接過程中,鏈接器將各個(gè)目標(biāo)文件
44、合并起來(lái),并完成以下工作: 將各個(gè)段配置到目標(biāo)系統(tǒng)的存儲(chǔ)器。 對(duì)各個(gè)符號(hào)和段進(jìn)行重新定位,并給它們指定一個(gè)最終的地址。 解決輸入文件之間未定義的外部引用。4.5.1 鏈接器的運(yùn)行 運(yùn)行鏈接程序 C54x的鏈接器名為lnk500.exe。 運(yùn)行鏈接器有三種命令: lnk500 lnk500 file1.obj file2.obj -o link.out lnk500 linker.cmd說明:使用第一種命令時(shí),鏈接器會(huì)提示有關(guān)信息。使用第二種命令時(shí),鏈接器是以file1.obj 和file2.obj 為目標(biāo)文件進(jìn)行鏈接,生成一個(gè)名為link.out的可執(zhí)行輸出文件。使用第三種命令時(shí),需將鏈接的目
45、標(biāo)文件、連接選項(xiàng)以及存儲(chǔ)器配置要求等編寫到鏈接命令文件linker.cmd中。 以第二種命令為例,鏈接命令文件 linker.cmd應(yīng)包含如下內(nèi)容。 file1.obj file2.obj -o link.out 鏈接器選項(xiàng) 表4.5.1列出了常用C54x鏈接器選項(xiàng)。在鏈接時(shí),一般通過鏈接器選項(xiàng)(如-o)控制連接器操作。4.5.2 鏈接器命令文件的編寫與使用 鏈接命令文件是將鏈接的信息放在一個(gè)文件中,這在多次使用同樣的鏈接信息時(shí),可以方便調(diào)用。 在命令文件中可使用兩個(gè)十分有用的偽指令MEMORY和SECTIONS,用來(lái)指定實(shí)際應(yīng)用中的存儲(chǔ)器結(jié)構(gòu)和地址的映射。 在命令行中不能使用這兩個(gè)偽指令,命
46、令文件都是ASC文件,可包含以下內(nèi)容: 輸入文件名,用來(lái)指定目標(biāo)文件、存檔庫(kù)或其他命令文件。 鏈接器選項(xiàng),它們?cè)诿钗募械氖褂梅椒ㄅc在命令行中相同。 MEMORY和SECTIONS鏈接偽指令, MEMORY用來(lái)指定目標(biāo)存儲(chǔ)器結(jié)構(gòu),SECTIONS用來(lái)控制段的構(gòu)成與地址分配。 賦值說明,用于給全局符號(hào)定義和賦值。 對(duì)于如下鏈接器命令: lnk500 a.obj b.obj -m prog.map -o prog.out 可以將上述命令行中的內(nèi)容寫成一個(gè)鏈接器命令文件link.cmd,內(nèi)容如下: a.obj/*第一個(gè)輸入文件名*/ b.obj /*第二個(gè)輸入文件名*/ -m prog.map /
47、*指定map文件的選項(xiàng)*/ -o prog.out /*指定輸出文件的選項(xiàng)*/ 執(zhí)行鏈接器命令: lnk500link.cmd 就可以將兩個(gè)目標(biāo)文件a.obj和b.obj鏈接起來(lái),并生成一個(gè)映像文件prog.map和一個(gè)可執(zhí)行的輸出文件prog.out,其效果與前面帶-m和帶-o選項(xiàng)的鏈接器命令完全一樣。 例 鏈接器命令文件舉例 a.obj b.obj /*輸入文件名*/ -o prog.out /*指定輸出文件的選項(xiàng)*/ -m prog.map /*指定map文件的選項(xiàng)*/ MEMORY /*MEMORY 偽指令*/ PAGE 0: ROM: orgin=1000h, length=0100
48、h PAGE 1: RAM: orgin=0100h, length=0100h SECTIONS /*SECTIONS偽指令*/ .text : ROM .data : ROM .bss : RAM 鏈接器命令文件都是ASC碼文件,由上例可見,主要包含如下內(nèi)容: 輸入文件名,就是要鏈接的目標(biāo)文件和文檔庫(kù)文件,或者是其他的命令文件。 鏈接器選項(xiàng),這些選項(xiàng)既可以用在鏈接命令行,也可以編在命令文件中。 MEMORY和SECTIONS都是鏈接器命令,MEMORY命令定義目標(biāo)存儲(chǔ)器的配置,SECTIONS命令規(guī)定各個(gè)段放在存儲(chǔ)器的什么位置。 4.5.3 目標(biāo)庫(kù) 目標(biāo)庫(kù)是包含完全目標(biāo)文件作為成員的存檔文
49、件。 通常將一組有關(guān)的模塊組合在一起形成一個(gè)庫(kù)。使用目標(biāo)庫(kù)可減少鏈接的時(shí)間和可執(zhí)行模塊的長(zhǎng)度。 指定庫(kù)的次序是很重要的,因?yàn)殒溄悠髟谒阉鲙?kù)時(shí)僅僅包括那些具有可用來(lái)分辨沒有定義的符號(hào)的成員。 下面是鏈接幾個(gè)文件和庫(kù)的例子,假設(shè): 輸入文件f1.obj和f2.obj均引用了一個(gè)名為clrscr的外部函數(shù); 輸入文件f1.obj引用了符號(hào)origin; 輸入文件f2.obj引用了符號(hào)fillclr; 庫(kù)libc.libc的成員Member0包含orign的定義; 庫(kù)libc.liba的成員Member3包含fillclr的定義; 兩個(gè)庫(kù)成員Member3包含fillclr定義; 若輸入命令: lnk
50、500 f1.obj liba.lib f2.obj libc.lib 則引用分辨如下: 庫(kù)libc.liba的成員Member1滿足對(duì)clrscr引用,因?yàn)閒2.obj引用它之前,庫(kù)被搜索并定義了clrscr。 庫(kù)libc.libc的成員Member0滿足對(duì)origin的引用。 庫(kù)libc.liba的成員Member3滿足對(duì)fillclr的引用。 但如果輸入命令: lnk500 f1.obj f2.obj libc.lib liba.lib 則所有對(duì)clrscr的引用都由庫(kù)libc.libc的成員Member1滿足。4.5.4 MEMORY命令 鏈接器應(yīng)當(dāng)確定輸出各段放在存儲(chǔ)器的什么位置。要
51、達(dá)到這個(gè)目的,首先應(yīng)當(dāng)有一個(gè)目標(biāo)存儲(chǔ)器的模型。 MEMORY命令就是用來(lái)規(guī)定目標(biāo)存儲(chǔ)器的模型。通過這條命令,可以定義系統(tǒng)中所包含的各種形式的存儲(chǔ)器,以及它們占據(jù)的地址范圍。 例4.5.2 使用MEMORY偽指令的鏈接器命令文件的例子 file1.obj file2.obj -o Prog.out MEMORY PAGE 0: ROM:origin=C00h, length=1000h PAGE 1: SCRATCH: origin=60h, length=20h ONCHIP: origin=80h, length=200h 例4.5.2中MEMORY命令所定義的系統(tǒng),其存儲(chǔ)器配置如下: 程序
52、存儲(chǔ)器:4K ROM,起始地址C00h,取名為ROM。 數(shù)據(jù)存儲(chǔ)器:32字 RAM,起始地址60h,取名為SCRATCH。 512字 RAM,起始地址80h,取名為ONCHIP. MEMORY命令一般句法如下: MEMORY PAGE 0: name 1(attr): origin=constant, length=constant; PAGE n: name n(attr): oringin=constant, length=constant; PAGE代表一個(gè)完全獨(dú)立的存儲(chǔ)空間,頁(yè)號(hào)n最多為255。通常PAGE 0定為程序存儲(chǔ)器, PAGE 1定為數(shù)據(jù)存儲(chǔ)器。如果沒規(guī)定,默認(rèn)為PAGE 0
53、。name對(duì)存儲(chǔ)區(qū)間取名。attr這是任選項(xiàng),為命名區(qū)規(guī)定14個(gè)屬性: R可對(duì)存儲(chǔ)器執(zhí)行讀操作; W可對(duì)存儲(chǔ)器執(zhí)行寫操作; X存儲(chǔ)器可以裝入可執(zhí)行的程序代碼; I可對(duì)存儲(chǔ)器進(jìn)行初始化。如果一項(xiàng)屬性都沒選,則存儲(chǔ)器具有全部4項(xiàng)屬性。Origin規(guī)定存儲(chǔ)區(qū)的起始地址。Length指定存儲(chǔ)空間的長(zhǎng)度。4.5.5 SECTIONS命令 SECTIONS命令的任務(wù)如下: 說明如何將輸入段組合成輸出段。 在可執(zhí)行程序中定義輸出段。 規(guī)定輸出段在存儲(chǔ)器中的存放位置。 允許重新命名輸出段。 SECTIONS命令一般句法如下: SECTIONS name:property, property, property
54、, name:property, property, property, name:property, property, property, 在連接命令文件中, SECTIONS命令用大寫字母,緊隨其后并用大括號(hào)括起來(lái)的是關(guān)于輸出段的詳細(xì)說明。每一個(gè)輸出段的說明都從段名開始,段名后面是一行說明段的內(nèi)容和如何給段分配存儲(chǔ)單元的性能參數(shù)。一個(gè)段可能的性能參數(shù)有:Load allocation,由它定義將輸出段加載到存儲(chǔ)器中的什么位置。 句法:load=allocation 或 allocation 或 allocation具體寫法有多種形式,例如.text: load=0 x1000.text:
55、 load ROM.text: PAGE0.bss: load (RW) run allocation,由它定義輸出段在存儲(chǔ)器的什么位置上開始運(yùn)行。 句法: run =allocation 或 run allocation 鏈接器為每個(gè)輸出段在目標(biāo)存儲(chǔ)器中分配兩個(gè)地址:一個(gè)是加載的地址,另一個(gè)是執(zhí)行程序的地址。 通常,這兩個(gè)地址是相同的,可以認(rèn)為每個(gè)輸出段只有一個(gè)地址。 有時(shí)要把程序的加載區(qū)分開,只要用SECTIONS命令讓鏈接器對(duì)這個(gè)段定位兩次就行了。一次是設(shè)置加載地址,另一次是設(shè)置運(yùn)行地址。 例如: .fir:load=ROM,run=RAMInput_sections,用它定義有哪些輸入
56、段組成輸出段。 句法: Input_sections 多數(shù)情況下,在SECTIONS命令中不列出每個(gè)輸入文件的輸入段的段名,即 SECTIONS .text: .data: .bss 這樣,在鏈接時(shí),鏈接器就將所有輸入文件的.text段鏈接成.text輸出段(其他段也一樣) 當(dāng)然,也可以明確地用文件名和段名來(lái)規(guī)定輸入段,即 SECTIONS .text: /*創(chuàng)建.text輸出段*/ f1.obj(.text) /*鏈接來(lái)自f1.obj文件中的.text段*/ f2.obj(sec1) /*鏈接來(lái)自f2.obj文件中的sec1段*/ f3.obj /*鏈接來(lái)自f3.obj文件中的所有段*/ f4.obj(.text,sec2) /*鏈接來(lái)自f4.obj文件中的.text 和sec2段*/ 4.5.6 多個(gè)文件的鏈接實(shí)例.title“example.asm”.mmregsstack.usect“STACK”, 10h.bssa,4.bssx,4.bssy,1.defstart.datatable:.word1,2,3.4.word8,6,4,2.textstart
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 代步租車活動(dòng)方案
- 代表接待活動(dòng)方案
- 以舊換新活動(dòng)方案
- 北京市密云區(qū)2023-2024學(xué)年五年級(jí)下學(xué)期數(shù)學(xué)期末檢測(cè)卷(含答案)
- 仲裁三送一檢活動(dòng)方案
- QBT-制鹽工業(yè)檢測(cè)方法 硒的測(cè)定編制說明
- 企業(yè)修舊利廢活動(dòng)方案
- 企業(yè)公司年禮活動(dòng)方案
- 企業(yè)創(chuàng)優(yōu)奪牌活動(dòng)方案
- 企業(yè)雙愛雙評(píng)活動(dòng)方案
- 淮安監(jiān)理員試題及答案
- 機(jī)電工程2025年技術(shù)經(jīng)濟(jì)學(xué)試題及答案
- 2025年糧食倉(cāng)儲(chǔ)行業(yè)調(diào)研分析報(bào)告
- 2025年“巴渝工匠”杯職業(yè)技能競(jìng)賽(調(diào)飲師賽項(xiàng))備賽試題庫(kù)(含答案)
- 2025遼寧沈陽(yáng)副食集團(tuán)所屬企業(yè)招聘25人筆試參考題庫(kù)附帶答案詳解
- 2024-2025新入員工安全培訓(xùn)考試試題及參考答案(達(dá)標(biāo)題)
- 2025春國(guó)開《創(chuàng)業(yè)基礎(chǔ)》形考任務(wù)1-4答案
- 2025陜西中考:歷史必背知識(shí)點(diǎn)
- 《人工智能應(yīng)用基礎(chǔ)》 完整課件(共十個(gè)模塊-上)
- 國(guó)企財(cái)務(wù)測(cè)試題及答案
- 國(guó)家開放大學(xué)2025年《創(chuàng)業(yè)基礎(chǔ)》形考任務(wù)1答案
評(píng)論
0/150
提交評(píng)論