版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第6章匯編語言6.1匯編語言格式TMS320匯編語言源程序由源語句組成。源語句包括匯編指令、偽指令、宏指令。源語句的一般格式為[標(biāo)號][:]助記符[操作數(shù)1,操作數(shù)2,…][;注釋]標(biāo)號域助記符域操作數(shù)域注釋域注:“[]〞表示該項可缺省。例6.1SYM1.set2 ;符號SYM1等于2BEGIN:LDPSYM1;將2裝入DP .word016h;初始化一個字為16h1、標(biāo)號域標(biāo)號包含1~32個字母、數(shù)字、字符(A~Z,a~2,0~9,—及$),可識別符號的大小寫,且規(guī)定第一個字符不能是數(shù)字。標(biāo)號可以后隨冒號(:),冒號并不作為標(biāo)號的一局部被處理。如果不使用標(biāo)號,那么第一個字必須是空格或分號或星號。中選用標(biāo)號時,其值是段程序計數(shù)器(SPC)的當(dāng)前值,標(biāo)號指向與它們相關(guān)聯(lián)的語句。例如,如果用.word偽指令初始化幾個字,那么標(biāo)號將指向第一個字。行號SPC目標(biāo)代碼源語句100040000ASTART:.word0Ah,3,70041000300420007標(biāo)號也可以單獨出現(xiàn)在行中,此時它指向下一行中的指令。如:30050HERE:400500003.word3;此行SPC無增量2、助記符域助記符是源語句中的關(guān)鍵局部,不能缺省,它表示本指令的操作類型。助記符不能從源語句的第一列開始,如果從第一列開始,將被解釋為標(biāo)號。助記符包括以下操作碼之一:(1)匯編指令(例如ABS,MPY,SPH);(2)偽指令(例如.data,.fist,.set);(3)宏指令(例如.macro,.mexit)。3、操作數(shù)域
操作數(shù)域是跟在助記符域后面的操作數(shù)列表,可缺省。如果多于兩個操作數(shù),那么只用逗號隔開。操作數(shù)可以是常數(shù)、符號和表達(dá)式。4、注釋域注釋域可以從源語句行的任一列開始并直至本行的末尾,即僅包括注釋的源語句是有效的。如果它從第一列開始那么可以用分號(;)或星號(*)開始;在行的其他地方開始的注釋,必須以分號開始。上述各個域必須用一個或多個空格分開。6、1、1常數(shù)、字符串和符號
(1)二進(jìn)制整數(shù):以字母B(或b)結(jié)尾,由二進(jìn)制數(shù)字(0,1)組成的數(shù)字串。數(shù)字串長度長度最多可達(dá)16個二進(jìn)制數(shù)字,如01000110B。(2)八進(jìn)制整數(shù):以字母Q(或q)結(jié)尾,由八進(jìn)制數(shù)字(0~7)組成的數(shù)字串。數(shù)字串長度最多可達(dá)6個八進(jìn)制數(shù)字,如100000Q。(3)十進(jìn)制整數(shù):以字母D(或d)結(jié)尾(也可缺省),十進(jìn)制整數(shù)由0~9數(shù)字組成,范圍從-32678~65535,如-30000。(4)十六進(jìn)制整數(shù):以字母H(或h)結(jié)尾,由十六進(jìn)制數(shù)字0~9和A~F(或a~f)組成的數(shù)字串。數(shù)字串長度最多可達(dá)4個十六進(jìn)制數(shù)字。(5)字符常數(shù):包含在單引號中的一個或兩個字符的串。每個字符表示為8位ASCII碼,如‘a(chǎn)’定義字符a,并在內(nèi)部用61H表示。(6)匯編時間常數(shù):用.set偽指令對符號進(jìn)行賦值,賦值的內(nèi)容不同,匯編時符號所表達(dá)的含義也就不同。1、常數(shù)例如,用.set向符號賦值,那么符號成為常數(shù),為了在表達(dá)式中使用此常數(shù),賦予它的值必須是絕對值。SHIFT .set3 LACC*,SHIFT,AR1也可用.set將存放器名賦予符號常數(shù),此時符號與存放器為同一詞,如: AUXR1.setAR1 LACC*,0,AUXR12、字符串字符串是包含在雙引號內(nèi)的一串字符,雙引號是字符串的一局部。串的最大長度是變化的,并由每一個使用字符串的偽指令定義。字符在內(nèi)部被表示為8位ASCII字符,如:“sampleprogram〞定義13個字符的字符串sampleprogram。字符串用于以下場合:(1).copy“filename〞中的文件名;(2).sect“sectionname〞中的段名;(3).byte“chasing〞中數(shù)據(jù)初始化偽指令;(4).string偽指令的操作數(shù)。字符串與字符常數(shù)不同,字符常數(shù)代表一個單獨的整數(shù)值,而字符串是字符的列表。3、符號
符號被用做標(biāo)號、常數(shù)及替代符號。符號名最多可由32個字母和數(shù)字混合組成(A~Z,a~z,0~9,$和_)。符號的第一個字符不能是數(shù)字,符號內(nèi)不能有空格。用戶定義的符號分大小寫,例如匯編時ABC,Abc及abc被識別為3個不同的符號。
表達(dá)式由運算符、常數(shù)和符號組成。有效表達(dá)式值的范圍是-32768~+32767。6、1、2表達(dá)式和運算符
表達(dá)式內(nèi)使用的運算符的優(yōu)先級見下表:高組運算符說明優(yōu)先級1+-~取正取負(fù)求反
低2*/%??乘除求模左移右移3+-^|&加減按位邏輯異或按位邏輯或按位邏輯與4<><=>==或==!=小于大于小于或等于大于或等于等于不等于6.2宏指令
為了簡化匯編語言源程序的書寫,常常將一些頻繁出現(xiàn)的程序段定義為宏指令。
TMS320系列DSP匯編器支持宏語言。使用宏的過程要經(jīng)過以下3個步驟。(1)定義宏:用戶在使用宏之前必須先定義宏。在程序的任何地方都可以定義一個宏。一般是在源文件開始處定義,或者在.include/.copy文件中定義,或者在宏庫中定義。宏定義語句格式如下:宏名.macro[形式參數(shù)1][,形式參數(shù)2]…[,形式參數(shù)n]..[.mexit] .endm(2)調(diào)用宏:在定義了宏以后,就可以在源程序中將宏的名字作為操作碼來調(diào)用。格式:宏名[實參數(shù)1][,實參數(shù)2][,實參數(shù)n](3)展開宏:匯編器在對源文件進(jìn)行匯編時,對調(diào)用的宏進(jìn)行展開。在展開過程中,匯編器用宏體取代宏調(diào)用語句,宏體中的形式參數(shù)(替代符號)用實際參數(shù)代替。①如果某個形式參數(shù)沒有對應(yīng)的實參數(shù)為其賦值,該形式參數(shù)將被空串(“〞)代替。②如果實參數(shù)的個數(shù)多于形式參數(shù),那么余下的實參數(shù)將賦給最后一個形式參數(shù)(用逗號隔開)。③如果要把一串變量賦給一個形式參數(shù),或者把一個逗號(或分號)傳給一個形式參數(shù),就必須用引號將它們引起來。④匯編時,匯編器先用實參數(shù)代替形式參數(shù)并展開宏,然后把源語句匯編為目標(biāo)代碼,并輸出到列表文件中。例宏定義:parms.macrox,y,za=x b=y c=z .endm調(diào)用宏:匯編時展開宏parms100,200;a=100;b=200 ;c=
“〞parms“100,200,300〞,55,66,77;a=“100,200,300〞 ;b=55 ;c=
66,77
6.3通用目標(biāo)文件格式
CCS開發(fā)環(huán)境可以看成是一個大的軟件包,里面包含了源代碼編輯器,以及工程文件組織、編譯和調(diào)試等一切功能模塊。該軟件包里,shell程序可以完成3個功能:編譯、匯編和鏈接。shell程序缺省在C盤安裝時,被安裝在C:\ti\c2400\cgtool子目錄下,對應(yīng)的文件名為?!?〕編輯器:包括分析器、優(yōu)化器、代碼產(chǎn)生器。把C語言程序編譯成匯編語言程序?!?〕匯編器:把匯編語言源代碼或C語言已經(jīng)編譯成匯編語言代碼進(jìn)行匯編,以產(chǎn)生COFF目標(biāo)文件?!?〕鏈接器:將文件鏈接,產(chǎn)生可執(zhí)行的目標(biāo)文件。使用匯編器可以將匯編語言源程序匯編為目標(biāo)文件,用鏈接器將假設(shè)干個目標(biāo)文件連接成—個可被芯片執(zhí)行的可執(zhí)行文件。這些目標(biāo)文件的格式稱為通用目標(biāo)文件格式(COFF,CommonObjectFileFormat)。通用目標(biāo)文件格式的核心是使程序員在編寫DSP程序時基于代碼塊和數(shù)據(jù)塊的概念,而不是一條條指令或一個個數(shù)據(jù),基于這種文件格式編寫的DSP程序可讀性強(qiáng)、可移植性好。在COFF文件中,將代碼塊和數(shù)據(jù)塊稱為Section,編譯器/匯編器和鏈接器都提供了有關(guān)的命令來創(chuàng)立塊和對塊進(jìn)行處理,編譯器/匯編器創(chuàng)立的塊的名稱有些是已經(jīng)定義好的,程序員也可以自己定義塊名。6.3.1塊
目標(biāo)文件的最小單位被稱為塊,它是在存儲器中占有連續(xù)空間的一塊代碼或數(shù)據(jù)。目標(biāo)文件中的每一個塊都是獨立的。一般地,COFF目標(biāo)文件應(yīng)包含3個缺省的塊:.text塊:通常包含可執(zhí)行代碼。.data塊:通常包含已初始化的數(shù)據(jù)。.bss塊:通常為未初始化的變量保存空間。此外,匯編器和連接器允許用戶建立和鏈接自定義的塊,這些塊與.text,.data類似。所有的塊可以分為兩類:已初始化塊:包含程序代碼和數(shù)據(jù)。如.text和.data及用.sect或.asect匯編器命令創(chuàng)立的塊。未初始化塊:為未初始化數(shù)據(jù)在存儲器映像中保存空間。.bss段和用.usect匯編器命令創(chuàng)立的塊是未初始化的段。6.3.2匯編器對塊的處理
匯編器對塊的處理功能主要是確定匯編語言程序的各局部屬于哪個特定的塊。匯編器有六個命令來完成這種功能:.bss,.usect,.text,.data,.sect及.asect。其中.bss和.usect命令創(chuàng)立未初始化塊,而.text,.data,.sect及.asect命令那么建立已初始化塊。如果在程序中未用任何命令來指示,匯編器將把所有程序塊或數(shù)據(jù)塊統(tǒng)一匯編至.text中?!?〕未初始化塊未初始化塊主要用來在存儲器中保存空間,它們通常分配在RAM中。這些塊在目標(biāo)文件中沒有實際內(nèi)容,只是保存空間而已。程序可以在運行時利用這些空間建立和存儲變量。未初始化數(shù)據(jù)塊是通過使用.bss和.usect匯編器命令來建立。.bss命令在.bss塊中保存空間,而.usect命令在自定義塊中保存空間。格式為:.bss符號,字?jǐn)?shù)符號.usect“塊名〞,字?jǐn)?shù)其中,符號指向由.bss或.usect保存的第一個字,它對應(yīng)于為變量保存空間的變量名,可以在其他任何塊中被訪問,也可以用.global定義為全局符號。字?jǐn)?shù)表示空間的大小,塊名是程序員自己定義的名字。匯編器遇到.text,.data,.sect和.asect命令時立即停止匯編至當(dāng)前塊中且開始匯編至相應(yīng)塊中。匯編器遇到.bss或.usect命令并不結(jié)束當(dāng)前塊開始一個新塊,它們只是暫時離開當(dāng)前塊?!?〕已初始化塊已初始化塊包含可執(zhí)行代碼或已初始化數(shù)據(jù)。塊的內(nèi)容存儲在目標(biāo)文件中,當(dāng)程序裝入時存放在DSP存儲器中。每個已初始化塊可以獨立地進(jìn)行重定位,且可訪問在其他塊中定義的符號。鏈接器可自動解決塊與塊之間符號訪問的問題。有四個命令通知匯編器將代碼或數(shù)據(jù)存放在嚴(yán)格塊中,格式為:.text.data.sect“塊名〞.asect“塊名〞,地址上述命令中,.text和.data建立的塊名就是.text和.data,而后兩命令建立的是自定義塊,其中.asect建立的塊有絕對地址,一般不建議使用。
當(dāng)匯編器遇到上述命令時,立即停止匯編至當(dāng)前塊中,且開始將隨后的代碼或數(shù)據(jù)匯編至相應(yīng)的塊中。塊是通過迭代過程建立的。如,當(dāng)匯編器首次遇到一個.data命令,.data塊是空的,.data后面的語句被匯編到.data塊中,直到遇到一個.text,.sect或.asect命令為止。如果匯編器在后面又遇到.data命令,那么將.data后面的語句加到已存在于.data塊中語句的后面,這樣建立的唯一的.data塊可以在存儲器中分配一個連續(xù)的空間?!?〕自定義塊自定義塊就是程序員自己建立的塊,與缺省的.text,.data和.bss塊一樣使用,但它與缺省塊分開匯編。如,重復(fù)使用.text命令在目標(biāo)文件中只建立一個.text塊,鏈接后這個.text塊也作為一個單位分配到存儲器中。有時候程序員想把一局部程序放至不同于.text的存儲器中,那么須使用自定義塊,對數(shù)據(jù)也可同樣處理。有三條指令可建立自定義塊:.usect,.sect和.asect,其中.usect建立的塊用法類似于.bss,是在RAM中為變量保存空間;而.sect和.asect建立包含代碼或數(shù)據(jù)的塊,用法類似于.text和.data。.sect建立的塊是可重定位的,而.asect建立具有絕對地址的塊。符號.usect“塊名〞,字?jǐn)?shù).sect“塊名〞.asect“塊名〞,地址例此例表示如何用.usect偽指令定義兩個未初始化的命名段var1和var2。符號ptr指向var1段中保存的第一個字。符號array指向var1段中100個字塊內(nèi)的第一個字。符號dflag指向var1段中50個字塊內(nèi)的第一個字。符號vec指向Var2段中保存的第一個字。0000.text;匯編到.text段00002003LAC03h0000ptr.usect“var1〞,1;在var1段保存1個字0001array.usect“var1〞,100;在var1段保存100個字00010037ADD037h;還在.text段0065dflag.usect“var1〞,50;在var1段保存50個字00020065ADDdflag;還在.text段0000vec.usect“var2〞,100;在var2段保存100個字00030000ADDvec;還在.text段.globalarray;將array定義為外部符號名6.3.3鏈接器對塊的處理
鏈接器對塊的處理有兩個功能。首先,將COFF目標(biāo)文件中的塊用來建立程序塊或數(shù)據(jù)塊,將輸入塊組合起來以建立可執(zhí)行的COFF輸出模塊;其次,鏈接器為輸出塊選擇存儲器地址。鏈接器提供兩個命令完成上述功能:MEMORY和SECTION。MEMORY命令定義目標(biāo)系統(tǒng)的存儲器,程序員可定義每一塊存儲器,指定每一塊的起始地址和長度。SECTION命令告訴鏈接器如何組合輸入塊以及在存儲器何處存放輸出塊。假設(shè)不用這兩個命令,那么鏈接器采用缺省的分配算法。假設(shè)要用這兩條命令,那么一般需要建立一個鏈接命令文件,擴(kuò)展名為d。6.3.4程序的重定位
匯編器對每塊匯編時都假定其起始地址為0,每塊中所有的重定位符號〔標(biāo)號〕都是相對于0地址而言的。當(dāng)然,實際上并不是所有塊在存儲器中都是以0地址定位的,因此鏈接器必須通過以下方法對每塊進(jìn)行重定位?!?〕分配塊至存儲器,使各塊有適宜的起始地址?!?〕調(diào)整符號值,使之對應(yīng)于新的塊地址?!?〕調(diào)整重定位后符號的參考值,以反映調(diào)整后的符號值。鏈接器利用重定位項來調(diào)整符號的參考值。匯編器每次在可重定位符號被參考時建立一個重定位項,鏈接器那么在符號被重定位之后利用這些項來修正參考值。COFF目標(biāo)文件中的每一塊都有一個重定位工程表。表中包含了塊中每一個可重定位參考的一個重定位項。鏈接器在使用完重定位項后將其去除以防止對輸出塊再次重定位。產(chǎn)生重定位項的代碼
1.refX
20000.text30000FF80BX;產(chǎn)生一個重定位項
00010000!
40002D001LALKY;產(chǎn)生一個重定位項0003000450004CEIFY:IDLE鏈接后,假定X重定位至地址100h,且.text塊重定位到起始地址200h,那么Y重定位后的地址為204h。鏈接器利用這兩個重定位項在目標(biāo)代碼中補(bǔ)上這兩個參考:FF80BX變?yōu)镕F80
00000100D001LALKY變?yōu)镈00100040204有時,一塊程序裝入在某塊存儲器中但需在另一塊存儲器中運行。如,程序中的一段關(guān)鍵代碼裝在ROM中,但需在速度更高的RAM中運行。此時,必須進(jìn)行運行時的重定位。實現(xiàn)運行時的重定位的方法,可在鏈接器命令文件的SECTION中將塊分配兩次:一次設(shè)定裝入地址,另一次那么設(shè)定運行地址。如:.text:load=ROM,run=ROM06.3.5COFF中的符號
COFF中包含一個存儲程序中符號信息的信息表,鏈接器在進(jìn)行重定位時要用到這個符號表。在一個模塊中定義在另一個模塊中引用的符號稱為外部符號。一般可用.def、.ref、.global等命令來標(biāo)明某一符號為外部符號。在一個源模塊中,外部符號可以用.def、.ref、.global來定義:〔1〕定義〔.def〕:在當(dāng)前模塊中定義,在其他模塊中引用〔2〕參考〔.ref〕::在當(dāng)前模塊中引用,在其他模塊中定義〔3〕全局〔.global〕:包含上兩者
.globleX;X在本模塊中定義,可在其他模塊中引用.globleY;Y在其他模塊中定義,在本模塊中引用X:ADD056h;定義XMPYY;引用Y6.4鏈接命令文件鏈接器的缺省分配算法是:〔1〕程序存儲器的起始地址是0x1000h,長度為0xEFFF?!?〕數(shù)據(jù)存儲器的起始地址是0x300h,長度為0xFCFF?!?〕將.text分配到起始地址為0x1000h的程序存儲器中?!?〕將.data分配到緊跟在.text的程序存儲器中?!?〕將.cinit分配到緊跟在.data的程序存儲器中。〔6〕將自定義的已初始化塊分配到緊跟在.data的存儲器中,假設(shè)自定義塊不止1個,那么按自定義塊在輸入文件的先后順序存放。〔7〕將.bss分配到起始地址為0x300h的數(shù)據(jù)存儲器中?!?〕將自定義的未初始化塊分配到緊跟在.bss的存儲器中,假設(shè)自定義塊不止1個,那么按自定義塊在輸入文件的先后順序存放。1、MEMORY偽指令MEMORY偽指令的一般語句格式為:MEMORY{PAGE0:存儲器名1[〔屬性〕]:origin=常數(shù),length=常數(shù)··········PAGEn:存儲器名n[〔屬性〕]:origin=常數(shù),length=常數(shù)}〔1〕PAGE:定義一個存儲器空間,用戶可以定義多達(dá)255頁。通常PAGE0定義程序存儲器,PAGE1定義數(shù)據(jù)存儲器。如果用戶沒有使用PAGE選項,那么連接器把段定位到PAGE0。每個PAGE代表一個完全獨立的地址空間。在PAGE0上已配置的存儲器可以和在PAGE1上已配置的存儲器重疊?!?〕存儲器名:命名存儲器范圍。存儲器名由1~8個字符組成,有效的字符包括A~Z,a~z,$及_。名字對于連接器沒有特殊的意義,僅指明存儲器的區(qū)域。在不同頁上存儲器范圍可以有相同的名字,而在同一頁,所有的存儲器范圍不能有相同的名字,且不能重疊?!?〕屬性:對于已命名的范圍有1~4個屬性。屬性是可選項,當(dāng)被使用時,必須用括號括起來。屬性把輸出段的定位限制在某些存儲器范圍內(nèi)。如果用戶不使用任何屬性,那么輸出段即可以定位到任何范圍內(nèi)。有效的屬性包括:R:規(guī)定存儲器可以被讀出;W:規(guī)定存儲器可以被寫入;I:規(guī)定存儲器可以被初始化?!?〕origin:指定一個存儲器區(qū)域的起始地址,也可以寫成org或0。這個值是以字節(jié)規(guī)定的16位常數(shù),也可以是十進(jìn)制、八進(jìn)制或十六進(jìn)制?!?〕length:指定一個存儲器的長度,也可以寫成len或1。數(shù)值的表示方法與origin相同。例:
MEMORY指令舉例/*SampleCommandfilewithMEMORYdirective*/file1.objfile2.Obj-oMEMORY{PAGE0:ROM:ORIGIN=0h,LENGTH=1000hPAGE1:B2:ORIGIN=60h,LENGTH=20hB0B1:ORIGIN=200h,LENGTH=200h}SECTIONS偽指令的一般語法形式是:
SECTIONS{段名1:[特性1,特性2,……]段名2:[特性1,特性2,……]…….}2、SECTION偽指令
特性列表的選項(塊所具備的特性)有以下幾種:(1)裝載地址:規(guī)定塊將被裝載在存儲器中的位置。
語法:load=allocation
或
allocation
或{}>allocationallocation是MEMORY偽指令所定義的范圍內(nèi)地址,包括ROM、RAM、實際地址值(16位常數(shù))等。(2)運行地址:定義塊在存儲器內(nèi)運行的位置。
語法:run=allocation
或
run>allocation
如果在一個塊中l(wèi)oad和run的地址相同,run可以省略。(3)調(diào)準(zhǔn)地址:規(guī)定塊應(yīng)在地址邊界上開始。調(diào)準(zhǔn)可以使連接器把輸出塊放在位于n字邊界的地址,其中/2是2的冪。
語法:align=n
或
align=(n)
如.textalign=128,即將.text段定位于頁邊界。(4)塊地址:規(guī)定塊必須裝在兩個地址邊界之間,它把塊定位在大小為n的塊內(nèi)任何地方,如果塊大于大小為的n塊,那么塊將從該邊界開始。和調(diào)準(zhǔn)一樣,n必須是2的冪。語法:block=n或
block(n)如.bssload=block(0x80)。定位.bss塊使其包含在單個128字的頁內(nèi)或者從新頁開始。用戶可以單獨使用調(diào)準(zhǔn)或塊,也可以和裝入地址、運行地址結(jié)合在一起使用,但是調(diào)準(zhǔn)和塊不能一起使用。(5)輸入塊:定義組成輸出塊的輸入塊。
語法:{input_sections}輸入文件中的塊組合起來形成輸出塊,連接器按照所列出的輸入塊的次序連接并組合它們。輸出塊的大小是組成它的輸入塊的大小之和。通用類型的塊的規(guī)格說明中沒有輸入塊。如SECTIONS{.text:.data:.bss:}此時鏈接器從輸入文件取出所有.text塊并把它們組合到.text輸出塊內(nèi)。鏈接器按照它在輸入文件中遇到的次序連接.text輸入塊,對.data和.bss塊的操作與.text相同。例:SECTIONS{.text/*創(chuàng)立.text輸出段*/{f1.obj(.text)/*從輸入文件中連接.text段*/f2.obj(sec1)/*從輸入文件中連接.sec1段*/f3.obj/*連接輸入文件中所有的段*/f4.obj(.text,sec2)/*從輸入文件中連接.text和.sec1段*/}}(6)塊類型:定義特殊塊類型的標(biāo)志。語法:type=COPY或type=DSECT或type=NOLOAD用戶可以把這3種特殊的類型賦予輸出塊。用COPY和DSECT創(chuàng)立的塊是一個虛塊,它不包括在輸出塊存儲器分配內(nèi),也不占據(jù)存儲器空間,不包括在存儲器映象列表中。但在虛塊中定義的全局符號可以被其他輸入塊引用,COPY段可以將塊的內(nèi)容、重定位信息及行號信息放在輸出模塊中,而DSECT塊那么不放置。NOLOAD創(chuàng)立的塊不將塊的內(nèi)容、重定位信息及行號信息放在輸出模塊中,但鏈接器為其分配空間并包括在存儲器映象列表中。例SETIONS偽指令的使用
file1.objfile2.obj/*輸入文件*/-o/*輸出文件*/
SECTIONS{.text:load=ROMrun=0800h .const:load=ROM .bss:load=ROM Vectors:load=0h { t1.obj(.intvec1) t2.obj(.intvec2) endvec=.;/*將vectors段的最后連接地址賦給endvec符號*/ } .data:align=16 }(7)填充值:定義用于填充初始化空位的數(shù)值。語法:file=value或
name:…{…}:value當(dāng)初始化輸出塊內(nèi)有空位存在時,鏈接器必須提供原始數(shù)據(jù)以填充它值填充空位,該數(shù)值在存儲器內(nèi)復(fù)制直至它填滿空位為止。
程序存儲器:地址范圍內(nèi)容 0000~0FFF片內(nèi)ROM FF00~FFFF片內(nèi)RAM塊B0數(shù)據(jù)存儲器:地址范圍內(nèi)容 0000~0005I/O存放器 0060~007F片內(nèi)RAM塊B20300~03FF片內(nèi)RAM塊B13、鏈接器舉例命令文件exmp.cmd/**定義連接器選項**/-eSETUP/*定義程序入口*/-o/*命名輸出文件*/-m/*創(chuàng)立一個輸出列表文件*//**定義輸入文件**//*連接三個目標(biāo)文件*//**定義存儲器配置**/MEMORY{PAGE0:ROM:ORIGIN=0000h,LENGTH=1000hRAM_B0:ORIGIN=FF00h,LENGTH=100hPAGE1:IO:ORIGlN=0000h,LENGTH=06hRAM_B2:ORIGIN=0060h,LENGTH=20hRAM_B1:ORIGIN=0300h,LENGTH=100h RAM:ORIGIN=0400h,LENGTH=FC00h}/**定義輸出段SECTIONS{.text:{}>ROM,PAGE=0/*將包含在和中的.text塊鏈接到ROM中*/int_vecs:load=0,PAGE=0/*將來自中int_vecs塊的一組中斷矢量連接到ROM中的0地址處*/.data:file=7A1Ch,load=RAM_B0,PAGE=0/*將和中的.data塊鏈接到程序存儲器RAM塊B0中,并在其后創(chuàng)立256字的空位,用7Alh填充*/{tables.obj(.data)fft.obj(.data).=l00h;}fftvars:{}>RAM_B2,page=1/*創(chuàng)立新塊fftvars,并將來自的.bss塊鏈入數(shù)據(jù)存儲器RAM塊的B2中*/{fft.obj(.bss)}.bss:{}>RAM_B1,PAGE=1,FILL=0FFFFh/*中的.bss塊鏈接到RAM塊B1中。RAM的未用局部被初始化為FFFh*/}/**命令文件結(jié)束**/然后用以下命令調(diào)用連接器:dsplnk這樣將生成一個名為的輸出文件,可以在TMS320上運行。同時還生成一個列表文件。6.5程序舉例在程序設(shè)計時,如果需要在多個模塊中使用相同的設(shè)置和中斷處理,通常將芯片中映射至I/O空間的存放器地址及標(biāo)號、預(yù)置變量和常數(shù)的空間等設(shè)置語句集中在一個文件中,稱為I/O存放器頭文件〔如〕;將轉(zhuǎn)移中斷矢量地址的指令集中在一個文件中,稱為中斷矢量頭文件(如);將定義程序、數(shù)據(jù)和I/O空間地址塊大小和位置的偽指令集中在一個文件中,稱為命令文件(如F206d)。這3個文件稱為公用文件。用戶在編寫自己的應(yīng)用程序時,用.copy或.include偽指令將I/O存放器頭文件和中斷矢量頭文件復(fù)制到該應(yīng)用程序中,形成一個匯編源程序(如),由匯編器進(jìn)行匯編后生成一個目標(biāo)文件(如)。再由連接器把該目標(biāo)文件和命令文件相連接,生成一個可執(zhí)行文件(如)。對于簡單的單個應(yīng)用程序也可不使用這兩個頭文件,直接在應(yīng)用程序中對用到的I/O存放器和中斷轉(zhuǎn)移地址進(jìn)行設(shè)置。1、公用文件該文件可為LF2407芯片定義程序、數(shù)據(jù)和I/O空間地址塊的大小和位置,用于和匯編后的TMS320C2000文件(*.obj)相連接,輸出文件名為.out。對于其他芯片,應(yīng)對該文件作相應(yīng)的修改。/*File:LF2407_PMdMEMORY{PAGE0: /*程序存儲空間*/PM:ORIGIN=0h,LENGTH=0044h/*中斷矢量*/PVECS:ORIGIN=0044h,LENGTH=0100h/*外設(shè)中斷矢量*/PROG:ORIGIN=0150h,LENGTH=7EAFh/*以上為32K字片內(nèi)閃速存儲器(0000h~8000h)*/SARAM_P:ORIGIN=8000h,LENGTH=0800h/*程序空間上的2K字SARAM*/EX1_PM:ORIGIN=8800h,LENGTH=7600h/*外部RAM*/B0_PM:ORIGIN=0FF00h,LENGTH=0100h/*如果CNF=1為片上DARAM,否那么為外部B0:FF00h~FFFFh*/(1)命令文件:PAGE1:/*數(shù)據(jù)存儲空間*/REGS:ORIGIN=0h,LENGTH=60h/*內(nèi)存映射存放區(qū)和保存地址*/BLK_B2:ORIGIN=60h,LENGTH=20h/*塊B2*/BLK_B0:ORIGIN=200h,LENGTH=100h/*塊B0,如果CNF=0為片內(nèi)DARAM*/BLK_B1:ORIGIN=300h,LENGTH=100h/*片內(nèi)存儲器塊B1*/SARAM_D:ORIGIN=0800h,LENGTH=0800h/*數(shù)據(jù)空間2K字SARAM*/PERIPH:ORIGIN=7000h,LENGTH=1000h/*外設(shè)存放器空間*/EX1_DM:ORIGIN=8000h,LENGTH=0800h/*數(shù)據(jù)空間2K字SARAM*/PAGE2:/*I/O存儲空間*/IO_EX:ORIGIN=0000h,LENGTH=0FFF0h/*外部I/O映射空間*/IO_EX:ORIGIN=0FFF0h,LENGTH=0Fh/*片內(nèi)的I/O映射空間*/}SECTIONS{.vectors:{}>PMPAGE0.pvecs:{}>PVECSPAGE0.text:{}>PROGPAGE0.bss:{}>BLK_B2PAGE1.data:{}>BLlBlPAGEl}(2)240x存放器頭文件:;Fllename:;240xCPU核存放器IMR .set0004h ;中斷屏蔽存放器IFR .set0006h ;中斷標(biāo)志存放器;系統(tǒng)配置和中斷存放器SCSR1 .set7018h ;系統(tǒng)控制和狀態(tài)存放器lSCSR2 .set7019h ;系統(tǒng)控制和狀態(tài)存放器2DINR .set701Ch ;器件版本號存放器PIVR .set701Eh ;外部中斷矢量存放器PIRQR0 .set7010h ;外部中斷請求存放器0PIRQR1 .set7011h ;外部中斷請求存放器1PIRQR2 .set7012h ;外部中斷請求存放器2該文件包含了240x芯片所有外部存放器的地址、標(biāo)號、預(yù)置變量和常數(shù),在片內(nèi),所有外部存放器都被映射到數(shù)據(jù)空間。該文件還定義了看門狗宏指令??捎?copy或.include偽指令將復(fù)制到應(yīng)用程序中。PIACKR0 .set7014h;外部中斷響應(yīng)存放器0PIACKR1 .set7015h;外部中斷響應(yīng)存放器1PIACKR2 .set7016h;外部中斷響應(yīng)存放器2;外部中斷配置存放器XINT1CR .set7070h;外部中斷1控制存放器XINT2CR .set7071h;外部中斷2控制存放器;數(shù)據(jù)I/O存放器MCRA .set7090h;I/O復(fù)用控制存放器AMCRB .set7092h;I/O復(fù)用控制存放器BMCRC .set7094h;I/O復(fù)用控制存放器CPADATDIR .set7098h;I/O口A數(shù)據(jù)和方向存放器PBDATDIR .set709Ah;I/O口B數(shù)據(jù)和方向存放器PCDATDIR .set709Ch;I/O口C數(shù)據(jù)和方向存放器PDDATDIR .set709Eh;I/O口D數(shù)據(jù)和方向存放器PEDATDIR .set7095h;I/O口E數(shù)據(jù)和方向存放器PFDATDIR .set7096h;I/O口F數(shù)據(jù)和方向存放器;看門狗(WD)存放器WDCNTR .set7023h;WD計數(shù)器存放器WDKEY .set7025h;WD復(fù)位關(guān)鍵字存放器WDCR .set7029h;WD定時器控制存放器:模數(shù)轉(zhuǎn)換(ADC)存放器ADCCTRL1 .set70A0h;ADC控制存放器1ADCCTRL2 .set70A1h;ADC控制存放器2MAXCONV .set70A2h;最大轉(zhuǎn)換通道個數(shù)存放器CHSELSEQ1 .set70A3h;通道選擇排序控制存放器1CHSELSEQ2 .set70A4h;通道選擇排序控制存放器2CHSELSEQ3 .set70A5h;通道選擇排序控制存放器3CHSELSEQ4 .set70A6h;通道選擇排序控制存放器4AUTOSEQ-SR.set70A7h;自動排序狀態(tài)存放器RESULT0 .set70A8h;A/D轉(zhuǎn)換結(jié)果存放器0RESULT1 .set70A9h;A/D轉(zhuǎn)換結(jié)果存放器1RESULT2 .set70AAh;A/D轉(zhuǎn)換結(jié)果存放器2RESULT3 .set70ABh;A/D轉(zhuǎn)換結(jié)果存放器3RESULT4 .set70ACh;A/D轉(zhuǎn)換結(jié)果存放器4RESULT5 .set70ADh;A/D轉(zhuǎn)換結(jié)果存放器5RESULT6 .set70AEh;A/D轉(zhuǎn)換結(jié)果存放器6RESULT7 .set70AFh;A/D轉(zhuǎn)換結(jié)果存放器7RESULT8 .set70B0h;A/D轉(zhuǎn)換結(jié)果存放器8RESULT9 .set70B1h;A/D轉(zhuǎn)換結(jié)果存放器9RESULTl0 .set70B2h;A/D轉(zhuǎn)換結(jié)果存放器10RESULT11 .set70B3h;A/D轉(zhuǎn)換結(jié)果存放器11RESULT12 .set70B4h;A/D轉(zhuǎn)換結(jié)果存放器12RESULT13 .set70B5h;A/D轉(zhuǎn)換結(jié)果存放器13RESULT14 .set70B6h;A/D轉(zhuǎn)換結(jié)果存放器14RESULT15 .set70B7h;A/D轉(zhuǎn)換結(jié)果存放器15CALIBRATION .set70B8h;校準(zhǔn)結(jié)果存放器:串行外設(shè)接口〔SPI〕存放器SPICCR .set7040h;配置控制存放器SPICTL .set7041h;操作控制存放器SPISTS .set7042h;狀態(tài)存放器SPIBRR .set7044h;波特率控制存放器SPIEMU .set7046h;仿真緩沖存放器SPIRXBUF .set7047h;串行接收緩沖存放器SPITXBUF .set7048h;串行發(fā)送緩沖存放器SPIDAT .set7049h;串行數(shù)據(jù)存放器SPIPRI .set704Fh;中斷優(yōu)先級控制存放器;串行通信接口SCICCR .set7050h;SCI通信控制存放器SCICTL1 .set7050h;SCI控制存放器1SCIHBAUD .set7050h;SCI波特率高位字節(jié)存放器SCILBAUD .set7050h;SCI波特率低位字節(jié)存放器SCICTL2 .set7050h;SCI控制存放器2SCIRXST .set7050h;SCI接收狀態(tài)存放器SCIRXEMU .set7050h;SCI接收數(shù)據(jù)緩沖存放器SCIRXBUF .set7050h;SCI仿真數(shù)據(jù)緩沖存放器SCITXBUF .set7050h;SCI發(fā)送數(shù)據(jù)緩沖存放器SCIPRI .set7050h;SCl中斷優(yōu)先級控制存放器;事件管理器A〔EVA〕存放器GPTCONA .set7400h;全局通用定時器控制存放器AT1CNT .set7401h;通用定時器1計數(shù)存放器T1CMPR .set7402h;通用定時器1比較存放器T1PR .set7403h;通用定時器1周期存放器T1CON .set7404h;通用定時器1控制存放器T2CNT .set7405h;通用定時器2計數(shù)存放器T2CMPR .set7406h;通用定時器2比較存放器T2PR .set7407h;通用定時器2周期存放器T2CON .set7408h;通用定時器2控制存放器COMCONA .set7411h;比較控制存放器AACTRA .set7413h;全比較操作控制存放器ADBTCONA .set7415h;死區(qū)時間控制存放器ACMPR1 .set7417h;全比較單元1比較存放器CMPR2 .set7418h;全比較單元2比較存放器CMPR3 .set7419h;全比較單元3比較存放器CAPCONA .set7420h;捕獲控制存放器ACAPFIFOA .set7422h;捕獲FIFO狀態(tài)存放器ACAP1FIFO .set7423h;捕獲1FIFO棧項存放器CAP2FIFO .set7424h;捕獲2FIFO棧頂存放器CAP3FIFO .set7425h;捕獲3FIFO棧頂存放器CAP1FBOT .set7427h;捕獲1FIFO棧底存放器CAP2FBOT .set7428h;捕獲2FIFO棧底存放器CAP3FBOT .set7429h;捕獲3FIFO棧底存放器EVAIMRA .set742Ch;EVA中斷屏蔽存放器AEVAIMRB .set742Dh;EVA中斷屏蔽存放器BEVAIMRC .set742Eh;EVA中斷屏蔽存放器CEVAIFRA.set742Fh;EVA中斷標(biāo)志存放器AEVAIFRB.set7430h;EVA中斷標(biāo)志存放器BEVAIFRC.set7431h;EVA中斷標(biāo)志存放器C;事件管理器B(EVB)GPTCONB .set7500h;全局通用定時器控制存放器BT3CNT .set7501h;通用定時器3計數(shù)存放器T3CMPR .set7502h;通用定時器3比較存放器T3PR .set7503h;通用定時器3周期存放器T3CON .set7504h;通用定時器3控制存放器T4CNT .set7505h;通用定時器4計數(shù)存放器T4CMPR .set7506h;通用定時器4比較存放器T4PR .set7507h;通用定時器4周期存放器T4CON .set7508h;通用定時器4控制存放器COMCONB .set7511h;比較控制存放器BACTRB .set7513h;全比較操作控制存放器BDBTCONB .set7515h;死區(qū)時間控制存放器BCMPR4 .set7517h;全比較單元比較存放器4CMPR5 .set7518h;全比較單元比較存放器5CMPR6 .set7519h;全比較單元比較存放器6CAPCONB .set7520h;捕獲控制存放器BCAPFIFOB .set7522h;捕獲FIFO狀態(tài)存放器BCAP4FIFO .set7523h;捕獲4FIFO棧項存放器CAP5FIFO .set7524h;捕獲5FIFO棧頂存放器CAP6FIFO .set7525h;捕獲6FIFO棧頂存放器CAP4FBOT .set7527h;捕獲4FIFO棧底存放器CAP5FBOT .set7528h;捕獲5FIFO棧底存放器CAP6FBOT .set7529h;捕獲6FIFO棧底存放器EVBIMRA .set752Ch;EVB中斷屏蔽存放器AEVBIMRB .set752Dh;EVB中斷屏蔽存放器BEVBIMRC .set752Eh;EVB中斷屏蔽存放器CEVBIFRA.set752Fh;EVB中斷標(biāo)志存放器AEVBIFRB.set7530h;EVB中斷標(biāo)志存放器BEVBIFRC.set7531h;EVB中斷標(biāo)志存放器C;CAN存放器CANMDER.set7100h;CAN郵箱方向/使能存放器CANTCR .set7101h;CAN發(fā)送控制存放器CANRCR .set7102h;CAN接收控制存放器CANMCR .set7103h;CAN主控制存放器CANBCR2 .set7104h;CAN位配置存放器2CANBCR1 .set7105h;CAN位配置存放器1CANESR .set7106h;CAN錯誤狀態(tài)存放器CANGSR .set7107h;CAN全局狀態(tài)存放器CANCEC .set7108h;CAN傳送和接收錯誤計數(shù)器CANIFR .set7109h;CAN中斷標(biāo)志存放器CANIMR .set710ah;CAN中斷屏蔽存放器CANLAM0H.set710bh;CAN本地接收屏蔽高位字存放器(MBX0/1)CANLAM0L.set710ch;CAN本地接收屏蔽低位字存放器(MBX0/1)CANLAM1H.set710dh;CAN本地接收屏蔽高位字存放器(MBX2/3)CANLAM1L.set710eh;CAN本地接收屏蔽低位字存放器(MBX2/3)CANMSGIDOL.set7200h;CAN郵箱0消息標(biāo)識符(低16位字)CANMSGIDOH.set7201h;CAN郵箱0消息標(biāo)識符(高16位字)CANMSGCTRl0.set7202h;CAN郵箱0消息控制域存放器CANMBX0A .set7204h;CAN郵箱0中郵箱RAM的2個字節(jié)CANMBX0B .set7205h;CAN郵箱0中郵箱RAM的2個字節(jié)CANMBX0C .set7206h;CAN郵箱0中郵箱RAM的2個字節(jié)CANMBX0D .set7207h;CAN郵箱0中郵箱RAM的2個字節(jié)CANMSGID1L .set7208h;CAN郵箱1消息標(biāo)識符(低16位字)CANMSGID1H .set7209h;CAN郵箱1消息標(biāo)識符(高16位字)CANMSGCTRL1 .set720Ah;CAN郵箱1消息控制域存放器CANMBX1A .set720Ch;CAN郵箱1中郵箱RAM的2個字節(jié)CANMBX1B .set720Dh;CAN郵箱1中郵箱趾M的2個字節(jié)CANMBX1C .set720Eh;CAN郵箱1中郵箱RAM的2個字節(jié)CANMBX1D .set720Fh;CAN郵箱1中郵箱RAM的2個字節(jié)CANMSGID2L .set7210h;CAN郵箱2消息標(biāo)識符(低16位字)CANMSGID2H .set7211h;CAN郵箱2消息標(biāo)識符(高16位字)CANMSGCTRL2 .set7212h;CAN郵箱2消息控制域存放器CANMBX2A .set7214h;CAN郵箱2中郵箱RAM的2個字節(jié)CANMBX2B .set7215h;CAN郵箱2中郵箱RAM的2個字節(jié)CANMBX2C .set7216h;CAN郵箱2中郵箱RAM的2個字節(jié)CANMBX2D .set7217h;CAN郵箱2中郵箱RAM的2個字節(jié)CANMSGID3L .set7218h;CAN郵箱3消息標(biāo)識符(低16位字)CANMSGID3H .set7219h;CAN郵箱3消息標(biāo)識符(高16位字)CANMSGCTRL3 .set721Ah;CAN郵箱3消息控制域存放器CANMBX3A .set
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中職急救護(hù)理知識更新
- 海洋油氣操作工高級理論知識題庫及答案
- 水處理的100個問題及答案直接打印
- 急診重癥患者試題及答案
- 文字處理考試題及答案解析
- 安全工程師考試《安全生產(chǎn)法律法規(guī)》題庫100題含答案
- 內(nèi)科護(hù)士實習(xí)生出科考試試題及答案
- 山西省大同市直機(jī)關(guān)公開遴選公務(wù)員筆試題及答案解析(B類)
- 師《建設(shè)工程造價管理基礎(chǔ)知識》預(yù)測試題7(答案解析)
- 保險公估人模擬真題及答案
- 市場保潔管理方案(3篇)
- 醫(yī)院調(diào)料雜糧副食品采購項目方案投標(biāo)文件(技術(shù)方案)
- 靜脈給藥的安全管理
- 銀行從業(yè)者觀《榜樣》心得體會
- 農(nóng)村年底活動方案
- 2024屆山東省威海市高三二模數(shù)學(xué)試題(解析版)
- 設(shè)備管理獎罰管理制度
- LINE6效果器HD300中文說明書
- 2025年航運行業(yè)安全生產(chǎn)費用提取和使用計劃
- 納米纖維凝膠隔熱材料的應(yīng)用研究進(jìn)展
- 蟹苗買賣合同協(xié)議
評論
0/150
提交評論