DSP 課件 第六章 匯編語言.ppt_第1頁
DSP 課件 第六章 匯編語言.ppt_第2頁
DSP 課件 第六章 匯編語言.ppt_第3頁
DSP 課件 第六章 匯編語言.ppt_第4頁
DSP 課件 第六章 匯編語言.ppt_第5頁
已閱讀5頁,還剩70頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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;初始化一個字為16h,1、標(biāo)號域,標(biāo)號包含132個字母、數(shù)字、字符(AZ,a2,09,及$),可識別符號的大小寫,且規(guī)定第一個字符不能是數(shù)字。標(biāo)號可以后隨冒號(:),冒號并不作為標(biāo)號的一部分被處理。如果不使用標(biāo)號,則第一個字必須是空格或分號或星號。當(dāng)選用標(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ù)字(07)組成的數(shù)字串。數(shù)字串長度最多可達(dá)6個八進(jìn)制數(shù)字,如100000Q。(3)十進(jìn)制整數(shù):以字母D(或d)結(jié)尾(也可缺省),十進(jìn)制整數(shù)由09數(shù)字組成,范圍從-3267865535,如-30000。(4)十六進(jìn)制整數(shù):以字母H(或h)結(jié)尾,由十六進(jìn)制數(shù)字09和AF(或af)組成的數(shù)字串。數(shù)字串長度最多可達(dá)4個十六進(jìn)制數(shù)字。(5)字符常數(shù):包含在單引號中的一個或兩個字符的串。每個字符表示為8位ASCII碼,如a定義字符a,并在內(nèi)部用61H表示。(6)匯編時間常數(shù):用.set偽指令對符號進(jìn)行賦值,賦值的內(nèi)容不同,匯編時符號所表達(dá)的含義也就不同。,1、常數(shù),例如,用.set向符號賦值,則符號成為常數(shù),為了在表達(dá)式中使用此常數(shù),賦予它的值必須是絕對值。SHIFT.set3LACC*,SHIFT,AR1也可用.set將寄存器名賦予符號常數(shù),此時符號與寄存器為同一詞,如:AUXR1.setAR1LACC*,0,AUXR1,2、字符串,字符串是包含在雙引號內(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ù)字混合組成(AZ,az,09,$和_)。符號的第一個字符不能是數(shù)字,符號內(nèi)不能有空格。用戶定義的符號分大小寫,例如匯編時ABC,Abc及abc被識別為3個不同的符號。,表達(dá)式由運算符、常數(shù)和符號組成。有效表達(dá)式值的范圍是-32768+32767。,6、1、2表達(dá)式和運算符,表達(dá)式內(nèi)使用的運算符的優(yōu)先級見下表:,高,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=xb=yc=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:tic2400cgtool子目錄下,對應(yīng)的文件名為dspcl.exe。,(1)編輯器:包括分析器、優(yōu)化器、代碼產(chǎn)生器。把C語言程序編譯成匯編語言程序。(2)匯編器:把匯編語言源代碼或C語言已經(jīng)編譯成匯編語言代碼進(jìn)行匯編,以產(chǎn)生COFF目標(biāo)文件。(3)鏈接器:將文件鏈接,產(chǎn)生可執(zhí)行的目標(biāo)文件。,使用匯編器可以將匯編語言源程序匯編為目標(biāo)文件,用鏈接器將若干個目標(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中。,(1)未初始化塊,未初始化塊主要用來在存儲器中保留空間,它們通常分配在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)前塊。,(2)已初始化塊,已初始化塊包含可執(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ù)的空間。,(3)自定義塊,自定義塊就是程序員自己建立的塊,與缺省的.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命令告訴鏈接器如何組合輸入塊以及在存儲器何處存放輸出塊。若不用這兩個命令,則鏈接器采用缺省的分配算法。若要用這兩條命令,則一般需要建立一個鏈接命令文件,擴(kuò)展名為.cmd。,6.3.4程序的重定位,匯編器對每塊匯編時都假定其起始地址為0,每塊中所有的重定位符號(標(biāo)號)都是相對于0地址而言的。當(dāng)然,實際上并不是所有塊在存儲器中都是以0地址定位的,因此鏈接器必須通過下列方法對每塊進(jìn)行重定位。(1)分配塊至存儲器,使各塊有合適的起始地址。(2)調(diào)整符號值,使之對應(yīng)于新的塊地址。(3)調(diào)整重定位后符號的參考值,以反映調(diào)整后的符號值。鏈接器利用重定位項來調(diào)整符號的參考值。匯編器每次在可重定位符號被參考時建立一個重定位項,鏈接器則在符號被重定位之后利用這些項來修正參考值。,COFF目標(biāo)文件中的每一塊都有一個重定位項目表。表中包含了塊中每一個可重定位參考的一個重定位項。鏈接器在使用完重定位項后將其去除以防止對輸出塊再次重定位。,產(chǎn)生重定位項的代碼,1.refX20000.text30000FF80BX;產(chǎn)生一個重定位項00010000!40002D001LALKY;產(chǎn)生一個重定位項0003000450004CEIFY:IDLE,鏈接后,假定X重定位至地址100h,且.text塊重定位到起始地址200h,則Y重定位后的地址為204h。鏈接器利用這兩個重定位項在目標(biāo)代碼中補上這兩個參考:,FF80BX變?yōu)镕F8000000100D001LALKY變?yōu)镈00100040204,有時,一塊程序裝入在某塊存儲器中但需在另一塊存儲器中運行。如,程序中的一段關(guān)鍵代碼裝在ROM中,但需在速度更高的RAM中運行。此時,必須進(jìn)行運行時的重定位。實現(xiàn)運行時的重定位的方法,可在鏈接器命令文件的SECTION中將塊分配兩次:一次設(shè)定裝入地址,另一次則設(shè)定運行地址。如:.text:load=ROM,run=ROM0,6.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;引用Y,6.4鏈接命令文件,鏈接器的缺省分配算法是:(1)程序存儲器的起始地址是0 x1000h,長度為0 xEFFF。(2)數(shù)據(jù)存儲器的起始地址是0 x300h,長度為0 xFCFF。(3)將.text分配到起始地址為0 x1000h的程序存儲器中。(4)將.data分配到緊跟在.text的程序存儲器中。(5)將.cinit分配到緊跟在.data的程序存儲器中。(6)將自定義的已初始化塊分配到緊跟在.data的存儲器中,若自定義塊不止1個,則按自定義塊在輸入文件的先后順序存放。(7)將.bss分配到起始地址為0 x300h的數(shù)據(jù)存儲器中。(8)將自定義的未初始化塊分配到緊跟在.bss的存儲器中,若自定義塊不止1個,則按自定義塊在輸入文件的先后順序存放。,1、MEMORY偽指令,MEMORY偽指令的一般語句格式為:MEMORYPAGE0:存儲器名1(屬性):origin=常數(shù),length=常數(shù)PAGEn:存儲器名n(屬性):origin=常數(shù),length=常數(shù),(1)PAGE:定義一個存儲器空間,用戶可以定義多達(dá)255頁。通常PAGE0定義程序存儲器,PAGE1定義數(shù)據(jù)存儲器。如果用戶沒有使用PAGE選項,那么連接器把段定位到PAGE0。每個PAGE代表一個完全獨立的地址空間。在PAGE0上已配置的存儲器可以和在PAGE1上已配置的存儲器重疊。(2)存儲器名:命名存儲器范圍。存儲器名由18個字符組成,有效的字符包括AZ,az,$及_。名字對于連接器沒有特殊的意義,僅指明存儲器的區(qū)域。在不同頁上存儲器范圍可以有相同的名字,而在同一頁,所有的存儲器范圍不能有相同的名字,且不能重疊。(3)屬性:對于已命名的范圍有14個屬性。屬性是可選項,當(dāng)被使用時,必須用括號括起來。屬性把輸出段的定位限制在某些存儲器范圍內(nèi)。如果用戶不使用任何屬性,則輸出段即可以定位到任何范圍內(nèi)。有效的屬性包括:R:規(guī)定存儲器可以被讀出;W:規(guī)定存儲器可以被寫入;I:規(guī)定存儲器可以被初始化。,(4)origin:指定一個存儲器區(qū)域的起始地址,也可以寫成org或0。這個值是以字節(jié)規(guī)定的16位常數(shù),也可以是十進(jìn)制、八進(jìn)制或十六進(jìn)制。(5)length:指定一個存儲器的長度,也可以寫成len或1。數(shù)值的表示方法與origin相同。,例:MEMORY指令舉例*SampleCommandfilewithMEMORYdirective*/file1objfile2Obj-oprog.outMEMORYPAGE0: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或runallocation如果在一個塊中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(0 x80)。定位.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)/*從f1.obj輸入文件中連接.text段*f2.obj(sec1)/*從f2.obj輸入文件中連接.sec1段*f3.obj/*連接f3.obj輸入文件中所有的段*f4.obj(.text,sec2)/*從f4.obj輸入文件中連接.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*輸入文件*-oprog.out*輸出文件*SECTIONS.text:load=ROMrun=0800h.const:load=ROM.bss:load=ROMVectors:load=0ht1.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)容00000FFF片內(nèi)ROMFF00FFFF片內(nèi)RAM塊B0數(shù)據(jù)存儲器:地址范圍內(nèi)容00000005I/O寄存器0060007F片內(nèi)RAM塊B2030003FF片內(nèi)RAM塊B1,3、鏈接器舉例,命令文件exmpcmd/*定義連接器選項*/-eSETUP/*定義程序入口*/-oexmp.out/*命名輸出文件*/-mexmp.map/*創(chuàng)建一個輸出列表文件*/*定義輸入文件*/exmp.obj/*連接三個目標(biāo)文件*/fft.objtables.obj/*定義存儲器配置*/MEMORYPAGE0:ROM:ORIGIN=0000h,LENGTH=1000hRAM_B0:ORIGIN=FF00h,LENGTH=100hPAGE1:IO:ORIGlN=0000h,LENGTH=06hRAM_B2:ORIGIN=0060h,LENGTH=20hRAM_B1:ORIGIN=0300h,LENGTH=100hRAM:ORIGIN=0400h,LENGTH=FC00h,/*定義輸出段SECTIONS.text:ROM,PAGE=0/*將包含在exmp.obj和fft.obj中的.text塊鏈接到ROM中*/int_vecs:load=0,PAGE=0/*將來自table.obj中int_vecs塊的一組中斷矢量連接到ROM中的0地址處*/.data:file=7A1Ch,load=RAM_B0,PAGE=0/*將tabales.obj和fft.obj中的.data塊鏈接到程序存儲器RAM塊B0中,并在其后創(chuàng)建256字的空位,用7Alh填充*/tables.obj(.data)fft.obj(.data).=l00h;,fftvars:RAM_B2,page=1/*創(chuàng)建新塊fftvars,并將來自fft.obj的.bss塊鏈入數(shù)據(jù)存儲器RAM塊的B2中*/fft.obj(.bss).bss:RAM_B1,PAGE=1,FILL=0FFFFh*exmp.obj中的.bss塊鏈接到RAM塊B1中。RAM的未用部分被初始化為FFFh*/*命令文件結(jié)束*/然后用下列命令調(diào)用連接器:dsplnkexmp.cmd這樣將生成一個名為exmp.out的輸出文件,可以在TMS320上運行。同時還生成一個列表文件exmp.map。,6.5程序舉例,在程序設(shè)計時,如果需要在多個模塊中使用相同的設(shè)置和中斷處理,通常將芯片中映射至I/O空間的寄存器地址及標(biāo)號、預(yù)置變量和常數(shù)的空間等設(shè)置語句集中在一個文件中,稱為I/O寄存器頭文件(如init.h);將轉(zhuǎn)移中斷矢量地址的指令集中在一個文件中,稱為中斷矢量頭文件(如vector.h);將定義程序、數(shù)據(jù)和I/O空間地址塊大小和位置的偽指令集中在一個文件中,稱為命令文件(如F206.cmd)。這3個文件稱為公用文件。用戶在編寫自己的應(yīng)用程序時,用.copy或.include偽指令將I/O寄存器頭文件和中斷矢量頭文件復(fù)制到該應(yīng)用程序中,形成一個匯編源程序(如delay.asm),由匯編器進(jìn)行匯編后生成一個目標(biāo)文件(如delay.obj)。再由連接器把該目標(biāo)文件和命令文件相連接,生成一個可執(zhí)行文件(如delay.out)。對于簡單的單個應(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_PM.cmdMEMORYPAGE0:/*程序存儲空間*PM:ORIGIN=0h,LENGTH=0044h/*中斷矢量*PVECS:ORIGIN=0044h,LENGTH=0100h/*外設(shè)中斷矢量*PROG:ORIGIN=0150h,LENGTH=7EAFh/*以上為32K字片內(nèi)閃速存儲器(0000h8000h)*/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:FF00hFFFFh*/,(1)命令文件LF2407_PM.cmd:,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)240 x寄存器頭文件240 xA.h:,;Fllename:240 xA.h;240 xCPU核寄存器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,該文件包含了240 x芯片所有外部寄存器的地址、標(biāo)號、預(yù)置變量和常數(shù),在片內(nèi),所有外部寄存器都被映射到數(shù)據(jù)空間。該文件還定義了看門狗宏指令。可用.copy或.include偽指令將240 xA.h復(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é)果寄存器4,RESULT5.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)寄存器B,CAP4FIFO.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.set721Ch;CAN郵箱3中郵箱RAM的2個字節(jié)CANMBX3B.set721Dh;CAN郵箱3中郵箱RAM的2個字節(jié)CANMBX3C.set721Eh;CAN郵箱3中郵箱RAM的2個字節(jié)CANMBX3D.set721Fh;CAN郵箱3中郵箱RAM的2個字節(jié)CANMSGID4L.set7220h;CAN郵箱4消息標(biāo)識符(低16位字)CANMSGID4H.set7221h;CAN郵箱4消息標(biāo)識符(高16位字)CANMSGCTRL4.set7222h;CAN郵箱4消息控制域寄存器CANMBX4A.set7224h;CAN郵箱4中郵箱RAM的2個字節(jié)CANMBX4B.set7225h;CAN郵箱4中郵箱RAM的2個字節(jié),CANMBX4(2.set7226h;CAN郵箱4中郵箱RAM的2個字節(jié)CANMBX4D.set7227h;CAN郵箱4中郵箱RAM的2個字節(jié)CANMSGID5L.set7228h;CAN郵箱5消息標(biāo)識符(低16位字)CANMSGID5H.set7229h;CAN郵箱5消息標(biāo)識符高16位字)CANMSGCTRL5.set722Ah;CAN郵箱5消息控制域寄存器CANMBX5A.set722Ch;CAN郵箱5中郵箱RAM的2個字節(jié)CANMBX5B.set722Dh;CAN郵箱5中郵箱RAM的2個字節(jié)CANMBX5C.set722Eh;CAN郵箱5中郵箱RAM的2個字節(jié)CANMBX5D.set722Fh;CAN郵箱5中郵箱RAM的2個字節(jié);代碼安全模塊(CSM)寄存器(數(shù)據(jù)存儲器)KEY3.set77F0h;64位KEY寄存器高16位字KEY2.set77F1h;64位KEY寄存器第3個字KEY1.set77F2h;64位KEY寄存器第2個字KEY0.set77F3h;64位KEY寄存器低16位字;代碼安全模塊(CSM)寄存器(程序存儲器)PWL3.set0040h;64位密碼第3個字PWL2.set0041h;64位密碼第2個字PWL1.set0042h;64位密碼低字PWL0.set0043h;64位密碼高字,;I/O空間映射寄存器WSGR.setFFFFh;等待狀態(tài)產(chǎn)生控制寄存器FCMR.setFF0Fh;閃爍控制模式寄存器;位測試指令的位代碼(BIT)BITl5.set0000h;位代碼15BITl4.set0001h;位代碼14BIT13.set0002h;位代碼13BIT12.set0003h;位代碼12BIT11.set0004h;位代碼11BIT10.set0005h;位代碼10BIT9.set0006h;位代碼9BIT8.set0007h;位代碼8BIT7.set0008h;位代碼7BIT6.set0009h;位代碼6BIT5.set000Ah;位代碼5BIT4.set000Bh;位代碼4BIT3.set000Ch;位代碼3B1T2.set000Dh;位代碼2BIT1.set0

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論