第四章 TMS320C54x軟件開(kāi)發(fā)_第1頁(yè)
第四章 TMS320C54x軟件開(kāi)發(fā)_第2頁(yè)
第四章 TMS320C54x軟件開(kāi)發(fā)_第3頁(yè)
第四章 TMS320C54x軟件開(kāi)發(fā)_第4頁(yè)
第四章 TMS320C54x軟件開(kāi)發(fā)_第5頁(yè)
已閱讀5頁(yè),還剩119頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、DSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用2第第4 4章章 TMS320C54xTMS320C54x的軟件開(kāi)發(fā)的軟件開(kāi)發(fā)4.1 TMS320C54x4.1 TMS320C54x軟件開(kāi)發(fā)過(guò)程軟件開(kāi)發(fā)過(guò)程 4.2 4.2 匯編語(yǔ)言程序的編寫(xiě)方法匯編語(yǔ)言程序的編寫(xiě)方法4.3 4.3 匯編偽指令和宏指令匯編偽指令和宏指令4.4 4.4 公共目標(biāo)文件格式公共目標(biāo)文件格式COFFCOFF4.5 4.5 匯編源程序的編輯、匯編和鏈接過(guò)程匯編源程序的編輯、匯編和鏈接過(guò)程4.6 4.6 匯編語(yǔ)言程序設(shè)計(jì)匯編語(yǔ)言程序設(shè)計(jì)DSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用3 C 5 4 x 歸 檔 器 宏 庫(kù) 歸 檔 器 目 標(biāo) 文 件 庫(kù)

2、H ex 格 式 轉(zhuǎn) 換 E P R O M 編 程 器 C 編 譯 器 匯 編 源 文 件 匯 編 器 C O F F 目 標(biāo) 文 件 鏈 接 器 可 執(zhí) 行 C O F F 文 件 絕 對(duì) 列 表 交 叉 引 用 列 表 助 記 符 指 令 轉(zhuǎn) 換 為 代 數(shù) 指 令 匯 編 源 文 件 建 立 可 用 庫(kù) 運(yùn) 行 支 持 庫(kù) 調(diào) 試 工 具 宏 源 文 件 C 源 文 件 DSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用4C C編譯器編譯器(C compiler)(C compiler) 匯編源程序匯編源程序匯編器匯編器(assembler)(assembler) COFF COFF目標(biāo)文件目標(biāo)文件 源

3、文件中包括匯編語(yǔ)言指令、匯編偽指令以及宏指令源文件中包括匯編語(yǔ)言指令、匯編偽指令以及宏指令。鏈接器鏈接器(linker)(linker) 可執(zhí)行的可執(zhí)行的COFFCOFF目標(biāo)模塊目標(biāo)模塊 調(diào)整對(duì)符號(hào)的引用,并解決外部引用的問(wèn)題。它也可以接調(diào)整對(duì)符號(hào)的引用,并解決外部引用的問(wèn)題。它也可以接收來(lái)自文檔管理器中的目標(biāo)文件,以及鏈接以前運(yùn)行時(shí)所生成收來(lái)自文檔管理器中的目標(biāo)文件,以及鏈接以前運(yùn)行時(shí)所生成的輸出模塊。的輸出模塊。 調(diào)試工具調(diào)試工具 C54xC54x 通過(guò)軟件仿真程序或硬件在線仿真器的調(diào)試,最后將程序通過(guò)軟件仿真程序或硬件在線仿真器的調(diào)試,最后將程序加載到用戶(hù)的應(yīng)用系統(tǒng)。加載到用戶(hù)的應(yīng)用系統(tǒng)

4、。 4.1 TMS320C54x4.1 TMS320C54x軟件開(kāi)發(fā)過(guò)程軟件開(kāi)發(fā)過(guò)程DSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用5圖中非陰影部分為任選:圖中非陰影部分為任選:歸檔器歸檔器(archiver)(archiver) 將一組文件將一組文件( (源文件或目標(biāo)文件源文件或目標(biāo)文件) )集中為集中為一個(gè)文檔文件庫(kù)。一個(gè)文檔文件庫(kù)。 助記符指令到代數(shù)式指令翻譯器助記符指令到代數(shù)式指令翻譯器(mnemonic to algebraic (mnemonic to algebraic translator utility) translator utility) 建庫(kù)工具建庫(kù)工具(library-build

5、utility) (library-build utility) 用來(lái)建立用戶(hù)自己用用來(lái)建立用戶(hù)自己用C C語(yǔ)言編寫(xiě)的支持運(yùn)行庫(kù)函數(shù)。語(yǔ)言編寫(xiě)的支持運(yùn)行庫(kù)函數(shù)。 十六進(jìn)制轉(zhuǎn)換工具十六進(jìn)制轉(zhuǎn)換工具(hex conversion utility) (hex conversion utility) 絕對(duì)地址列表器絕對(duì)地址列表器(absolute lister) (absolute lister) 交叉引用列表器交叉引用列表器(cross-reference lister) (cross-reference lister) 4.1 TMS320C54x4.1 TMS320C54x軟件開(kāi)發(fā)過(guò)程軟件開(kāi)發(fā)過(guò)

