《DSP技術(shù)及應(yīng)用》課件第5章_第1頁(yè)
《DSP技術(shù)及應(yīng)用》課件第5章_第2頁(yè)
《DSP技術(shù)及應(yīng)用》課件第5章_第3頁(yè)
《DSP技術(shù)及應(yīng)用》課件第5章_第4頁(yè)
《DSP技術(shù)及應(yīng)用》課件第5章_第5頁(yè)
已閱讀5頁(yè),還剩94頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第5章TMS320C54xDSP匯編指令5.1匯編程序格式5.2匯編表達(dá)式

5.3指令中的符號(hào)及縮寫5.4指令系統(tǒng)5.5可重復(fù)和不可重復(fù)執(zhí)行的指令5.6匯編偽指令匯編語(yǔ)言源程序文件包含三大匯編語(yǔ)言要素:匯編指令、匯編偽指令和宏命令,它們之間的有機(jī)組合可完成特定的程序功能。

匯編語(yǔ)言編程有助記符指令集和代數(shù)指令集兩種,但這兩種指令集不能混用。本章介紹助記符指令集,后續(xù)章節(jié)使用的也是助記符指令。DSP匯編源程序的后綴為.asm,就是assembler(匯編)的縮寫。

5.1匯編程序格式

助記符指令一般由以下四部分(字段)組成,其中有中括號(hào)([])的部分為可選項(xiàng)。

[標(biāo)號(hào)][:]助記符[操作數(shù),…][;注釋]助記符指令的書寫規(guī)則如下:

(1)所有包含偽指令的語(yǔ)句必須在一行內(nèi)列出;

(2)對(duì)于其他指令,如果某行的最后加了反斜杠(\),表示下一行是該行的繼續(xù);

(3)所有語(yǔ)句必須以標(biāo)號(hào)、空格或分號(hào)開始;

(4)標(biāo)號(hào)為可選項(xiàng),如果使用,必須從一行的第一列位置(行首)開始,標(biāo)號(hào)的冒號(hào)(:)為可選項(xiàng),不作為標(biāo)號(hào)的一部分;

(5)各字段之間必須用一個(gè)或多個(gè)空格分開,制表符Tab鍵等效于空格,而且能實(shí)現(xiàn)自動(dòng)對(duì)齊;

(6)注釋為可選項(xiàng),如果使用則以分號(hào)(;)開始。

以上除注釋可以使用中文字符外,其他均為英文字符。

1.標(biāo)號(hào)

標(biāo)號(hào)由A~Z、a~z、0~9、_和$等符號(hào)組成,區(qū)分大小寫,最長(zhǎng)可達(dá)32個(gè)字符,但第一個(gè)字符不能是數(shù)字。標(biāo)號(hào)后面可以帶冒號(hào)(:),但冒號(hào)不作為標(biāo)號(hào)的一部分。

如果使用標(biāo)號(hào),標(biāo)號(hào)的值就是段程序計(jì)數(shù)器(SPC)的當(dāng)前值,也就是該行代碼開始存儲(chǔ)的地址。

例5.1中是一段用匯編語(yǔ)言編寫的FIR濾波函數(shù)程序,其中_FIR是一個(gè)標(biāo)號(hào),表示這段代碼的入口地址。標(biāo)號(hào)_FIR以下劃線(_)開始,可以在C語(yǔ)言程序文件中進(jìn)行調(diào)用。因?yàn)镃文件的函數(shù)名經(jīng)編譯后,會(huì)自動(dòng)在函數(shù)名前加下劃線(_)。例5.1一段FIR濾波函數(shù)程序。

_FIR:

;保護(hù)子程序用到的輔助寄存器

FRAME

-1;FRAME用于開辟局部幀,保護(hù)主函數(shù)傳遞來的局部變量

PSHM

AR2

PSHM

AR3

PSHM

ST1;ST1含有SXM、FRCT、OVM等控制位

STM#_input_mix,input_mix_P

LD*input_mix_P,A;將當(dāng)前采樣值載入到A中

CALLfir;濾波結(jié)果也返回至A中

;恢復(fù)輔助寄存器和原來的運(yùn)算狀態(tài)

POPMST1

POPMAR3

POPMAR2

FRAME1

RET

2.助記符

助記符不能從一行的第一列開始書寫,否則被認(rèn)為是標(biāo)號(hào)。助記符中還包括偽指令或宏調(diào)用。

3.操作數(shù)

操作數(shù)字段是一個(gè)操作數(shù)列表,根據(jù)指令要求操作數(shù)可以有一個(gè)或多個(gè),也可能沒有操作數(shù)。操作數(shù)之間用逗號(hào)(,)隔開,它可以是常數(shù)、符號(hào)或符號(hào)表達(dá)式,其前綴規(guī)定如下所述。

前綴#:表示其后的操作數(shù)為立即數(shù)。

