版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第5章 TMS320C54x軟件開(kāi)發(fā),5.1 軟件開(kāi)發(fā)過(guò)程及開(kāi)發(fā)工具 5.2 公共目標(biāo)文件格式 5.3 常用匯編偽指令 5.4 鏈接器命令文件的編寫(xiě)與使用 5.5 匯編語(yǔ)言程序編寫(xiě)方法 5.6 TMS320C54x C語(yǔ)言編程 5.7 用C語(yǔ)言和匯編語(yǔ)言混合編程,5.1 軟件開(kāi)發(fā)過(guò)程及開(kāi)發(fā)工具,1建立源程序:用C語(yǔ)言或匯編語(yǔ)言寫(xiě)源程序。 2用C編譯器(Compiler)將C語(yǔ)言程序編譯為匯編語(yǔ)言程序。 3用匯編器(Assembler)將匯編語(yǔ)言程序匯編成機(jī)器語(yǔ)言的目標(biāo)程序。 4用連接器(Linker)將目標(biāo)文件連接在一起,產(chǎn)生可執(zhí)行模塊。 5用調(diào)試工具對(duì)程序進(jìn)行反復(fù)運(yùn)行、測(cè)試和修改,以達(dá)到要求
2、。 6用十六進(jìn)制轉(zhuǎn)換公用程序(Hex Conversion Utility)將可執(zhí)行目標(biāo)程序轉(zhuǎn)換成可燒寫(xiě)到EPROM的文件格式,返回首頁(yè),圖5-1 TMS320C54x DSP軟件開(kāi)發(fā)流程,歸檔器將匯編宏文件收入?yún)R編宏庫(kù),歸檔器將目標(biāo)文件收入目標(biāo)文件庫(kù),C編譯器將C程序編譯為匯編語(yǔ)言程序,匯編器將匯編語(yǔ)言程序匯編為COFF格式目標(biāo)程序,建庫(kù)程序構(gòu)建運(yùn)行時(shí)支持庫(kù),匯編語(yǔ)言轉(zhuǎn)換程序?qū)⒋鷶?shù)形式程序轉(zhuǎn)換成匯編語(yǔ)言程序,連接器將COFF目標(biāo)文件、目標(biāo)文件庫(kù)、運(yùn)行時(shí)支持庫(kù)連接成可執(zhí)行COFF文件,HEX轉(zhuǎn)換器將可執(zhí)行COFF文件轉(zhuǎn)換成便于燒寫(xiě)EPROM的HEX或BIN格式文件,EPROM燒寫(xiě)器將程序?qū)懭隕
3、PROM,上電時(shí)自動(dòng)導(dǎo)入C54X運(yùn)行,調(diào)試工具將C可執(zhí)行COFF文件通過(guò)硬件仿真器下載到C54X中運(yùn)行,或者下載到軟件仿真器中運(yùn)行,絕對(duì)列表器將可執(zhí)行COFF文件轉(zhuǎn)換成列表文件,給出機(jī)器碼、助記符、絕對(duì)地址等信息,交叉引用列表器列出符號(hào)、符號(hào)的定義,以及引用情況,供排錯(cuò)使用,表5-1 TMS320C54xV3.50版代碼生成工具程序,返回本節(jié),5.2 公共目標(biāo)文件格式,5.2.1 COFF文件的基本單元段 5.2.2 匯編器對(duì)段的處理 5.2.3 鏈接器對(duì)段的處理 5.2.4 重新定位 5.2.5 程序裝入 5.2.6 COFF文件中的符號(hào),返回首頁(yè),5.2.1 COFF文件的基本單元段,匯編
4、器和連接器建立的目標(biāo)文件稱為公共目標(biāo)格式文件,即COFF(Common Object File Format)。COFF使模塊化編程和管理變得方便和容易,因?yàn)橛脜R編語(yǔ)言編寫(xiě)程序時(shí),是按段來(lái)考慮的,所以不同模塊中的相同的段很容易匯編在一起。 段(sections)是COFF文件中最重要的概念。一個(gè)段就是最終在存儲(chǔ)器映象中占據(jù)連續(xù)空間的一個(gè)數(shù)據(jù)或代碼塊。目標(biāo)文件中的每一個(gè)段都是相互獨(dú)立的。一般地,COFF目標(biāo)文件包含3個(gè)缺省的段:text段、data段、bss段,圖5-2 目標(biāo)文件中的段與目標(biāo)存儲(chǔ)器的關(guān)系,返回本節(jié),如圖5-2所示為目標(biāo)文件中的段與目標(biāo)系統(tǒng)中存儲(chǔ)器的關(guān)系,5.2.2 匯編器對(duì)段的處
5、理,1未初始化段 未初始化段主要用來(lái)在存儲(chǔ)器中保留空間,通常將它們定位到RAM中。這些段在目標(biāo)文件中沒(méi)有實(shí)際內(nèi)容,只是保留空間而已。程序可以在運(yùn)行時(shí)利用這些空間建立和存儲(chǔ)變量,段可以分為兩大類:已初始化段和未初始化段,未初始化段是通過(guò)使用.bss和.usect匯編偽指令建立的,兩條偽指令的句法分別為: .bss 符號(hào),字?jǐn)?shù) 符號(hào).usect “段名”,字?jǐn)?shù),bssx,5,x,y . usect “myvar”,6,y,符號(hào)指向保留的存儲(chǔ)單元的第一個(gè)字,2已初始化段 已初始化段包含可執(zhí)行代碼或已初始化數(shù)據(jù)。這些段的內(nèi)容存儲(chǔ)在目標(biāo)文件中,加載程序時(shí)再放到TMS320C54X存儲(chǔ)器中。三個(gè)用于建立初
6、始化段的偽指令句法分別為: .text段起點(diǎn) .data段起點(diǎn) .sect“段名”,段起點(diǎn),匯編器在對(duì)程序進(jìn)行匯編時(shí),為程序中的每一個(gè)段安排了一個(gè)段程序計(jì)數(shù)器SPC。如:text段、data段、sect段、bss段、usect段分別有自己的段程序計(jì)數(shù)器,段起點(diǎn)用來(lái)為段計(jì)數(shù)器定義一個(gè)起始值。如: .text 10;SPC=10,3命名段 命名段就是程序員自己定義的段,它與缺省的.text、.data和.bss段一樣使用,但與缺省段分開(kāi)匯編。 例如:重復(fù)使用.text命令在目標(biāo)文件中只建立一個(gè).text段,鏈接后這個(gè).text段作為一個(gè)單位分配到存儲(chǔ)器中。如果想將一部分程序放到與.text段不同的
7、存儲(chǔ)器中,可以使用命名段,將命名段放到與.text段不同的存儲(chǔ)器中。 使用命名段可以將已初始化數(shù)據(jù)放到與.data段不同的存儲(chǔ)器中,將未初始化的變量匯編到與bss段不同的存儲(chǔ)器中,產(chǎn)生命名段的偽指令為: 符號(hào).usect“段名”,字?jǐn)?shù) .sect “段名”,段起點(diǎn),4子段 子段(Subsections)是大段中的小段。鏈接器可以像處理段一樣處理子段。采用子段可以使存儲(chǔ)器圖更加緊密。子段的命名句法為: 基段名:子段名 例:.sect “.text: _func” ;在text段內(nèi)建立一個(gè)稱之為 ; _func的子段。 子段也有兩種,用.sect命令建立的是已初始化段,用.usect命令建立的是未
8、初始化段,5段程序計(jì)數(shù)器(SPC) 匯編器為每個(gè)段安排一個(gè)獨(dú)立的程序計(jì)數(shù)器,即段程序計(jì)數(shù)器(SPC)。SPC表示一個(gè)程序代碼段或數(shù)據(jù)段內(nèi)的當(dāng)前地址。 開(kāi)始時(shí),匯編器將每個(gè)SPC置0,當(dāng)匯編器將程序代碼或數(shù)據(jù)加到一個(gè)段內(nèi)時(shí),相應(yīng)的SPC增加。 如果匯編器再次遇到相同段名的段,繼續(xù)匯編至相應(yīng)的段,且相應(yīng)的SPC在先前的基礎(chǔ)上繼續(xù)增加,例5-1 段命令應(yīng)用舉例: 2 * * * * * * * * * * * * * * * * * * * * * * * * * * 3 * Assemble an initialized table into .data * 4 * * * * * * * * *
9、 * * * * * * * * * * * * * * * * * 5 0000 .data 6 0000 0011 coeff .word 011h,022h,033h 0001 0022 0002 0033 7 * * * * * * * * * * * * * * * * * * * * * * * * * * 8 * * Reserve space in .bss for a variable * * 9 * * * * * * * * * * * * * * * * * * * * * * * * * * 10 0000 .bss buffer,10 11 * * * * * *
10、* * * * * * * * * * * * * * * * * * * * 12 * * still in .data * * 13 * * * * * * * * * * * * * * * * * * * * * * * * * * 14 0003 0123 ptr .word 0123h,行號(hào),段計(jì)數(shù)器,機(jī)器碼,匯編指令,15 * * * * * * * * * * * * * * * * * * * * * * * * * * 16 * * Assemble code into the .text section * * 17 * * * * * * * * * * * * * *
11、 * * * * * * * * * * * * 18 0000 .text 19 0000 100f add: LD 0Fh,A 20 0001 f010 aloop: SUB #1,A 0002 0001 21 0003 f842 BC aloop,AGEQ 0004 0001 22 * * * * * * * * * * * * * * * * * * * * * * * * * * 23 * * Another initialized table into .data * * 24 * * * * * * * * * * * * * * * * * * * * * * * * * *
12、25 0004 .data 26 0004 00aa ivals .word 0Aah,0BBh,0CCh 0005 00bb 0006 00cc,27 * * * * * * * * * * * * * * * * * * * * * * * * * * * * Define another section for more variables * * * * * * * * * * * * * * * * * * * * * * * * * * * * 30 0000 var2 .usect “newvars”,1 31 0001 inbuf .usect “newvars”,7 32 *
13、 * * * * * * * * * * * * * * * * * * * * * * * * * 33 * * Assemble more code into .text * * 34 * * * * * * * * * * * * * * * * * * * * * * * * * * 35 0005 .text 0005 110a mpy: LD 0Ah,B 0006 f166 mloop: MPY #0Ah,B 0007 000a 0008 f868 BC mloop,BNOV 0009 0006 * * * * * * * * * * * * * * * * * * * * * *
14、 * * * * * * Define a named section for int. vectors * * * * * * * * * * * * * * * * * * * * * * * * * * * * 0000 .sect “vectors” 0000 0011 .word 011h,033h 0001 0033,圖5-3 例5-1產(chǎn)生的目標(biāo)代碼,返回本節(jié),在此例中,一共建立了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ǔ)器中為變量保 留10個(gè)存
15、儲(chǔ)單元。 newvars是一個(gè)用.usect命令 建立的自定義段,它 在存儲(chǔ)器中為變量保 留8個(gè)存儲(chǔ)單元,5.2.3 鏈接器對(duì)段的處理,鏈接器對(duì)段的處理有兩個(gè)功能。 首先,它將匯編器產(chǎn)生的COFF目標(biāo)文件(.obj文件)中的各種段作為輸入段,當(dāng)有多個(gè)文件進(jìn)行鏈接時(shí),它將輸入段組合起來(lái),在可執(zhí)行的COFF輸出模塊中建立各個(gè)輸出段。 其次,鏈接器為輸出段選擇存儲(chǔ)器地址,鏈接器有兩個(gè)命令完成上述功能,即: MEMORY 命令定義目標(biāo)系統(tǒng)的存儲(chǔ)器配置圖,包括對(duì)存儲(chǔ)器各部分的命名,以及規(guī)定它們的起始地址和長(zhǎng)度。 SECTIONS命令告訴鏈接器如何將輸入段組合成輸出段,以及在存儲(chǔ)器何處存放輸出段。子段可以
16、用來(lái)更精確地編排段,可用鏈接器SECTIONS命令指定子段,圖5-4 鏈接器默認(rèn)的存儲(chǔ)器分配,返回本節(jié),5.2.4 重新定位,1鏈接時(shí)重新定位 匯編器將每個(gè)段的起始地址處理為0,而所有需要重新定位的符號(hào)(標(biāo)號(hào))在段內(nèi)都是相對(duì)于0地址的,但在存儲(chǔ)器中不可能所有的段都從0地址開(kāi)始,所以需要通過(guò)以下方法將段重新定位: 將各個(gè)段定位到存儲(chǔ)器中,每個(gè)段都從合適的地址開(kāi)始。 將符號(hào)值調(diào)整到相對(duì)于新的段地址的數(shù)值。 調(diào)整對(duì)重新定位后符號(hào)的引用,例5-2 產(chǎn)生重定位入口的一段程序(列表文件)代碼。 1 .ref X ;在別的文件中定義,在此引用 2 .ref Z ; 在別的文件中定義,在此引用 3 0000
17、.text 4 0000 F073 B Y ;生成一個(gè)重定位入口 0001 0006 5 0002 F073 B Z ; 生成一個(gè)重定位入口 0003 0000! 6 0004 F020 LD #X,A ;生成一個(gè)重定位入口 0005 0000! 7 0006 F7E0 Y: RESET,未定義的外部引用 .text段重定位 ” .data段重定位,.sect段重定位 - .bss段和.usect段重定位,假設(shè)鏈接時(shí)X重新定位在地址7100h,.text段重新定位到從地址7200h開(kāi)始,那么Y的重定位值為7206h。鏈接器利用兩個(gè)重定位入口,對(duì)目標(biāo)文件中的兩次引用進(jìn)行修正: f073 B Y
18、變成 f073 0006 7206 f020 LD #X,A 變成 f020 0000! 7100 在COFF目標(biāo)文件中有一張重定位入口表。鏈接器對(duì)符號(hào)重定位時(shí),利用這些入口修正對(duì)符號(hào)的引用。鏈接器在處理完之后就將重定位入口消去,以防止在重新鏈接或加載時(shí)再次重新定位,2運(yùn)行時(shí)重新定位 將代碼裝入存儲(chǔ)器的一個(gè)地方,而運(yùn)行在另一個(gè)地方。利用SECTIONS命令選項(xiàng)讓鏈接器定位兩次。一些關(guān)鍵的執(zhí)行代碼必須裝入在系統(tǒng)的ROM中,但希望在較快的RAM中運(yùn)行。 鏈接器提供了一個(gè)簡(jiǎn)單的處理該問(wèn)題的方法。利用SECTIONS命令選項(xiàng)讓鏈接器定位兩次。第一次使用裝入關(guān)鍵字設(shè)置裝入地址,再用運(yùn)行關(guān)鍵字設(shè)置運(yùn)行地址
19、,返回本節(jié),5.2.5 程序裝入,為了運(yùn)行程序,要將可執(zhí)行程序裝入目標(biāo)存儲(chǔ)器。方法: (1)硬件仿真器和CCS集成開(kāi)發(fā)環(huán)境,具有內(nèi)部的裝入器,調(diào)用裝入器的LOAD命令即可裝入可執(zhí)行程序。 (2)將代碼固化在片外存儲(chǔ)器中,采用Hex轉(zhuǎn)換工具(Hex conversion utility),例如Hex500將可執(zhí)行的COFF目標(biāo)模塊(.out文件)轉(zhuǎn)換成幾種其他目標(biāo)格式文件,然后將轉(zhuǎn)換后的文件用編程器將代碼寫(xiě)入EPROM/Flash,返回本節(jié),5.2.6 COFF文件中的符號(hào),COFF文件中有一個(gè)符號(hào)表,用于存儲(chǔ)程序中的符號(hào)信息。鏈接器對(duì)符號(hào)重定位時(shí)使用該表,調(diào)試工具也使用該表來(lái)提供符號(hào)調(diào)試。 外
20、部符號(hào)指在一個(gè)模塊中定義,在另一個(gè)模塊中使用的符號(hào)??墒褂?def、.ref或.global匯編偽指令將符號(hào)定義為外部符號(hào)。.def在當(dāng)前模塊中定義,可以在別的模塊中使用的符號(hào);.ref在當(dāng)前模塊中引用,但在別的模塊中定義的符號(hào);.global可用于以上任何一種情況,x: ADD #56h,A ;定義x B y ;引用y .def x ;x在此模塊中定義, ;可被別的模塊引用 .ref y ;y在這里引用, ;它在別的模塊中定義,返回本節(jié),5.3 常用匯編偽指令,返回首頁(yè),1段定義偽指令 為便于鏈接器將程序、數(shù)據(jù)分段定位于指定的(物理存在的)存儲(chǔ)器空間,并將不同的obj文件鏈接起來(lái),設(shè)計(jì)中常將
21、程序、數(shù)據(jù)、變量分段定義。段的使用非常靈活,但常用以下約定: .text 此段存放程序代碼。 .data 此段存放初始化了的數(shù)據(jù)。 .bss 此段存入未初始化的變量。 .sect 名稱 定義一個(gè)有名稱段,放初始化了的數(shù)據(jù)或程序代碼。 符號(hào) .usect 名稱,字?jǐn)?shù) 定義一個(gè)有名稱段,放未初始化的數(shù)據(jù),2條件匯編偽指令 .if、.elseif、.else、.endif偽指令告訴匯編器按照表達(dá)式的計(jì)算結(jié)果對(duì)代碼塊進(jìn)行條件匯編。 .if expression 標(biāo)志條件塊的開(kāi)始,僅當(dāng)條件為真(expression的值非0即為真)時(shí)匯編代碼。 .elseif expression 標(biāo)志若.if條件為假,
22、而.elseif條件為真時(shí)要匯編代碼塊。 .else 標(biāo)志若.if條件為假時(shí)要匯編代碼塊。 .endif 標(biāo)志條件塊的結(jié)束,并終止該條件代碼塊,3引用其他文件和初始化常數(shù)偽指令 .include 文件名 將指定文件復(fù)制到當(dāng)前位置,其內(nèi)容可以是程序、數(shù)據(jù)、符號(hào)定義等。 .copy 文件名 與.include類似。 .def 符號(hào)名 在當(dāng)前文件中定義一個(gè)符號(hào),可以被其他文件使用。 .ref 符號(hào)名 在其他文件中定義,可以在本文件中使用的符號(hào)。 .global 符號(hào)名 其作用相當(dāng)于.def、.ref效果之和,mmregs 定義存儲(chǔ)器映射寄存器的符號(hào)名,這樣就可以用AR0、PMST等助記符替換實(shí)際的存
23、儲(chǔ)器地址。 .float 數(shù)1,數(shù)2 指定的各浮點(diǎn)數(shù)連續(xù)放置到存儲(chǔ)器中(從當(dāng)前段指針開(kāi)始)。 .word 數(shù)1,數(shù)2 指定的各數(shù)(十六進(jìn)制)連續(xù)放置到存儲(chǔ)器中。 .space n 以位為單位,空出n位存儲(chǔ)空間。 .end 程序塊結(jié)束。 .set定義符號(hào)常量,如:K .set 256,4宏定義和宏調(diào)用 TMS320C54x匯編支持宏語(yǔ)言。如果程序中需要多次執(zhí)行某段程序,可以把這段程序定義(宏定義)為一個(gè)宏,然后在需要重復(fù)執(zhí)行這段程序的地方調(diào)用這條宏。 宏定義如下: Macname .macroparameter 1,parameter n .mexit .endm,例5-4 宏定義、宏調(diào)用和宏展
24、開(kāi)的一個(gè)例子。 1 * 2 3 * add3 4 * 5 * ADDRP=P1+P2+P3 ;說(shuō)明宏功能 6 7 add3 .macro p1,p2,p3,ADDRP ;定義宏 8 9 LD p1,A ;將參數(shù)1賦給A 10 ADD p2,A ;將參數(shù)2與A相加 11 ADD p3,A ;將參數(shù)3與A相加 12 STL A,ADDRP ;將結(jié)果A的低字存參數(shù)4 13 .endm ;結(jié)束宏 14 15 16 .global abc,def,ghi,adr ;定義全局符號(hào) 17 18 000000 add3 abc,def,ghi,adr ;調(diào)用宏 1 1 000000 1000! LD abc,
25、A ;宏展開(kāi) 1 000001 0000! ADD def,A 1 000002 0000! ADD ghi,A 1 000003 8000! STL A,adr,返回本節(jié),5.4 鏈接器命令文件的編寫(xiě)與使用,5.4.1 MEMORY偽指令及其使用 5.4.2 SECTIONS偽指令及其使用,返回首頁(yè),1)將有多個(gè)選項(xiàng)的命令,寫(xiě)成一個(gè)鏈接器命令文件.cmd。 (2)進(jìn)行存儲(chǔ)器分配 (3)運(yùn)行鏈接器命令文件.cmd,生成一個(gè)映象文件.map和一個(gè)可執(zhí)行的輸出文件.out,主 要 功 能,1)輸入文件名,就是要鏈接的目標(biāo)文件和文檔庫(kù)文件,或者是其它的命令文件。如果要調(diào)用另一個(gè)命令文件作為輸入文件,
26、此句一定要放在本命令文件的最后,因?yàn)殒溄悠鞑荒軓男抡{(diào)用的命令文件返回。 (2)鏈接器選項(xiàng)。這些選項(xiàng)既可以用在鏈接器命令行,也可以編在命令文件中。 (3)MEMORY和SECTIONS都是鏈接器命令。如果鏈接命令文件中沒(méi)有MEMORY和SECTIONS命令(默認(rèn)情況),則鏈接器就從地址0080h一個(gè)段接著一個(gè)段進(jìn)行配置。 (4)注釋的內(nèi)容應(yīng)當(dāng)用/*和*/符號(hào)括起來(lái),例5-5 鏈接器命令文件舉例。 a.obj b.obj /* 輸入文件名 */ -o prog.out /* 選項(xiàng) */ -m prog.map /* 選項(xiàng) */ MEMORY /* MEMORY 命令 */ PAGE0: ROM:
27、origin=1000h, length=0100h PAGE1: RAM: origin=0100h, length=0100h SECTIONS /* SECTIONS 命令 */ .text: ROM .data: ROM .bss: RAM,返回本節(jié),5.4.1 MEMORY偽指令及其使用,MEMORY命令用來(lái)定義目標(biāo)系統(tǒng)中所包含的各種存儲(chǔ)器的存儲(chǔ)器配置圖,包括對(duì)存儲(chǔ)器各部分命名,以及規(guī)定它們的起始地址和長(zhǎng)度,定義系統(tǒng),MEMEORY PAGE0: name1 (attr): origin=constant, length=constant PAGEn: namen (attr): o
28、rigin=constant, length=constant,對(duì)一個(gè)存儲(chǔ)空間加以標(biāo)記,每一個(gè)PAGE代表一個(gè)完全獨(dú)立的地址空間。頁(yè)號(hào)n最多可規(guī)定為255,取決于目標(biāo)存儲(chǔ)器的配置。通常PAGE 0定為程序存儲(chǔ)器,PAGE 1定為數(shù)據(jù)存儲(chǔ)器。如果沒(méi)有規(guī)定PAGE,則鏈接器將目標(biāo)存儲(chǔ)器配置在PAGE 0,存儲(chǔ)區(qū)間的名字可以包含8個(gè)字符,AZ、az、$、.、_均可。名字并沒(méi)有特殊的含義,用來(lái)標(biāo)記存儲(chǔ)器的區(qū)間而已;名字都是內(nèi)部記號(hào),不需要保留在輸出文件或者符號(hào)表中。不同PAGE上的存儲(chǔ)器區(qū)間可以取相同的名字,但在同一PAGE內(nèi)的名字不能相同,且不許重疊配置,R 規(guī)定可以對(duì)存儲(chǔ)器執(zhí)行讀操作。 W 規(guī)定可
29、以對(duì)存儲(chǔ)器執(zhí)行寫(xiě)操作。 X 規(guī)定存儲(chǔ)器可以裝入可執(zhí)行的程序代碼。 I 規(guī)定可以對(duì)存儲(chǔ)器進(jìn)行初始化。 以上屬性可以在將輸出段定位到存儲(chǔ)器時(shí)加以限制。 如果一項(xiàng)屬性都沒(méi)有選,就可以將輸出段不受限制地定位到任何一個(gè)存儲(chǔ)器位置。任何一個(gè)沒(méi)有規(guī)定屬性的存儲(chǔ)器都默認(rèn)有全部4項(xiàng)屬性,規(guī)定一個(gè)存儲(chǔ)區(qū)的起始地址。鍵入origin、org或o都可以。這個(gè)值是一個(gè)16位二進(jìn)制常數(shù),可以用十進(jìn)制數(shù)、八進(jìn)制數(shù)或十六進(jìn)制數(shù)表示,規(guī)定一個(gè)存儲(chǔ)區(qū)的長(zhǎng)度,鍵入length、len或l都可以,返回本節(jié),fill:任選項(xiàng),指定存儲(chǔ)區(qū)的填充指,為沒(méi)有定位輸出段的存儲(chǔ)器空單元填充一個(gè)數(shù),鍵入fill或f均可。這是2個(gè)字節(jié)的整型常數(shù),可
30、以是十進(jìn)制數(shù)、八進(jìn)制數(shù)或十六進(jìn)制數(shù)表示。如fill=0FFFFh,5.4.2 SECTIONS偽指令及其使用,SECTIONS偽指令功能如下: 說(shuō)明如何將輸入段組合成輸出段。 在可執(zhí)行程序中定義輸出段。 指定輸出段在存儲(chǔ)器中存放的位置。 允許對(duì)輸出段重新命名,SECTIONS偽指令的一般語(yǔ)法為: SECTIONS name:property,property,property . name:property,property,property . name:property,property,property .,例5-6 SECTIONS命令的使用方法。 file1.obj file2.ob
31、j /* Input files */ -o prog.out /* Options */ SECTIONS .text: load=ROM, run=800h .const: load=ROM .bss: load=RAM .vectors: load=FF80h t1.obj(.intvec1) t2.obj(.intvec2) .data: align=16,圖5-5 例5-6中段的定位,返回本節(jié),5.5 匯編語(yǔ)言程序編寫(xiě)方法,5.5.1 匯編語(yǔ)言源程序格式 5.5.2 匯編語(yǔ)言中的常數(shù)和字符串 5.5.3 匯編源程序中的符號(hào) 5.5.4 匯編源程序中的表達(dá)式,返回首頁(yè),5.5.1 匯編
32、語(yǔ)言源程序格式,助記符指令一般包含4個(gè)部分,其一般組成形式為: 標(biāo)號(hào): 助記符 操作數(shù) ;注釋 1標(biāo)號(hào)區(qū) 所有匯編指令和大多數(shù)匯編偽指令前面都可以帶有標(biāo)號(hào),標(biāo)號(hào)可以長(zhǎng)達(dá)32個(gè)字符,由AZ、az、09、_、和$符號(hào)組成,且第一個(gè)字符不能是數(shù)字,區(qū)分大小寫(xiě),2助記符區(qū) 助記符區(qū)不能從第一列開(kāi)始,否則被認(rèn)為是標(biāo)號(hào)。 3操作數(shù)區(qū) 操作數(shù)區(qū)是一個(gè)操作數(shù)列表,可以是常數(shù)、符號(hào)或常數(shù)與符號(hào)構(gòu)成的表達(dá)式。操作數(shù)間需用“,”號(hào)隔開(kāi)。 4注釋區(qū) 注釋區(qū)可以從任何一列開(kāi)始,可以包含ASCII字符和空格,返回本節(jié),5.5.2 匯編語(yǔ)言中的常數(shù)和字符串,表5-3 COFF常數(shù)與字符串,返回本節(jié),5.5.3 匯編源程序中
33、的符號(hào),1標(biāo)號(hào):與程序中的位置有關(guān)的符號(hào)地址。 2局部標(biāo)號(hào):特殊的標(biāo)號(hào),其使用范圍和影響是臨時(shí)的。 3符號(hào)常數(shù):用一個(gè)有意義的符號(hào)名代表一個(gè)常數(shù)。 4先定義的符號(hào)常數(shù):匯編器預(yù)先定義的符號(hào)。$,AR0-AR7。 5替代符號(hào):用.asg將一個(gè)字符串賦給替代符號(hào),當(dāng)匯編器遇到替代符號(hào)時(shí),就用它的字符串值替代它,Label1:LD ADDRA,A SUB ADDRB,A BC $1,ALT LD ADDRB,A B $2 $1: LD ADDRA,A $2: ADD ADDRC,A .newblock BC $1,ALT STL A,ADDRC $1: NOP,局部標(biāo)號(hào) $代表段程序計(jì)數(shù)器的當(dāng)前值,
34、K.set1024 maxbuf.set2*K value .set 0 delta .set 1,asg“*+”,INC .asg“*-”,DEC .asg“10,20,30,40”,coefficients .bytecoefficients,符號(hào)常數(shù),替代符號(hào),返回本節(jié),5.5.4 匯編源程序中的表達(dá)式,表達(dá)式可以是常數(shù)、符號(hào)或由算術(shù)運(yùn)算符結(jié)合的常數(shù)和符號(hào)。表達(dá)式值的有效范圍為 -3276832767。 1運(yùn)算符(表5-4 所示) 2合格的表達(dá)式(表5-5所示,表5-4 可以用在表達(dá)式中的運(yùn)算符,表5-5 帶有絕對(duì)符號(hào)、可重定位符號(hào)的表達(dá)式,data label1.word0,1,2 l
35、abel2.word3 X.set50 goodsym1.set100h+X; goodsym2.set$; goodsym3.setlabel1; goodsym4.setlabel2-label1,因?yàn)閄的值在引用之前已定義,合格表達(dá)式,對(duì)前面定義的所有局部標(biāo)號(hào)的所有引用,包括當(dāng)前的SPC( $ )都是合格的,兩個(gè)局部標(biāo)號(hào)不是絕對(duì)符號(hào),但相同的段內(nèi),它們的差是絕對(duì)的,globalextern_1;在外部模塊定義 intern_1:.word”D;在當(dāng)前模塊定義,可重定位 LAB1:.set2;LAB1=2,絕對(duì)符號(hào) intern_2:.wordAB;在當(dāng)前模塊定義,可重定位,LD#LAB1
36、+(4+3)*7),A;2+(4+3)*7)=51-A LD#LAB1+4+(3*7),A;2+4+(3*7)=27-A,LDextern_1-10,B; 合法 LD10-extern_1,B;非法,不能將可重定位符號(hào)變負(fù) LD-(intern_1),B ;非法,不能將可重定位符號(hào)變負(fù) LDextern_1/10,B ;非法,不能將可重定位符號(hào)進(jìn)行乘除 LDintern_1+extern_1,B;非法,LDintern_1-intern_2+extern_1,B; 合法 LDintern_1+intern_2+extern_1,B;非法,intern_1+intern_2不 是絕對(duì)值 LDin
37、tern_1+extern_1-intern_2,B ;非法,匯編器先計(jì)算 intern_1+extern_1,返回本節(jié),5.6 TMS320C54x C語(yǔ)言編程,5.6.1 存儲(chǔ)器模式 5.6.2 寄存器規(guī)則 5.6.3 函數(shù)調(diào)用規(guī)則 5.6.4 中斷處理 5.6.5 表達(dá)式分析,返回首頁(yè),5.6.1 存儲(chǔ)器模式,1段 C54x將存儲(chǔ)器處理為程序存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器兩個(gè)線性塊。程序存儲(chǔ)器包含可執(zhí)行代碼;數(shù)據(jù)存儲(chǔ)器主要包含外部變量、靜態(tài)變量和系統(tǒng)堆棧。編譯器的任務(wù)是產(chǎn)生可重定位的代碼,允許鏈接器將代碼和數(shù)據(jù)定位進(jìn)合適的存儲(chǔ)空間。C編譯器對(duì)C語(yǔ)言編譯后除了生成3個(gè)基本段,即.text、.data、
38、.bss外,還生成.cinit、.const、.stack、.sysmem段,2C/C+系統(tǒng)堆棧 .stack不同于DSP匯編指令定義的堆棧。DSP匯編程序中要將堆棧指針SP指向一塊RAM,用于保存中斷、調(diào)用時(shí)的返回地址,存放PUSH指令的壓棧內(nèi)容。 .stack定義的系統(tǒng)堆棧實(shí)現(xiàn)的功能是保護(hù)函數(shù)的返回地址,分配局部變量,在調(diào)用函數(shù)時(shí)用于傳遞參數(shù),保護(hù)臨時(shí)結(jié)果。 .stack定義的段大?。ǘ褩4笮。┛捎面溄悠鬟x項(xiàng)-stack size設(shè)定,鏈接器還產(chǎn)生一個(gè)全局符號(hào)_ _STACK_SIZE,并賦給它等于堆棧長(zhǎng)度的值,以字為單位,缺省值為1K,3存儲(chǔ)器分配 (1)運(yùn)行時(shí)間支持函數(shù)。 rts.li
39、b (2)動(dòng)態(tài)存儲(chǔ)器分配。 malloc calloc (3)靜態(tài)和全局變量的存儲(chǔ)器分配。 (4)位域/結(jié)構(gòu)的對(duì)準(zhǔn),返回本節(jié),5.6.2 寄存器規(guī)則,寄存器規(guī)則明確了編譯器如何使用寄存器以及在函數(shù)調(diào)用過(guò)程中如何保護(hù)寄存器。 (1)輔助寄存器 AR1,AR6,AR7;AR0,AR2,AR3,AR4,AR5 (2)堆棧指針SP (3)ARP (4)在默認(rèn)情況下,編譯器總是假定ST1中的OVM在硬件復(fù)位時(shí)被清0。若在匯編代碼中對(duì)OVM置位為1,返回到C環(huán)境時(shí)必須復(fù)位。 (5)寄存器變量,返回本節(jié),5.6.3 函數(shù)調(diào)用規(guī)則,1)局部幀的產(chǎn)生 (2)參數(shù)傳遞 (3)函數(shù)的返回,返回本節(jié),5.6.4 中斷處理,1)中斷的使能和屏蔽必須由程序員自己來(lái)設(shè)置。 (2)中斷程序沒(méi)有參數(shù)傳遞,即使說(shuō)明,也會(huì)被忽略 (3)中斷處理程序不能被正常的C程序調(diào)用。 (4)為了使中斷程序與中斷一致,在相應(yīng)的中斷矢量中必須放置一條轉(zhuǎn)移指令,可以用.sect匯編偽指令建立一
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 高中學(xué)生宿舍樓可行性分析結(jié)論
- 2024建筑業(yè)流動(dòng)資金借款合同
- 立體栽培項(xiàng)目實(shí)施方案
- 變電站財(cái)務(wù)與經(jīng)濟(jì)風(fēng)險(xiǎn)評(píng)估
- 物業(yè)預(yù)算合同范本
- 椎動(dòng)脈型頸椎病治療
- 兔毛購(gòu)銷合同范本
- 煙酒銷售合同范本
- 2025年中國(guó)青梅酒行業(yè)深度分析、投資前景、趨勢(shì)預(yù)測(cè)報(bào)告(智研咨詢)
- 2023年綿陽(yáng)市鹽亭縣人民醫(yī)院招聘考試真題
- 華能(天津)煤氣化發(fā)電限公司2024年應(yīng)屆畢業(yè)生招聘高頻難、易錯(cuò)點(diǎn)500題模擬試題附帶答案詳解
- 2024-2025學(xué)年九年級(jí)化學(xué)人教版上冊(cè)檢測(cè)試卷(1-4單元)
- 2024秋九年級(jí)化學(xué)上冊(cè) 2.2《氧氣》說(shuō)課稿 (新版)新人教版
- 汽車檢測(cè)技術(shù) 課程設(shè)計(jì)
- 七年級(jí)語(yǔ)文上冊(cè)18-我的白鴿課件
- 素描入門基礎(chǔ)畫(huà)單選題100道及答案解析
- 期中模擬檢測(cè)(1-3單元)2024-2025學(xué)年度第一學(xué)期蘇教版一年級(jí)數(shù)學(xué)
- 四川省食品生產(chǎn)企業(yè)食品安全員理論考試題庫(kù)(含答案)
- 機(jī)織服裝生產(chǎn)中的質(zhì)量控制體系建設(shè)考核試卷
- 2024年廣西安全員C證考試題庫(kù)及答案
- 期末測(cè)試卷(試題)-2024-2025學(xué)年人教PEP版(2024)英語(yǔ)三年級(jí)上冊(cè)
評(píng)論
0/150
提交評(píng)論