6、程DSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用64.2 4.2 匯編語(yǔ)言程序的編寫(xiě)方法匯編語(yǔ)言程序的編寫(xiě)方法4.2.1 4.2.1 匯編語(yǔ)言源程序舉例匯編語(yǔ)言源程序舉例 包含標(biāo)號(hào)區(qū)、指令區(qū)、操作數(shù)區(qū)和注釋區(qū)包含標(biāo)號(hào)區(qū)、指令區(qū)、操作數(shù)區(qū)和注釋區(qū)4 4部分部分 (參看(參看3.1 3.1 ) 指令區(qū)可以寫(xiě)助記符指令、匯編偽指令或宏指令。指令區(qū)可以寫(xiě)助記符指令、匯編偽指令或宏指令。 助記符指令一般用大寫(xiě)助記符指令一般用大寫(xiě); ; 匯編偽指令和宏指令,以匯編偽指令和宏指令,以“. .”號(hào)開(kāi)始,且為小寫(xiě)。號(hào)開(kāi)始,且為小寫(xiě)。DSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用7 .title “example.asm” ;用雙引號(hào)括起的

7、源程序名用雙引號(hào)括起的源程序名 .mmregs ;定義存儲(chǔ)器映射寄存器的替代符號(hào);定義存儲(chǔ)器映射寄存器的替代符號(hào) STACK.usect “STACK”, 10H ;在數(shù)據(jù)存儲(chǔ)器中留出在數(shù)據(jù)存儲(chǔ)器中留出16個(gè)單元作為個(gè)單元作為 ; 堆棧區(qū),名為堆棧區(qū),名為STACK .bss a, 4 .bss x, 4 ;在數(shù)據(jù)存儲(chǔ)器中空出;在數(shù)據(jù)存儲(chǔ)器中空出4個(gè)存儲(chǔ)單元存放個(gè)存儲(chǔ)單元存放 ;變量變量x1,x2,x3和和x4. .bss y, 1 .def start ;在此模塊中定義,可為別的模塊引用;在此模塊中定義,可為別的模塊引用 .data ;緊跟其后的是已初始化數(shù)據(jù);緊跟其后的是已初始化數(shù)據(jù) ta

8、ble: .word 1, 2, 3, 4 ;在程序存儲(chǔ)器標(biāo)號(hào)為在程序存儲(chǔ)器標(biāo)號(hào)為table開(kāi)始的開(kāi)始的8個(gè)單個(gè)單 【例例4.14.1】 匯編語(yǔ)言程序編寫(xiě)方法舉例匯編語(yǔ)言程序編寫(xiě)方法舉例 iiixay41DSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用8 .word 8, 6, 4, 2 ;元存放初始化數(shù)據(jù) .text ;緊跟其后的是匯編語(yǔ)言程序正文 start: STM #0, SWWSR ;adds no wait statesSTM #STACK+10H,SP ;set stack pointer STM #a, AR1 ;AR1 point to aRPT #7 ;move 8 valuesMVPD

9、table, *AR1+ ;from program memory into ; data memoryCALL SUM ;call SUM subroutine end: B end【例例4.14.1】 匯編語(yǔ)言程序編寫(xiě)方法舉例匯編語(yǔ)言程序編寫(xiě)方法舉例 DSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用9SUM: STM #a, AR3 ;The subroutine implementSTM #x, AR4 ;multiply accumulateRPTZ A, #3MAC *AR3+, *AR4+, ASTL A, yRET .end ;結(jié)束匯編,匯編器將忽略 ;此后的任何源 語(yǔ)句 【例例4.14.1】

10、匯編語(yǔ)言程序編寫(xiě)方法舉例匯編語(yǔ)言程序編寫(xiě)方法舉例 DSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用10C54x匯編器支持匯編器支持7種類(lèi)型的常量:種類(lèi)型的常量:二進(jìn)制整數(shù)二進(jìn)制整數(shù):最多由最多由16個(gè)二進(jìn)制數(shù)字組成,其后綴為個(gè)二進(jìn)制數(shù)字組成,其后綴為B(或或b) .八進(jìn)制整數(shù)八進(jìn)制整數(shù):最多由最多由6個(gè)八進(jìn)制數(shù)字組成,其后綴為個(gè)八進(jìn)制數(shù)字組成,其后綴為Q(或或q)。 十進(jìn)制整數(shù)十進(jìn)制整數(shù):由十進(jìn)制數(shù)字串組成由十進(jìn)制數(shù)字串組成 范圍從范圍從3276832767或或065535 十六進(jìn)制整數(shù)十六進(jìn)制整數(shù): 最多由最多由4個(gè)十六進(jìn)制數(shù)字組成,包括個(gè)十六進(jìn)制數(shù)字組成,包括09和字符和字符AF及及af; 必須由十進(jìn)制值

11、必須由十進(jìn)制值09開(kāi)始開(kāi)始; 其后綴為其后綴為H(或或h),也可以由前綴也可以由前綴(0 x)標(biāo)明。標(biāo)明。 如如: 78h、0Fh、 37Ach、0 x37AC 4.2.2 4.2.2 匯編語(yǔ)言常量匯編語(yǔ)言常量4.2 4.2 匯編語(yǔ)言程序的編寫(xiě)方法匯編語(yǔ)言程序的編寫(xiě)方法( (匯編語(yǔ)言常量匯編語(yǔ)言常量) )DSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用115.浮點(diǎn)數(shù)常量浮點(diǎn)數(shù)常量:由整數(shù)、小數(shù)點(diǎn)、小數(shù)部分和指數(shù)部分組成由整數(shù)、小數(shù)點(diǎn)、小數(shù)部分和指數(shù)部分組成 +(-)nnn.nnnE(e)+(-)nnn 整數(shù)整數(shù) 小數(shù)小數(shù) 指數(shù)指數(shù) 有效的浮點(diǎn)數(shù)常量有效的浮點(diǎn)數(shù)常量: 3.0、3.14、-0.314e13、+3

12、14.59e-26.字符常量字符常量:由單引號(hào)括住的一個(gè)或兩個(gè)字符組成。它在機(jī)器內(nèi)部由由單引號(hào)括住的一個(gè)或兩個(gè)字符組成。它在機(jī)器內(nèi)部由8位位ASCII碼來(lái)表示一個(gè)字符。碼來(lái)表示一個(gè)字符。有效的字符常量:有效的字符常量:a(內(nèi)部表示為內(nèi)部表示為61h), 為為D(內(nèi)部表示為內(nèi)部表示為2744h) 7.匯編時(shí)常量匯編時(shí)常量:用用.set偽指令給一個(gè)符號(hào)賦值。偽指令給一個(gè)符號(hào)賦值。 例如:例如: shift .set 3 ; 將常數(shù)值將常數(shù)值3賦給符號(hào)賦給符號(hào)shift LD #shift, A ; 再將再將3賦給賦給A累加器累加器 匯編器在內(nèi)部把常量作為匯編器在內(nèi)部把常量作為32位量。常量不能進(jìn)行

13、符號(hào)擴(kuò)展。位量。常量不能進(jìn)行符號(hào)擴(kuò)展。4.2 4.2 匯編語(yǔ)言程序的編寫(xiě)方法匯編語(yǔ)言程序的編寫(xiě)方法( (匯編語(yǔ)言常量匯編語(yǔ)言常量) )DSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用124.2.3 4.2.3 匯編源程序中的字符串匯編源程序中的字符串 字符串字符串(character strings)(character strings)是包括在雙引號(hào)內(nèi)的一串字符。是包括在雙引號(hào)內(nèi)的一串字符。 字符串的最大長(zhǎng)度是變化的,由要求字符串的偽指令所規(guī)定。字符串的最大長(zhǎng)度是變化的,由要求字符串的偽指令所規(guī)定。每個(gè)字符在內(nèi)部用每個(gè)字符在內(nèi)部用8 8位位ASCIIASCII碼表示。碼表示。 以下是字符串的例子:以下是字符

14、串的例子:“sample programsample program”定義了一個(gè)長(zhǎng)度為定義了一個(gè)長(zhǎng)度為1414的字符串:的字符串:sample sample progranprogran;“PLANPLAN“C C”定義了一個(gè)長(zhǎng)度為定義了一個(gè)長(zhǎng)度為7 7的字符串:的字符串:PLANPLAN“C C”。 4.2 4.2 匯編語(yǔ)言程序的編寫(xiě)方法匯編語(yǔ)言程序的編寫(xiě)方法( (字符串字符串) )DSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用134.2.4 4.2.4 匯編源程序中的符號(hào)匯編源程序中的符號(hào) 符號(hào)符號(hào)可用于標(biāo)號(hào)、常量和替代其他字符??捎糜跇?biāo)號(hào)、常量和替代其他字符。 符號(hào)名符號(hào)名最多可為最多可為3232位字

15、符數(shù)字串位字符數(shù)字串(A(AZ Z、a az z、0 09 9、_ _和和$)$),第一位不能是數(shù)字,字符間不能有空格;第一位不能是數(shù)字,字符間不能有空格; 符號(hào)對(duì)大小寫(xiě)敏感符號(hào)對(duì)大小寫(xiě)敏感,如匯編器將,如匯編器將ABCABC、AbcAbc、abcabc認(rèn)作不同的符認(rèn)作不同的符號(hào),用號(hào),用-c-c選項(xiàng)可以使匯編器不區(qū)分大小寫(xiě);選項(xiàng)可以使匯編器不區(qū)分大小寫(xiě); 符號(hào)只有在匯編程序中定義后才有效符號(hào)只有在匯編程序中定義后才有效,除非使用,除非使用.global.global偽指?jìng)沃噶盥暶鞑攀且粋€(gè)外部符號(hào)。令聲明才是一個(gè)外部符號(hào)。 DSPDSP內(nèi)部的內(nèi)部的寄存器名和寄存器名和$ $等都是匯編器已預(yù)先定