前綴*:表示其后的操作數(shù)為間接尋址。

ADD#123,B;將立即數(shù)123(十進(jìn)制)加到累加器B上

LD*AR1,A;將AR1所指向的單元內(nèi)容裝載到累加器

A中

各種數(shù)據(jù)的前后綴規(guī)定如下:

二進(jìn)制整數(shù),其后加B或b,最多16位,不足16位,其高位用0填充。

八進(jìn)制整數(shù),其后加Q或q,或者在其前面加數(shù)字0,最多6位,不足6位,其高位用符號(hào)位填充。十進(jìn)制整數(shù),由十進(jìn)制字符組成,范圍為-32768~65535。

十六進(jìn)制整數(shù),其后加H或h,或者在其前面加字符0x,必須以數(shù)字0~9開始,最多4位,不足4位,其高位用符號(hào)位填充。

浮點(diǎn)數(shù),IEEE-32bit格式,輸入格式如下:

[±][nnn.nnn]e[±nnn]數(shù)據(jù)范圍從1.175494e-38到3.40282346e38,除非寫成整

數(shù)形式,否則小數(shù)點(diǎn)不能省略。如3.e5合法,而3e5則非法,編譯器不能識(shí)別。nnn均為十進(jìn)制字符,指數(shù)為以10為底的

指數(shù)。

操作數(shù)可以使用以下符號(hào)來表示。

(1)用.global、.def和.ref定義的全局標(biāo)號(hào),用$或name?定義的局部標(biāo)號(hào)。全局標(biāo)號(hào)具有系統(tǒng)唯一性,不能重新定義;局部標(biāo)號(hào)只有局部意義,在同一個(gè)匯編程序中可重新定義和使用。

(2)用.set定義的符號(hào)常數(shù)。

(3)用.mmregs定義的映射寄存器符號(hào)。

(4)用.asg定義的替代符號(hào)等。

4.注釋

注釋可以從一行的任意列開始,除第一符號(hào)是分號(hào)(;)

外。注釋中可以使用ASCII字符、空格以及中文字符,建

議多加注釋,以增加程序的可讀性。

5.2匯編表達(dá)式

表達(dá)式是由運(yùn)算符組合起來的常數(shù)或符號(hào)構(gòu)成的,它的值必須是唯一或絕對(duì)的,有效值范圍為-32768~32767。表5.1列出了匯編表達(dá)式中可用的運(yùn)算符,C54x匯編器使用和C語(yǔ)言一樣的優(yōu)先級(jí)表示,用小括號(hào)(())可以改變優(yōu)先順序。

5.3指令中的符號(hào)及縮寫

在介紹C54x指令系統(tǒng)之前,應(yīng)先說明指令系統(tǒng)中使用的符號(hào)和縮寫,如表5.2所示。

5.4指令系統(tǒng)

TMS320C54x的指令集包含四種基本類型的操作,分別如下:

(1)加載和存儲(chǔ)指令,包括加載、存儲(chǔ)以及條件存儲(chǔ)和復(fù)合加載存儲(chǔ)的指令等。

(2)程序控制指令,包括分支轉(zhuǎn)移、調(diào)用、中斷、返回、重復(fù)等程序控制指令。

(3)算術(shù)運(yùn)算指令,包括加法、減法、乘法、乘累加、32位操作數(shù)運(yùn)算以及其他一些專用指令。

(4)邏輯運(yùn)算指令,包括與、或、異或、移位和測(cè)試指令等。5.4.1加載和存儲(chǔ)指令

C54x的加載和存儲(chǔ)指令包括加載指令、存儲(chǔ)指令、條件存儲(chǔ)指令和混合加載存儲(chǔ)指令,如表5.3所示。5.4.2程序控制指令

C54x的程序控制指令包括分支轉(zhuǎn)移指令、子程序調(diào)用指令、中斷指令、返回指令、重復(fù)指令、堆棧操作指令以及混合程序控制指令,如表5.4所示。5.4.3算術(shù)運(yùn)算指令

C54x的算術(shù)運(yùn)算指令包括加法指令、減法指令、乘法指令、乘累加和乘減指令、雙字/雙精度運(yùn)算指令以及專用指令,如表5.5所示。5.4.4邏輯運(yùn)算指令

C54x的邏輯運(yùn)算指令包括與指令、或指令、異或指令、移位指令以及測(cè)試指令,如表5.6所示。5.4.5并行操作指令

C54x的并行操作指令包括并行裝載和存儲(chǔ)指令、并行存儲(chǔ)加/減指令和并行存儲(chǔ)乘法指令,如表5.7所示。

5.5可重復(fù)和不可重復(fù)執(zhí)行的指令

5.5.1重復(fù)執(zhí)行時(shí)變成單周期的多周期指令

