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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

5.1匯編程序格式

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

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

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

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

(3)所有語句必須以標號、空格或分號開始;

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

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

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

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

1.標號

標號由A~Z、a~z、0~9、_和$等符號組成,區(qū)分大小寫,最長可達32個字符,但第一個字符不能是數字。標號后面可以帶冒號(:),但冒號不作為標號的一部分。

如果使用標號,標號的值就是段程序計數器(SPC)的當前值,也就是該行代碼開始存儲的地址。

例5.1中是一段用匯編語言編寫的FIR濾波函數程序,其中_FIR是一個標號,表示這段代碼的入口地址。標號_FIR以下劃線(_)開始,可以在C語言程序文件中進行調用。因為C文件的函數名經編譯后,會自動在函數名前加下劃線(_)。例5.1一段FIR濾波函數程序。

_FIR:

;保護子程序用到的輔助寄存器

FRAME

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

PSHM

AR2

PSHM

AR3

PSHM

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

STM#_input_mix,input_mix_P

LD*input_mix_P,A;將當前采樣值載入到A中

CALLfir;濾波結果也返回至A中

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

POPMST1

POPMAR3

POPMAR2

FRAME1

RET

2.助記符

助記符不能從一行的第一列開始書寫,否則被認為是標號。助記符中還包括偽指令或宏調用。

3.操作數

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

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

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

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

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

A中

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

二進制整數,其后加B或b,最多16位,不足16位,其高位用0填充。

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

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

浮點數,IEEE-32bit格式,輸入格式如下:

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

數形式,否則小數點不能省略。如3.e5合法,而3e5則非法,編譯器不能識別。nnn均為十進制字符,指數為以10為底的

指數。

操作數可以使用以下符號來表示。

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

(2)用.set定義的符號常數。

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

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

4.注釋

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

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

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

5.2匯編表達式

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

5.3指令中的符號及縮寫

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

5.4指令系統(tǒng)

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

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

(2)程序控制指令,包括分支轉移、調用、中斷、返回、重復等程序控制指令。

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

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

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

C54x的程序控制指令包括分支轉移指令、子程序調用指令、中斷指令、返回指令、重復指令、堆棧操作指令以及混合程序控制指令,如表5.4所示。5.4.3算術運算指令

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

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

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

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

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

下列指令單獨執(zhí)行時為多周期執(zhí)行指令,執(zhí)行周期為2~5個周期不等。但當用RPT重復執(zhí)行時,在指令流水線下均變成單周期指令,同樣可以達到非??斓乃俣?。

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

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

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

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

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

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

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

③中斷指令:INTR和TRAP;

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

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

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

5.6匯編偽指令

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

能有:

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

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

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

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

有關變量定義及常數初始化的偽指令有:

.mmregs

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

.defsymbol1[,symbol2,…]在當前文件中定義一個或多個符號,可以被其他文件

引用。

.refsymbol1[,symbol2,…]

在當前文件中引用其他文件中定義的一個或多個符號。.globalsymbol1[,symbol2,…]

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

符號。

.intvalue1[,value2,…]初始化一個或多個16位整數,其首地址由.int前面的標號決定,個數由數據個數決定。如匯編偽指令:

K1:.int3,5,7

相當于下面的C語言語句:

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

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

.wordvalue1[,value2,…]

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

.floatvalue1[,value2,…]

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

.doublevalue1[,value2,…]

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

.longvalue1[,value2,…]

初始化一個或多個32位整數,高16位在低地址(偶地址),低16位在高地址,且自動對齊偶字邊界。

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

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

.charvalue1[,value2,…]

.bytevalue1[,value2,…]

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

.set

將前面的標號定義為符號常量,如:

K:

.set3//編譯時將K換成3

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

.asg

AR1,DATA_P1//DATA_P1是AR1的別名

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

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

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

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

.space[sizeinbits]

在當前段保留size個比特存儲空間。若需要保留多少個字的空間,可將size定義為16的整數倍,如“.space4*16”。

.even

將SPC(段指針)調整到一個偶字邊界,它相當于“.align2”偽指令。5.6.2段定義相關偽指令

.text

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

.data

匯編到.data段(已初始化數據段),.data段為系統(tǒng)默認產生的已初始化數據段名。

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

定義一個未初始化段,為symbol變量分配sizeinwords個字的存儲空間,可以指定分塊標志(blockingflag)和存儲邊界(alignmentflag)。.bss段為系統(tǒng)默認產生的未初始化數據段

名。如:

.bssbuffer,K_size,1,128

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

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

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

在行首可以有標號,以定義段的首地址。段名sectionname在編譯時僅前8個字符有效。5.6.3引用其他文件和條件匯編

.include“filename”

將指定文件復制到當前位置,可以是程序、數據和符號定義等。在行首可以有標號,以定義段的首地址。如:

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

//在當前文件夾的coff子文件夾中

.if、.elseif、.else、endif

條件編譯,匯編器根據表達式的真假情況進行編譯。

.end

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

如果在程序當中需要多次執(zhí)行某段程序的一個簡短的程序代碼時,可以把這段程序定義為宏,然后在需要時調用,以提高編程效率和執(zhí)行效率。

宏定義如下:

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

[.mexit]

.endm[HT5]

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

.text

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

LDp1,A

ADDp2,A

ADDp3,A

STLA,p

.endm當執(zhí)行

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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論