16、義的全局符號(hào)。等都是匯編器已預(yù)先定義的全局符號(hào)。 4.2 4.2 匯編語(yǔ)言程序的編寫(xiě)方法匯編語(yǔ)言程序的編寫(xiě)方法( (符號(hào)符號(hào)) )DSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用144.2.5 4.2.5 匯編源程序中的表達(dá)式匯編源程序中的表達(dá)式 表達(dá)式是由運(yùn)算符隔開(kāi)的常量、符號(hào)或常量和符號(hào)序列。表達(dá)式是由運(yùn)算符隔開(kāi)的常量、符號(hào)或常量和符號(hào)序列。 表達(dá)式值的有效范圍從表達(dá)式值的有效范圍從32768327683276732767。表達(dá)式運(yùn)算符及優(yōu)先級(jí)表達(dá)式運(yùn)算符及優(yōu)先級(jí):表:表4-14-12. 2. 表達(dá)式溢出表達(dá)式溢出 當(dāng)算術(shù)運(yùn)算在匯編中被執(zhí)行時(shí),匯編器將檢查溢出狀態(tài)。當(dāng)算術(shù)運(yùn)算在匯編中被執(zhí)行時(shí),匯編器將檢查

17、溢出狀態(tài)。但在作乘法時(shí),不檢查溢出狀態(tài)。但在作乘法時(shí),不檢查溢出狀態(tài)。3. 3. 表達(dá)式的合法性表達(dá)式的合法性 由于符號(hào)的屬性不同由于符號(hào)的屬性不同( (定義不同定義不同) )使表達(dá)式存在合法性問(wèn)題。使表達(dá)式存在合法性問(wèn)題。 符號(hào)的屬性分為符號(hào)的屬性分為3 3種:種:外部的、可重定位的和絕對(duì)的外部的、可重定位的和絕對(duì)的。 含有乘、除法的表達(dá)式中只能使用絕對(duì)符號(hào)。含有乘、除法的表達(dá)式中只能使用絕對(duì)符號(hào)。4.2 4.2 匯編語(yǔ)言程序的編寫(xiě)方法(匯編語(yǔ)言程序的編寫(xiě)方法(表達(dá)式表達(dá)式)DSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用154.3.1 4.3.1 匯編偽指令匯編偽指令( (又稱(chēng)為匯編命令又稱(chēng)為匯編命令)

18、)作用:作用:給程序提供數(shù)據(jù)并且控制匯編過(guò)程。給程序提供數(shù)據(jù)并且控制匯編過(guò)程。表示:表示:指令區(qū)以指令區(qū)以“. .”號(hào)開(kāi)始且為小寫(xiě)的為匯編偽指令。號(hào)開(kāi)始且為小寫(xiě)的為匯編偽指令。指令數(shù)目:指令數(shù)目:C54xC54x匯編器共有匯編器共有6464條條匯編偽指令。匯編偽指令。 匯編偽指令用以形成常數(shù)和變量,當(dāng)用它控制匯編和鏈接匯編偽指令用以形成常數(shù)和變量,當(dāng)用它控制匯編和鏈接過(guò)程時(shí),可以不占存儲(chǔ)空間。過(guò)程時(shí),可以不占存儲(chǔ)空間。 4.3 4.3 匯編偽指令和宏指令匯編偽指令和宏指令DSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用16匯編偽指令分成匯編偽指令分成8 8類(lèi)類(lèi)( (根據(jù)功能根據(jù)功能) ):對(duì)各種段進(jìn)行定義的偽

19、指令;對(duì)各種段進(jìn)行定義的偽指令;對(duì)常數(shù)對(duì)常數(shù)( (數(shù)據(jù)和存儲(chǔ)器數(shù)據(jù)和存儲(chǔ)器) )進(jìn)行初始化的偽指令;進(jìn)行初始化的偽指令;調(diào)整調(diào)整SPC(SPC(段寄存器段寄存器) )的指令;的指令;輸出列表文件格式偽指令;輸出列表文件格式偽指令;引用其他文件的偽指令;引用其他文件的偽指令;控制條件匯編的偽指令;控制條件匯編的偽指令;在匯編時(shí)定義符號(hào)的偽指令;在匯編時(shí)定義符號(hào)的偽指令;1.1.執(zhí)行其他功能的偽指令。執(zhí)行其他功能的偽指令。4.3.1 4.3.1 匯編偽指令匯編偽指令( (又稱(chēng)為匯編命令又稱(chēng)為匯編命令) )DSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用171. 1. 段定義偽指令(段定義偽指令(5 5條)條) 作

20、用:作用:把匯編語(yǔ)言程序的各個(gè)部分劃分在適當(dāng)?shù)亩沃小0褏R編語(yǔ)言程序的各個(gè)部分劃分在適當(dāng)?shù)亩沃小?.bss 為未初始化的變量保留空間;為未初始化的變量保留空間; .data 通常包含了初始化的數(shù)據(jù);通常包含了初始化的數(shù)據(jù); .sect 定義已初始化的帶命名段,其后的數(shù)據(jù)存入該段;定義已初始化的帶命名段,其后的數(shù)據(jù)存入該段; .text 該段包含了可執(zhí)行的代碼;該段包含了可執(zhí)行的代碼; .usect 在一個(gè)未初始化的有命名的段中為變量保留空間。在一個(gè)未初始化的有命名的段中為變量保留空間。 段是通過(guò)疊加方式來(lái)建立的。段是通過(guò)疊加方式來(lái)建立的。例如在匯編器第一次遇到例如在匯編器第一次遇到.data偽指

21、令時(shí),偽指令時(shí),data指令后面的語(yǔ)句都被匯編在指令后面的語(yǔ)句都被匯編在.data段中段中(直到匯編器遇到直到匯編器遇到.text和和.sect偽指令為偽指令為止止)。如果后來(lái)又在其他的段中遇到。如果后來(lái)又在其他的段中遇到.data指令,其后的語(yǔ)句繼續(xù)加到指令,其后的語(yǔ)句繼續(xù)加到.data段中。段中。這樣雖然程序中是多個(gè)這樣雖然程序中是多個(gè).data段分散在各處,但匯編器只創(chuàng)建一個(gè)段分散在各處,但匯編器只創(chuàng)建一個(gè).data段,它段,它可以連續(xù)地被分配到內(nèi)存中??梢赃B續(xù)地被分配到內(nèi)存中。4.3.1 4.3.1 匯編偽指令匯編偽指令( (段定義偽指令段定義偽指令) )DSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)

22、用182. 2. 常數(shù)初始化偽指令(共有常數(shù)初始化偽指令(共有2424條)條) .和和.word.word 把一個(gè)或多個(gè)把一個(gè)或多個(gè)1616位數(shù)存放到當(dāng)前段的連續(xù)字位數(shù)存放到當(dāng)前段的連續(xù)字中。中。.為無(wú)符號(hào)整型量,為無(wú)符號(hào)整型量,.word.word為帶符號(hào)整型量。為帶符號(hào)整型量。 .byte.byte 把一個(gè)或多個(gè)把一個(gè)或多個(gè)8 8位的值放入當(dāng)前段的連續(xù)字中。該指令類(lèi)似位的值放入當(dāng)前段的連續(xù)字中。該指令類(lèi)似于于.word.word,不同之處在于,不同之處在于.word.word中的每個(gè)值的寬度限制為中的每個(gè)值的寬度限制為1616位。位。 .float.float和