下列指令單獨(dú)執(zhí)行時(shí)為多周期執(zhí)行指令,執(zhí)行周期為2~5個(gè)周期不等。但當(dāng)用RPT重復(fù)執(zhí)行時(shí),在指令流水線下均變成單周期指令,同樣可以達(dá)到非常快的速度。

(1)濾波運(yùn)算類指令有FIRS、MACD和MACP。

(2)數(shù)據(jù)傳送類指令有MVDK、MVDM、MVDP、MVKD、MVMD、MVPD、READA和WRITA。5.5.2不可重復(fù)執(zhí)行的指令

下列指令不能建立指令流水線執(zhí)行過程,因而不能用RPT重復(fù)執(zhí)行,時(shí)間效率較低。

(1)運(yùn)算類指令有ADDM、ANDM、ORM、XORM和RND。

(2)加載存儲(chǔ)類指令有LDARP或DP、DST和MVMM。

(3)程序控制類指令基本不能重復(fù)執(zhí)行,不能重復(fù)執(zhí)行的程序控制指令分別如下。①分支轉(zhuǎn)移指令:B[D]、BACC[D]、BANZ[D]、BC[D]、FB[D]和FBACC[D];

②子程序調(diào)用指令:CALA[D]、CALL[D]、CC[D]、FCALA[D]和FCALL[D];

③中斷指令:INTR和TRAP;

④返回指令:FRET[D]、FRETE[D]、RC[D]、RET[D]、RETE[D]和RETF[D];⑤重復(fù)指令:RPT、RPTZ和RPTB[D];

⑥混合程序控制指令:IDLE、RESET、RSBX、SSBX和XC。

(4)其他不能重復(fù)執(zhí)行的指令是CMPR。

5.6匯編偽指令

匯編偽指令為程序提供數(shù)據(jù)并控制匯編過程,主要功

能有:

(1)變量定義、分配存儲(chǔ)空間,常量初始化;

(2)代碼段定義等操作;

(3)調(diào)用其他文件、條件匯編、提取宏等操作;

(4)調(diào)試信息、輸出列表等操作。5.6.1變量定義和常數(shù)初始化

有關(guān)變量定義及常數(shù)初始化的偽指令有:

.mmregs

定義存儲(chǔ)器映射寄存器(MMR)的符號(hào)。使用這條指令后,凡是存儲(chǔ)器映射寄存器都可直接使用此符號(hào),而不必逐一定義其地址。

.defsymbol1[,symbol2,…]在當(dāng)前文件中定義一個(gè)或多個(gè)符號(hào),可以被其他文件

引用。

.refsymbol1[,symbol2,…]

在當(dāng)前文件中引用其他文件中定義的一個(gè)或多個(gè)符號(hào)。.globalsymbol1[,symbol2,…]

定義一個(gè)或多個(gè)全局(外部)符號(hào),可以是C文件定義的

符號(hào)。

.intvalue1[,value2,…]初始化一個(gè)或多個(gè)16位整數(shù),其首地址由.int前面的標(biāo)號(hào)決定,個(gè)數(shù)由數(shù)據(jù)個(gè)數(shù)決定。如匯編偽指令:

K1:.int3,5,7

相當(dāng)于下面的C語(yǔ)言語(yǔ)句:

K1[3]=[3,5,7];

編譯器在編譯數(shù)據(jù)時(shí),一般是先編譯全部數(shù)據(jù),再將數(shù)據(jù)截短為16位的數(shù)據(jù),而不檢查數(shù)據(jù)超出范圍之類的錯(cuò)誤。數(shù)據(jù)本身的錯(cuò)誤由程序編寫人員負(fù)責(zé)處理。

.wordvalue1[,value2,…]

此偽指令的功能和用法與.int的功能和用法相同。

.floatvalue1[,value2,…]

初始化一個(gè)(段)浮點(diǎn)數(shù)。一個(gè)浮點(diǎn)數(shù)占用2個(gè)字的存儲(chǔ)單元,其存儲(chǔ)格式如圖5.1所示。圖5.1一個(gè)浮點(diǎn)數(shù)的存儲(chǔ)格式其中,s為一個(gè)1位符號(hào)域,e為8位有偏指數(shù),f為23位小數(shù),高16位在低地址,低16位在高地址,且自動(dòng)對(duì)齊偶字邊界,即低地址在偶地址上。假設(shè)數(shù)據(jù)段(.data)地址從0x100開始,如例5.2所示,則3.14從0x0102地址開始存儲(chǔ),0x0101單元空著。

.doublevalue1[,value2,…]

此偽指令的功能和用法與.float的功能和用法相同。

.longvalue1[,value2,…]

初始化一個(gè)或多個(gè)32位整數(shù),高16位在低地址(偶地址),低16位在高地址,且自動(dòng)對(duì)齊偶字邊界。

.string“string1”[,“string2”,…]

初始化一個(gè)或多個(gè)文本字符串。每個(gè)字符為8位數(shù)據(jù),但仍用一個(gè)字單元(16位)保存,高8位填充為0。

.charvalue1[,value2,…]

.bytevalue1[,value2,…]

初始化一個(gè)或多個(gè)字節(jié),用法同偽指令.string。

.set

將前面的標(biāo)號(hào)定義為符號(hào)常量,如:

K:

.set3//編譯時(shí)將K換成3

.asg定義替代符號(hào),編譯時(shí)將前面的字符串替代為后面的符號(hào)。如編譯以下兩行代碼:

.asg

AR1,DATA_P1//DATA_P1是AR1的別名

.asgAR1,DATA_P2//DATA_P2是AR1的別名

編譯器將DATA_P1和DATA_P2都替換成AR1,或者說,AR1可以有多個(gè)別名。

.align[sizeinwords]將SPC(段指針)調(diào)整到一個(gè)由sizeinwords(2的整數(shù)次冪)指定的字邊界,以滿足某些特殊尋址的要求。sizeinwords默認(rèn)為128字(頁(yè)邊界)。如在例5.2中,若在f1前面一行加上“.align”,則f1從0x180開始存儲(chǔ),

*(0x0180)=0x4048,*(0x0181)=0xF5C3。

.space[sizeinbits]

在當(dāng)前段保留size個(gè)比特存儲(chǔ)空間。若需要保留多少個(gè)字的空間,可將size定義為16的整數(shù)倍,如“.space4*16”。

.even

將SPC(段指針)調(diào)整到一個(gè)偶字邊界,它相當(dāng)于“.align2”偽指令。5.6.2段定義相關(guān)偽指令

.text

匯編到.text段(可執(zhí)行代碼段),.text段為系統(tǒng)默認(rèn)產(chǎn)生的程序段名。

.data

匯編到.data段(已初始化數(shù)據(jù)段),.data段為系統(tǒng)默認(rèn)產(chǎn)生的已初始化數(shù)據(jù)段名。

.bsssymbolsizeinwords[,[blockingflag][,alignmentflag]]

定義一個(gè)未初始化段,為symbol變量分配sizeinwords個(gè)字的存儲(chǔ)空間,可以指定分塊標(biāo)志(blockingflag)和存儲(chǔ)邊界(alignmentflag)。.bss段為系統(tǒng)默認(rèn)產(chǎn)生的未初始化數(shù)據(jù)段

名。如:

.bssbuffer,K_size,1,128

//為變量buffer分配K_size個(gè)存儲(chǔ)單元,1段,對(duì)齊128字邊界.sect“sectionname”定義已初始化命名段,匯編到sectionname的段,它的作用類似于.text和.data,為已初始化段。段名sectionname在編譯時(shí)僅前8個(gè)字符有效。

.usect“sectionname”,sizeinwords[,[blockingflag][,alignmentflag]]

定義未初始化命名段,匯編到sectionname的段,它的作用和使用類似于.bss,為未初始化段。

在行首可以有標(biāo)號(hào),以定義段的首地址。段名sectionname在編譯時(shí)僅前8個(gè)字符有效。5.6.3引用其他文件和條件匯編

.include“filename”

將指定文件復(fù)制到當(dāng)前位置,可以是程序、數(shù)據(jù)和符號(hào)定義等。在行首可以有標(biāo)號(hào),以定義段的首地址。如:

COFF_START:.include″coff\\LPF.inc″

//在當(dāng)前文件夾的coff子文件夾中

.if、.elseif、.else、endif

條件編譯,匯編器根據(jù)表達(dá)式的真假情況進(jìn)行編譯。

.end

結(jié)束匯編,編譯器忽略.end后面的代碼。5.6.4宏定義和宏引用

如果在程序當(dāng)中需要多次執(zhí)行某段程序的一個(gè)簡(jiǎn)短的程序代碼時(shí),可以把這段程序定義為宏,然后在需要時(shí)調(diào)用,以提高編程效率和執(zhí)行效率。

宏定義如下:

macname.macro[parameter1][,parameter2,…]…

[.mexit]

.endm[HT5]

其中,macname為宏名,放在行首,.mexit為宏退出,可選項(xiàng),.endm為結(jié)束宏定義。.mexit類似于C語(yǔ)言中的goto語(yǔ)句,其后面的代碼不執(zhí)行,直接跳轉(zhuǎn)到.endm處。如宏add3的定義如下:

.text

add3.macro p1,p2,p3,p//p=p1+p2+p3

LDp1,A

ADDp2,A

ADDp3,A

STLA,p

.endm當(dāng)執(zhí)行

add3a1,b1,c1,d1//d1=a1+b1+c1,變量不能用a、b表示,以免與累加器A、B名相混淆時(shí),匯編器執(zhí)行如下代碼:LD

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論