23、和.xfloat.xfloat 計(jì)算以計(jì)算以IEEEIEEE格式表示的單精度格式表示的單精度(32(32位位) )浮點(diǎn)數(shù),并存浮點(diǎn)數(shù),并存放在當(dāng)前段的連續(xù)字中,高位先存。放在當(dāng)前段的連續(xù)字中,高位先存。.float.float能自動(dòng)按域的邊界排能自動(dòng)按域的邊界排列,列,.xfloat.xfloat不能。不能。 .long.long和和.xlong.xlong 把把3232位數(shù)存放到當(dāng)前段連續(xù)的兩個(gè)字中,高位字先位數(shù)存放到當(dāng)前段連續(xù)的兩個(gè)字中,高位字先存。存。.long.long能自動(dòng)按長(zhǎng)字的邊界排列,能自動(dòng)按長(zhǎng)字的邊界排列,.xlong .xlong 卻不能。卻不能。 .string.stri

24、ng和和.pstring.pstring 把把8 8位的字符從一個(gè)或多個(gè)字符串中傳送到當(dāng)前位的字符從一個(gè)或多個(gè)字符串中傳送到當(dāng)前段中。段中。 4.3.1 4.3.1 匯編偽指令匯編偽指令( (常數(shù)初始化偽指令常數(shù)初始化偽指令) )DSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用19 1000000aa .byte 0AAh, 0BBh 000100bb 200020ccc .word 0CCCh 300030eee .xlong 0EEEEFFFh 0004efff 40006eeee .long 0EEEEFFFFh 0007ffff 50008dddd .int 0DDDDh 600093fff .xfl

25、oat 1.99999 1000a ffac 7000c 3fff .float 1.99999 1000d ffac 8000e 0068 .string “help” 1000f 0065 10010 006c 100110070【例4.2】DSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用203. 3. 段程序計(jì)數(shù)器段程序計(jì)數(shù)器(SPC)(SPC)定位指令定位指令 .align.align 使使SPCSPC對(duì)準(zhǔn)對(duì)準(zhǔn)1 1字字(16(16位位) )128128字的邊界,這保證了字的邊界,這保證了緊接著該指令的代碼從一個(gè)整字或頁(yè)的邊界開(kāi)始。如果緊接著該指令的代碼從一個(gè)整字或頁(yè)的邊界開(kāi)始。如果SPCSPC已已經(jīng)

26、定位于選定的邊界,它就不會(huì)增加了。經(jīng)定位于選定的邊界,它就不會(huì)增加了。.align.align偽指令的操偽指令的操作數(shù)必須等于作數(shù)必須等于2 20 02 21616之間的一個(gè)之間的一個(gè)2 2的冪值的冪值( (盡管超過(guò)盡管超過(guò)2 27 7的值沒(méi)的值沒(méi)有意義有意義) )。不同的操作數(shù)代表了不同的邊界定位要求。不同的操作數(shù)代表了不同的邊界定位要求。 操作數(shù)為操作數(shù)為1 1是讓是讓SPCSPC對(duì)準(zhǔn)字邊界;對(duì)準(zhǔn)字邊界; 操作數(shù)為操作數(shù)為2 2是讓是讓SPCSPC對(duì)準(zhǔn)長(zhǎng)字對(duì)準(zhǔn)長(zhǎng)字( (偶地址偶地址) )邊界;邊界; 操作數(shù)為操作數(shù)為128128是讓是讓SPCSPC對(duì)準(zhǔn)頁(yè)邊界;對(duì)準(zhǔn)頁(yè)邊界; 不帶操作數(shù)時(shí),其

27、默認(rèn)值為不帶操作數(shù)時(shí),其默認(rèn)值為128128,即對(duì)準(zhǔn)頁(yè)邊界。,即對(duì)準(zhǔn)頁(yè)邊界。4.3.1 4.3.1 匯編偽指令匯編偽指令( (SPC)(SPC)定位指令定位指令) )DSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用214. 4. 輸出列表格式偽指令輸出列表格式偽指令 .title.title 為匯編器提供一個(gè)打印在每一頁(yè)頂部的標(biāo)題。為匯編器提供一個(gè)打印在每一頁(yè)頂部的標(biāo)題。 .list/.nolist.list/.nolist 打開(kāi)打開(kāi)/ /關(guān)閉列表文件。使用關(guān)閉列表文件。使用.nolist.nolist可禁可禁止匯編器列出列表文件中選定的源語(yǔ)句,使用止匯編器列出列表文件中選定的源語(yǔ)句,使用.list.list

28、則允許列表。則允許列表。 .mlist/.mnolist.mlist/.mnolist 源代碼中包含著宏擴(kuò)展和循環(huán)塊的列源代碼中包含著宏擴(kuò)展和循環(huán)塊的列表。這兩條指令用來(lái)打開(kāi)表。這兩條指令用來(lái)打開(kāi)/ /關(guān)閉列表。使用關(guān)閉列表。使用.mlist.mlist把所有的宏擴(kuò)把所有的宏擴(kuò)展和循環(huán)塊打印到列表中,用展和循環(huán)塊打印到列表中,用.mnolist.mnolist則禁止列入列表。則禁止列入列表。 .sslist/.ssnolist.sslist/.ssnolist 分別允許分別允許/ /禁止替換符號(hào)擴(kuò)展到列表,禁止替換符號(hào)擴(kuò)展到列表,在調(diào)試替換符號(hào)的擴(kuò)展時(shí)很有用。在調(diào)試替換符號(hào)的擴(kuò)展時(shí)很有用。 .

29、page.page 在輸出列表中產(chǎn)生新的一頁(yè)。在輸出列表中產(chǎn)生新的一頁(yè)。 .option.option 控制列表文件中的某些特性??刂屏斜砦募械哪承┨匦浴?.3.1 4.3.1 匯編偽指令匯編偽指令( (輸出列表格式輸出列表格式) )DSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用225. 5. 引用其他文件的偽指令引用其他文件的偽指令 .def.def 確認(rèn)一個(gè)在當(dāng)前模塊中定義的且能被其他模塊使用的確認(rèn)一個(gè)在當(dāng)前模塊中定義的且能被其他模塊使用的符號(hào),匯編器把這個(gè)符號(hào)存入符號(hào)表中。符號(hào),匯編器把這個(gè)符號(hào)存入符號(hào)表中。 .ref.ref 確認(rèn)一個(gè)在當(dāng)前模塊中使用但在其他段中定義的符號(hào)。確認(rèn)一個(gè)在當(dāng)前模塊中使用

30、但在其他段中定義的符號(hào)。匯編器把這個(gè)符號(hào)標(biāo)注成一個(gè)未定義的外部符號(hào),且把它裝入目匯編器把這個(gè)符號(hào)標(biāo)注成一個(gè)未定義的外部符號(hào),且把它裝入目標(biāo)符號(hào)表中,以便鏈接器能還原它的定義。標(biāo)符號(hào)表中,以便鏈接器能還原它的定義。 .global.global 表明一個(gè)外部符號(hào),使其他模塊在連接時(shí)可以使用。表明一個(gè)外部符號(hào),使其他模塊在連接時(shí)可以使用。如果在當(dāng)前段定義了該符號(hào),那么該符號(hào)就可以被其他模塊使用,如果在當(dāng)前段定義了該符號(hào),那么該符號(hào)就可以被其他模塊使用,與與.def.def功能相同;如果在當(dāng)前段沒(méi)有定義該符號(hào),則使用了其他功能相同;如果在當(dāng)前段沒(méi)有定義該符號(hào),則使用了其他模塊定義的符號(hào),與模塊定義的

31、符號(hào),與.ref.ref功能相同。一個(gè)未定義的全局符號(hào)只有功能相同。一個(gè)未定義的全局符號(hào)只有當(dāng)它在程序中使用的時(shí)候,鏈接器才對(duì)其進(jìn)行處理。當(dāng)它在程序中使用的時(shí)候,鏈接器才對(duì)其進(jìn)行處理。4.3.1 4.3.1 匯編偽指令匯編偽指令( (引用其他文件引用其他文件) )DSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用23 .copy/.include.copy/.include 偽指令告訴匯編器開(kāi)始從其他文件中讀偽指令告訴匯編器開(kāi)始從其他文件中讀源語(yǔ)句。當(dāng)匯編讀完以后,繼續(xù)從當(dāng)前文件中讀源語(yǔ)句。源語(yǔ)句。當(dāng)匯編讀完以后,繼續(xù)從當(dāng)前文件中讀源語(yǔ)句。從從.copy.copy文件中讀的語(yǔ)句會(huì)打印在列表中,而從文件中讀的語(yǔ)句

32、會(huì)打印在列表中,而從.include.include文件文件中讀的語(yǔ)句不會(huì)打印在列表中。中讀的語(yǔ)句不會(huì)打印在列表中。 .mlib.mlib 向匯編器提供一個(gè)包含了宏定義的文檔庫(kù)的名稱(chēng)。向匯編器提供一個(gè)包含了宏定義的文檔庫(kù)的名稱(chēng)。當(dāng)匯編器見(jiàn)到一個(gè)在當(dāng)前庫(kù)中沒(méi)有定義的宏,就在當(dāng)匯編器見(jiàn)到一個(gè)在當(dāng)前庫(kù)中沒(méi)有定義的宏,就在.mlib.mlib確認(rèn)確認(rèn)的宏庫(kù)中查找。的宏庫(kù)中查找。 4.3.1 4.3.1 匯編偽指令匯編偽指令( (又稱(chēng)為匯編命令又稱(chēng)為匯編命令) )DSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用246. 6. 控制條件匯編的偽指令控制條件匯編的偽指令 .if/.elseif/.else/.endif.i

33、f/.elseif/.else/.endif 這些指令告訴匯編器,根據(jù)這些指令告訴匯編器,根據(jù)表達(dá)式的值條件匯編一塊代碼。表達(dá)式的值條件匯編一塊代碼。.if .if 表示一個(gè)條件塊的開(kāi)始,表示一個(gè)條件塊的開(kāi)始,如果條件為真就匯編緊接著的代碼;如果條件為真就匯編緊接著的代碼;.elseif.elseif是表示如果是表示如果.if.if的條件為假,而的條件為假,而.elseif.elseif的條件為真,就匯編緊接著的代的條件為真,就匯編緊接著的代碼;碼;.endif.endif結(jié)束該條件塊。結(jié)束該條件塊。 .loop/.break/.endloop.loop/.break/.endloop 告訴匯

34、編器按照表達(dá)式的值循告訴匯編器按照表達(dá)式的值循環(huán)匯編一塊代碼。環(huán)匯編一塊代碼。.loop.loop標(biāo)注一塊循環(huán)代碼的開(kāi)始;標(biāo)注一塊循環(huán)代碼的開(kāi)始;.break.break告告訴匯編器當(dāng)表達(dá)式為假時(shí),繼續(xù)循環(huán)匯編,當(dāng)表達(dá)式為真時(shí),訴匯編器當(dāng)表達(dá)式為假時(shí),繼續(xù)循環(huán)匯編,當(dāng)表達(dá)式為真時(shí),立刻轉(zhuǎn)到立刻轉(zhuǎn)到.endloop.endloop后的代碼去執(zhí)行;后的代碼去執(zhí)行;.endloop.endloop標(biāo)注一個(gè)可循標(biāo)注一個(gè)可循環(huán)塊的末尾。環(huán)塊的末尾。 4.3.1 4.3.1 匯編偽指令匯編偽指令( (控制條件匯編控制條件匯編) )DSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用257. 7. 在匯編時(shí)定義符號(hào)的偽指令在匯

35、編時(shí)定義符號(hào)的偽指令作用:作用:匯編時(shí)的定義符號(hào)指令是使有意義的符號(hào)名與常數(shù)值或匯編時(shí)的定義符號(hào)指令是使有意義的符號(hào)名與常數(shù)值或字符串相等同。字符串相等同。 .asg.asg 規(guī)定一個(gè)字符串與一個(gè)替代符號(hào)相等,并將其存放規(guī)定一個(gè)字符串與一個(gè)替代符號(hào)相等,并將其存放在替代符號(hào)表中。當(dāng)匯編器遇到一個(gè)替代符號(hào),就用對(duì)應(yīng)的字在替代符號(hào)表中。當(dāng)匯編器遇到一個(gè)替代符號(hào),就用對(duì)應(yīng)的字符串來(lái)代替這個(gè)符號(hào)。替代符號(hào)可以重新定義。符串來(lái)代替這個(gè)符號(hào)。替代符號(hào)可以重新定義。 .eval.eval 計(jì)算一個(gè)表達(dá)式的值并把結(jié)果傳送到與一個(gè)替代計(jì)算一個(gè)表達(dá)式的值并把結(jié)果傳送到與一個(gè)替代符號(hào)等同的字符串中。該指令在處理計(jì)數(shù)

36、器時(shí)非常有用。符號(hào)等同的字符串中。該指令在處理計(jì)數(shù)器時(shí)非常有用。 .label.label 定義一個(gè)專(zhuān)門(mén)的符號(hào)以表示當(dāng)前段內(nèi)裝入時(shí)的地定義一個(gè)專(zhuān)門(mén)的符號(hào)以表示當(dāng)前段內(nèi)裝入時(shí)的地址,而不是運(yùn)行時(shí)的地址。址,而不是運(yùn)行時(shí)的地址。 .set/.equ.set/.equ 把一個(gè)常數(shù)值等效成一個(gè)符號(hào),存放在符號(hào)把一個(gè)常數(shù)值等效成一個(gè)符號(hào),存放在符號(hào)表中,且不能被清除。表中,且不能被清除。4.3.1 4.3.1 匯編偽指令匯編偽指令( (在匯編時(shí)定義符號(hào)在匯編時(shí)定義符號(hào)) )DSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用268. 其他方面的匯編偽指令其他方面的匯編偽指令 .end 結(jié)束匯編。它是一個(gè)程序的最后一個(gè)源語(yǔ)句

37、。結(jié)束匯編。它是一個(gè)程序的最后一個(gè)源語(yǔ)句。 .mmregs 定義存儲(chǔ)器映射寄存器的替代符號(hào)。對(duì)于所有的定義存儲(chǔ)器映射寄存器的替代符號(hào)。對(duì)于所有的存儲(chǔ)器映射寄存器,使用該指令和執(zhí)行一個(gè)存儲(chǔ)器映射寄存器,使用該指令和執(zhí)行一個(gè).set是一樣的。是一樣的。 .algebraic 告訴編譯器程序包含了算術(shù)匯編源代碼。如果沒(méi)告訴編譯器程序包含了算術(shù)匯編源代碼。如果沒(méi)有使用有使用-mg編譯器選項(xiàng),該指令必須出現(xiàn)在文件的第一行。編譯器選項(xiàng),該指令必須出現(xiàn)在文件的第一行。 .netblock 使局部標(biāo)號(hào)復(fù)位。局部標(biāo)號(hào)是使局部標(biāo)號(hào)復(fù)位。局部標(biāo)號(hào)是$n或或name?形式的形式的符號(hào)。當(dāng)它們出現(xiàn)在標(biāo)號(hào)域中時(shí),就對(duì)它們

38、進(jìn)行定義。局部標(biāo)符號(hào)。當(dāng)它們出現(xiàn)在標(biāo)號(hào)域中時(shí),就對(duì)它們進(jìn)行定義。局部標(biāo)號(hào)是可以用來(lái)作為號(hào)是可以用來(lái)作為jump指令操作數(shù)的臨時(shí)標(biāo)號(hào)。指令操作數(shù)的臨時(shí)標(biāo)號(hào)。.netblock在局在局部標(biāo)號(hào)使用后對(duì)其復(fù)位,從而限制它的范圍。部標(biāo)號(hào)使用后對(duì)其復(fù)位,從而限制它的范圍。 .version 決定指令所運(yùn)行的處理器。每一種決定指令所運(yùn)行的處理器。每一種C54x芯片都有芯片都有自己的值。自己的值。 4.3.1 4.3.1 匯編偽指令匯編偽指令( (其他方面其他方面) )DSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用27實(shí)現(xiàn)一實(shí)現(xiàn)一8 8位位LEDLED燈由左到右循環(huán)閃爍燈由左到右循環(huán)閃爍 .title bubble.asm

39、 .title bubble.asm“ .mmregs .mmregs;將存儲(chǔ)映像寄存器導(dǎo)入列表;將存儲(chǔ)映像寄存器導(dǎo)入列表STACKSTACK .usect .usectSTACK,5hSTACK,5h;給堆棧段分配空間;給堆棧段分配空間 .bss.bss y,1y,1 .def .def startstart .data .dataPA0PA0 .set .set 0 0DSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用28.text.textstart:STMstart:STM#7000,SWWSR#7000,SWWSR ;設(shè)等待位;設(shè)等待位 STM #2,AR3STM #2,AR3;將輔助寄存器;將輔助寄

40、存器AR3AR3設(shè)為設(shè)為2 2 (乘(乘2 2,實(shí)現(xiàn),實(shí)現(xiàn)左移)左移) STMSTM#6,AR1#6,AR1;將輔助寄存器;將輔助寄存器AR1AR1設(shè)為設(shè)為6 6 (左移(左移7 7次)次)STMSTM#3,AR2#3,AR2;將輔助寄存器;將輔助寄存器AR2AR2設(shè)為設(shè)為3 3 (循環(huán)執(zhí)行(循環(huán)執(zhí)行4 4次)次) LDLDAR3,TAR3,T ;將;將T T(乘法寄存器)設(shè)為(乘法寄存器)設(shè)為2 2DSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用29loop1:LDloop1:LD#1,A #1,A ;A A寄存器值為寄存器值為1 1 STLSTLA,yA,y;y y1 1 PORTWPORTW y,PA0

41、y,PA0;輸出;輸出y y地址內(nèi)的值到輸出口地址內(nèi)的值到輸出口 STMSTM#10000,AR4#10000,AR4;將輔助寄存器;將輔助寄存器AR4AR4設(shè)為設(shè)為1000010000loop2: RPTloop2: RPT#10000 #10000 ;重復(fù)執(zhí)行下一指令;重復(fù)執(zhí)行下一指令10000100001 1次次NOPNOP;等待;等待 BANZBANZloop3,loop3,* *AR4-AR4-;循環(huán);循環(huán)AR4AR4值值10000100001 1次次DSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用30loop3:MPYloop3:MPYy,Ay,A;將;將y yT T,其值存入,其值存入A A寄存

42、器寄存器STLSTLA,yA,y;將;將A A的值存入的值存入y y地址中地址中PORTWPORTW y,PA0y,PA0;輸出;輸出y y地址值到輸出口地址值到輸出口STMSTM#10000,AR5#10000,AR5;將輔助寄存器;將輔助寄存器AR5AR5設(shè)為設(shè)為1000010000loop4:loop4:RPTRPT#10000#10000;實(shí)現(xiàn)第;實(shí)現(xiàn)第8 8個(gè)燈跳轉(zhuǎn)到第個(gè)燈跳轉(zhuǎn)到第1 1個(gè)燈時(shí)的時(shí)間延遲個(gè)燈時(shí)的時(shí)間延遲NOPNOPBANZBANZloop4,loop4,* *AR5-AR5-BANZBANZloop2,loop2,* *AR1-AR1-BANZBANZloop1,lo

43、op1,* *AR2-AR2-end:end:B Bendend.end.endDSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用31作用作用 程序中的子程序往往要多次使用,此時(shí),程序中的子程序往往要多次使用,此時(shí),可將該子程序定義為一個(gè)宏。在程序反復(fù)執(zhí)行可將該子程序定義為一個(gè)宏。在程序反復(fù)執(zhí)行該子程序時(shí)就調(diào)用這個(gè)宏,從而避免多次重復(fù)該子程序時(shí)就調(diào)用這個(gè)宏,從而避免多次重復(fù)使用該子程序的源語(yǔ)句。使用該子程序的源語(yǔ)句。 4.3.2 4.3.2 宏及宏的使用宏及宏的使用DSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用32宏語(yǔ)言的功能包括:宏語(yǔ)言的功能包括:l定義自己的宏和重新定義已存在的宏;定義自己的宏和重新定義已存在的宏;l簡(jiǎn)化

44、較長(zhǎng)的或復(fù)雜的匯編代碼;簡(jiǎn)化較長(zhǎng)的或復(fù)雜的匯編代碼;l訪問(wèn)歸檔器創(chuàng)建的宏庫(kù);訪問(wèn)歸檔器創(chuàng)建的宏庫(kù);l處理一個(gè)宏中的字符串;處理一個(gè)宏中的字符串; l控制宏擴(kuò)展列表??刂坪陻U(kuò)展列表。如果想多次調(diào)用一個(gè)宏,而每次使用的是如果想多次調(diào)用一個(gè)宏,而每次使用的是不同的參數(shù)不同的參數(shù),可以在宏里指定參數(shù)??梢栽诤昀镏付▍?shù)。宏的使用可分為宏的使用可分為3 3個(gè)過(guò)程:個(gè)過(guò)程:定義宏、調(diào)用宏和展開(kāi)宏定義宏、調(diào)用宏和展開(kāi)宏。4.3.2 4.3.2 宏及宏的使用宏及宏的使用DSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用331. 1. 定義宏:定義宏:有兩種方法有兩種方法(1) (1) 宏可以在源文件起始處或者在宏可以在源文件起

45、始處或者在.include/.copy.include/.copy文件文件中定義。中定義。 格式格式: : 宏名宏名 .macro.macro參數(shù)參數(shù)11, , 參數(shù)參數(shù)nn 匯編語(yǔ)句或宏指令匯編語(yǔ)句或宏指令 .mexit.mexit .endm .endm4.3.2 4.3.2 宏及宏的使用(宏及宏的使用(定義宏定義宏)DSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用34宏名宏名定義的宏名如果與某條指令或已有的宏定義重名,就將定義的宏名如果與某條指令或已有的宏定義重名,就將代替它們;代替它們;匯編語(yǔ)句匯編語(yǔ)句每次調(diào)用宏時(shí)執(zhí)行的匯編語(yǔ)言指令或匯編偽指令;每次調(diào)用宏時(shí)執(zhí)行的匯編語(yǔ)言指令或匯編偽指令;宏指令宏指令

46、用來(lái)控制展開(kāi)宏;用來(lái)控制展開(kāi)宏;.mexit.mexit功能類(lèi)似于功能類(lèi)似于goto .endmgoto .endm語(yǔ)句,該項(xiàng)為可選項(xiàng);語(yǔ)句,該項(xiàng)為可選項(xiàng);.endm.endm結(jié)束宏定義;結(jié)束宏定義;注釋注釋注釋前加一感嘆號(hào)注釋前加一感嘆號(hào)“!”,表示該注釋包括在宏定義中,表示該注釋包括在宏定義中,而又不出現(xiàn)在宏展開(kāi)中;若注釋前加星號(hào)或分號(hào),表示讓注釋而又不出現(xiàn)在宏展開(kāi)中;若注釋前加星號(hào)或分號(hào),表示讓注釋出現(xiàn)在宏展開(kāi)中。出現(xiàn)在宏展開(kāi)中。宏名宏名 .macro.macro參數(shù)參數(shù)11, , 參數(shù)參數(shù)nn 匯編語(yǔ)句或宏指令匯編語(yǔ)句或宏指令 .mexit.mexit .endm .endm4.3.2

47、 4.3.2 宏及宏的使用(宏及宏的使用(定義宏定義宏)DSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用35(2) (2) 在宏庫(kù)中定義宏在宏庫(kù)中定義宏 宏庫(kù)由歸檔器創(chuàng)建,是采用歸檔格式的文件集合。宏庫(kù)由歸檔器創(chuàng)建,是采用歸檔格式的文件集合。 歸檔文件歸檔文件( (宏庫(kù)宏庫(kù)) )里的每一個(gè)文件都包含著一個(gè)與文件名相里的每一個(gè)文件都包含著一個(gè)與文件名相對(duì)應(yīng)的宏定義對(duì)應(yīng)的宏定義; ; 宏名與文件名必須相同宏名與文件名必須相同; ; 宏庫(kù)中的文件必須是未被匯編過(guò)的源文件,其擴(kuò)展名宏庫(kù)中的文件必須是未被匯編過(guò)的源文件,其擴(kuò)展名是是.asm.asm。 可以使用可以使用.mlib.mlib指令訪問(wèn)宏庫(kù)。其語(yǔ)法為指令訪問(wèn)宏

48、庫(kù)。其語(yǔ)法為 .mlib .mlib 宏庫(kù)文件名宏庫(kù)文件名4.3.2 4.3.2 宏及宏的使用(宏及宏的使用(在宏庫(kù)中定義宏在宏庫(kù)中定義宏)DSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用362. 2. 調(diào)用宏調(diào)用宏 在源程序中通過(guò)把宏名作為操作數(shù)來(lái)調(diào)用宏。其格式在源程序中通過(guò)把宏名作為操作數(shù)來(lái)調(diào)用宏。其格式為為: : 宏名宏名 參數(shù)參數(shù)11, , 參數(shù)參數(shù)nn3. 3. 展開(kāi)宏展開(kāi)宏 當(dāng)源程序調(diào)用宏時(shí),編譯器會(huì)將宏展開(kāi)。當(dāng)源程序調(diào)用宏時(shí),編譯器會(huì)將宏展開(kāi)。 在展開(kāi)期間,編譯器把自變量傳遞給宏參數(shù),用在展開(kāi)期間,編譯器把自變量傳遞給宏參數(shù),用宏定義來(lái)代替宏調(diào)用語(yǔ)句并對(duì)源代碼進(jìn)行編譯。宏定義來(lái)代替宏調(diào)用語(yǔ)句并對(duì)

49、源代碼進(jìn)行編譯。 在默認(rèn)狀態(tài)下,宏展開(kāi)會(huì)在指令列表文件中列出,在默認(rèn)狀態(tài)下,宏展開(kāi)會(huì)在指令列表文件中列出,可以使用可以使用.mnolist.mnolist指令關(guān)掉宏指令列表。指令關(guān)掉宏指令列表。4.3.2 4.3.2 宏及宏的使用宏及宏的使用DSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用37【例例4.3】 宏定義、宏調(diào)用和宏展開(kāi)舉例宏定義、宏調(diào)用和宏展開(kāi)舉例(部分程序部分程序)。DAT0 .set 60h ;把一個(gè)常數(shù)值等效成一個(gè)符號(hào);把一個(gè)常數(shù)值等效成一個(gè)符號(hào)DAT1 .set 61h ;表示地址;表示地址DAT2 .set 62hDAT3 .set 63h .textADD3 .macro P1, P2

50、, P3, ADDRP ; 宏定義宏定義:三數(shù)相加三數(shù)相加 ;ADDRP = P1 + P2 + P3LD P1, AADD P2, AADD P3, ASTL A, ADDRP.endmDSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用38ST #0034h, DAT0 ; 參數(shù)賦值參數(shù)賦值ST #0243h, DAT1ST #1230h, DAT2ADD3 DAT0, DAT1,DAT2,DAT3 ; 宏調(diào)用宏調(diào)用:DAT3 = ; DAT0 + DAT1 + DAT2NOP.endDSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用39COFFCOFF (Common Object File Format (Common O

51、bject File Format,COFF) COFF) : 匯編器和鏈接器所創(chuàng)建的目標(biāo)文件匯編器和鏈接器所創(chuàng)建的目標(biāo)文件 。 COFFCOFF的核心概念:的核心概念:使用代碼塊(段)和數(shù)據(jù)塊(段)編程,而不使用代碼塊(段)和數(shù)據(jù)塊(段)編程,而不是指令或數(shù)據(jù)簡(jiǎn)單的順序編寫(xiě)。是指令或數(shù)據(jù)簡(jiǎn)單的順序編寫(xiě)。采用段形式的優(yōu)缺點(diǎn):采用段形式的優(yōu)缺點(diǎn): 更利于模塊化編程,管理代碼段和目標(biāo)系統(tǒng)存儲(chǔ)器更靈活更利于模塊化編程,管理代碼段和目標(biāo)系統(tǒng)存儲(chǔ)器更靈活 不必為程序代碼或變量指定目標(biāo)地址,這為程序編寫(xiě)和程不必為程序代碼或變量指定目標(biāo)地址,這為程序編寫(xiě)和程序移植提供了極大的方便;序移植提供了極大的方便;

52、能與系統(tǒng)存儲(chǔ)單元充分配合;能與系統(tǒng)存儲(chǔ)單元充分配合; 編譯系統(tǒng)復(fù)雜;編譯系統(tǒng)復(fù)雜; 對(duì)編程人員要求高(系統(tǒng)存儲(chǔ)器結(jié)構(gòu);存儲(chǔ)器映射方式)對(duì)編程人員要求高(系統(tǒng)存儲(chǔ)器結(jié)構(gòu);存儲(chǔ)器映射方式) 4.4 4.4 公共目標(biāo)文件格式公共目標(biāo)文件格式COFF COFF DSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用40段段(Sections)(Sections)是是COFFCOFF文件中最重要的概念。文件中最重要的概念。 段段就是在編寫(xiě)匯編語(yǔ)言源程序時(shí),采用的代碼塊或就是在編寫(xiě)匯編語(yǔ)言源程序時(shí),采用的代碼塊或數(shù)據(jù)塊,它占據(jù)存儲(chǔ)器的某個(gè)連續(xù)空間。數(shù)據(jù)塊,它占據(jù)存儲(chǔ)器的某個(gè)連續(xù)空間。 在編寫(xiě)匯編語(yǔ)言源程序時(shí),程序是按段組織的;

53、在編寫(xiě)匯編語(yǔ)言源程序時(shí),程序是按段組織的; 每行匯編語(yǔ)句從屬一個(gè)段,由偽指令標(biāo)明該段的屬每行匯編語(yǔ)句從屬一個(gè)段,由偽指令標(biāo)明該段的屬性;性; 一個(gè)目標(biāo)文件中的每個(gè)段都是分開(kāi)的和各不相同的。一個(gè)目標(biāo)文件中的每個(gè)段都是分開(kāi)的和各不相同的。 4.4.1 COFF4.4.1 COFF文件中的段文件中的段DSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用41p分段的優(yōu)點(diǎn):分段的優(yōu)點(diǎn): 在目標(biāo)文件中將放置程序、數(shù)據(jù)、變?cè)谀繕?biāo)文件中將放置程序、數(shù)據(jù)、變量的代碼分開(kāi),便于在鏈接時(shí)作為一個(gè)量的代碼分開(kāi),便于在鏈接時(shí)作為一個(gè)單獨(dú)的部分分配存儲(chǔ)器。由于大多數(shù)系單獨(dú)的部分分配存儲(chǔ)器。由于大多數(shù)系統(tǒng)都有好幾種形式的存儲(chǔ)器,通過(guò)對(duì)各統(tǒng)都有

54、好幾種形式的存儲(chǔ)器,通過(guò)對(duì)各個(gè)段重新定位,可以使目標(biāo)存儲(chǔ)器得到個(gè)段重新定位,可以使目標(biāo)存儲(chǔ)器得到更為有效的利用。更為有效的利用。DSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用42 所有的所有的COFFCOFF目標(biāo)文件都包含以下目標(biāo)文件都包含以下3 3種形式的段:種形式的段: .text.text段段( (此段通常包含可執(zhí)行代碼此段通常包含可執(zhí)行代碼) ); .data.data段段( (此段通常包含初始化數(shù)據(jù)此段通常包含初始化數(shù)據(jù)) ); .bss.bss段段( (此段通常為未初始化變量保留存儲(chǔ)空間此段通常為未初始化變量保留存儲(chǔ)空間) )。 此外,匯編器和鏈接器可以建立、命名和鏈接自定義段。此外,匯編器和鏈

55、接器可以建立、命名和鏈接自定義段。 自定義段是程序員自己定義的段;自定義段是程序員自己定義的段; 使用起來(lái)與使用起來(lái)與.data.data、.text.text以及以及.bss.bss段類(lèi)似;段類(lèi)似; 它的好處是在目標(biāo)文件中與它的好處是在目標(biāo)文件中與.data.data、.text.text以及以及.bss.bss分開(kāi)匯編,鏈分開(kāi)匯編,鏈接時(shí)作為一個(gè)單獨(dú)的部分分配到存儲(chǔ)器。接時(shí)作為一個(gè)單獨(dú)的部分分配到存儲(chǔ)器。 有有2 2種形式:種形式: .sect.sect 建立的自定義段是已初始化段;建立的自定義段是已初始化段; .usect.usect 建立的自定義段是未初始化段。建立的自定義段是未初始化

56、段。4.4.1 COFF4.4.1 COFF文件中的段文件中的段DSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用43 .bss .data .text RAM EEPROM ROM 目標(biāo)文件 目標(biāo)存儲(chǔ)器 匯編器根據(jù)偽指令用適當(dāng)?shù)亩螌⒏鞑糠殖绦虼a和數(shù)據(jù)連在一匯編器根據(jù)偽指令用適當(dāng)?shù)亩螌⒏鞑糠殖绦虼a和數(shù)據(jù)連在一起,構(gòu)成目標(biāo)文件;起,構(gòu)成目標(biāo)文件; 鏈接器分配存儲(chǔ)單元,即把各個(gè)段重新定位到目標(biāo)存儲(chǔ)器中。鏈接器分配存儲(chǔ)單元,即把各個(gè)段重新定位到目標(biāo)存儲(chǔ)器中。 圖4.2 目標(biāo)文件中的段與目標(biāo)存儲(chǔ)器之間的關(guān)系4.4.1 COFF4.4.1 COFF文件中的段文件中的段DSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用44 匯編器對(duì)段的

57、處理是通過(guò)段定義偽指令區(qū)分出各個(gè)段,匯編器對(duì)段的處理是通過(guò)段定義偽指令區(qū)分出各個(gè)段,且將段名相同的語(yǔ)句匯編在一起。且將段名相同的語(yǔ)句匯編在一起。匯編器有匯編器有5 5個(gè)段定義偽指令支持該功能個(gè)段定義偽指令支持該功能,這,這5 5個(gè)偽指令個(gè)偽指令是:是:.bss.bss,.usect.usect,.text.text, .data.data, .sect.sect如果匯編語(yǔ)言程序中一個(gè)段偽指令都沒(méi)有用,如果匯編語(yǔ)言程序中一個(gè)段偽指令都沒(méi)有用,匯編器會(huì)匯編器會(huì)把程序中的內(nèi)容都匯編到把程序中的內(nèi)容都匯編到.text.text段段。匯編器對(duì)不同類(lèi)型段的處理不同匯編器對(duì)不同類(lèi)型段的處理不同。4.4.2

58、4.4.2 匯編器對(duì)段的處理匯編器對(duì)段的處理DSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用451. 1. 未初始化段未初始化段 未初始化段未初始化段(Uninitialized sections)(Uninitialized sections)由由.bss.bss和和.usect.usect偽指令建立。偽指令建立。 未初始化段就是在目標(biāo)存儲(chǔ)器中的保留空間,以供程序未初始化段就是在目標(biāo)存儲(chǔ)器中的保留空間,以供程序運(yùn)行過(guò)程中的變量作為臨時(shí)存儲(chǔ)空間使用。運(yùn)行過(guò)程中的變量作為臨時(shí)存儲(chǔ)空間使用。 在目標(biāo)文件中,這些段中沒(méi)有確切的內(nèi)容,通常它們定在目標(biāo)文件中,這些段中沒(méi)有確切的內(nèi)容,通常它們定位到位到RAMRAM區(qū)。區(qū)

59、。4.4.2 4.4.2 匯編器對(duì)段的處理匯編器對(duì)段的處理DSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用46未初始化段分為默認(rèn)的和命名的未初始化段分為默認(rèn)的和命名的2 2種,其句法如下種,其句法如下 .bss.bss符號(hào),字?jǐn)?shù)符號(hào),字?jǐn)?shù) 符號(hào)符號(hào) .usect.usect“段名段名”,字?jǐn)?shù),字?jǐn)?shù) 每調(diào)用每調(diào)用.bss.bss偽指令一次,匯編器在相應(yīng)段保留預(yù)偽指令一次,匯編器在相應(yīng)段保留預(yù)留字?jǐn)?shù)的空間;留字?jǐn)?shù)的空間; 每調(diào)用每調(diào)用.usect.usect偽指令一次,匯編器在指定的命名偽指令一次,匯編器在指定的命名段保留預(yù)留字?jǐn)?shù)的空間。段保留預(yù)留字?jǐn)?shù)的空間。1. 1. 未初始化段未初始化段4.4.2 4.4.2

60、 匯編器對(duì)段的處理匯編器對(duì)段的處理DSPDSP技術(shù)及應(yīng)用技術(shù)及應(yīng)用47 初始化段初始化段(Initialized sections)(Initialized sections)由由.text.text、.data.data和和.sect.sect偽指令建立,包含可執(zhí)行代碼或初始化數(shù)據(jù)。偽指令建立,包含可執(zhí)行代碼或初始化數(shù)據(jù)。 這些段中的內(nèi)容都在目標(biāo)文件夾中,當(dāng)加載程序時(shí)再放到存儲(chǔ)這些段中的內(nèi)容都在目標(biāo)文件夾中,當(dāng)加載程序時(shí)再放到存儲(chǔ)器中。器中。 每個(gè)初始化段都是可以重新定位的,并且可以引用其他段中所每個(gè)初始化段都是可以重新定位的,并且可以引用其他段中所定義的符號(hào)。鏈接器在連接時(shí)自動(dòng)處理段間的相

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論