版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第5章TMS320C54x的匯編語言程序設(shè)計(jì)第1頁,共93頁。 知識要點(diǎn):本章涉及的內(nèi)容包括匯編語言源程序的格式、常數(shù)、字符串、符號和表達(dá)式的規(guī)定;堆棧的使用方法;分支、調(diào)用、返回等控制程序;加法、乘法、除法、長字和并行等算術(shù)運(yùn)算程序;單指令、塊重復(fù)、循環(huán)嵌套等重復(fù)操作程序;數(shù)據(jù)塊傳送程序;小數(shù)運(yùn)算程序以及浮點(diǎn)運(yùn)算程序等。第2頁,共93頁。5.1 概述 TMS320C54x匯編語言源程序由源語句組成。這些語句可以包含匯編語言指令、匯編偽指令和注釋。程序的編寫必須符合一定的格式,以便匯編器將源文件轉(zhuǎn)換成機(jī)器語言的目標(biāo)文件。下面將介紹匯編語言源程序的格式、各種常數(shù)、符號、字符串和表達(dá)式的規(guī)定。第3
2、頁,共93頁。5.1.1 匯編語言源程序格式 匯編語言程序以.asm為擴(kuò)展名,可以用任意的編輯器編寫源文件。 一句程序占源程序的一行,每行字符最多200個(gè),如果長度超過200,則匯編器截去行尾的多余字符,并發(fā)出一個(gè)警告。第4頁,共93頁。 源文件格式 助記符指令源語句的每一行通常包含4個(gè)部分:標(biāo)號區(qū)、助記符區(qū)、操作數(shù)區(qū)和注釋區(qū)。 助記符指令語法格式如下: label: mnemonic operand list ;comment 標(biāo)號區(qū) 助記符區(qū) 操作數(shù)區(qū) 注釋區(qū)第5頁,共93頁。 例 助記符指令源語句舉例。 NANHUA .set 1;符號NANHUA=1 Begin: LD #NANHUA
3、,AR1; 將1加載到AR1 匯編語句書寫格式應(yīng)遵循一定規(guī)則。這些規(guī)則如下: 所有語句必須以一個(gè)標(biāo)號、空格、星號或分號開始; 標(biāo)號是可選項(xiàng),若使用標(biāo)號,則標(biāo)號必須從第一列開始; 包含有一個(gè)匯編偽指令的語句必須在一行完全指定; 每個(gè)區(qū)必須用一個(gè)或多個(gè)空格分開,Tab字符與空格等效。 程序中注釋是可選項(xiàng)。在第一列用*號或;號,其它列用;號。 若源程序很長,需要書寫若干行,可在前一行用反斜杠()結(jié)束,余下接著在下一行繼續(xù)書寫。第6頁,共93頁。 標(biāo)號區(qū) 所有匯編指令和大多數(shù)匯編偽指令前面都可以選擇語句標(biāo)號。使用語句標(biāo)號時(shí),必須從源語句第一列開始。 標(biāo)號最多為32個(gè)字符,由(AZ, az, 09, _
4、和$)等組成。標(biāo)號分大小寫,第一個(gè)字符不能用數(shù)字。標(biāo)號后面帶冒號: 在使用標(biāo)號時(shí),標(biāo)號的值是段程序計(jì)數(shù)器(SPC)的當(dāng)前值。 第7頁,共93頁。 例5.1.2 標(biāo)號格式舉例。 標(biāo)號Start的值為40h: 9 000000 ;假設(shè)匯編了某個(gè)其他代碼10 000040 000A Start: .word 0Ah ,3 ,7 000041 0003 000042 0007第8頁,共93頁。 在一行中的標(biāo)號本身是一個(gè)有效的語句。 標(biāo)號將段程序計(jì)數(shù)器(SPC)的當(dāng)前值賦給標(biāo)號,等效于下列偽指令語句: label .set $; $提供SPC當(dāng)前值 如果標(biāo)號單獨(dú)占一行時(shí),它將指到下一行的指令(SPC不增
5、加): 3 000043 Here: 4 000043 0003 .word 3 第9頁,共93頁。 助記符指令區(qū) 在助記符匯編語言中,緊接在標(biāo)號區(qū)后面的是助記符區(qū)和操作數(shù)區(qū)。 助記符區(qū) 助記符區(qū)跟在標(biāo)號區(qū)的后面。 助記符指令可以是匯編語言指令、匯編偽指令、宏偽指令。助記符區(qū)不能從第一列開始。 助記符區(qū)可以包含如下操作碼。 機(jī)器指令助記符,一般用大寫; 匯編偽指令、宏偽指令。以英文句號“.”開頭,且為小寫; 宏調(diào)用。第10頁,共93頁。 操作數(shù)區(qū) 操作數(shù)區(qū)是跟在助記符區(qū)后面的一系列操作數(shù),由一個(gè)和多個(gè)空格分開。 操作數(shù)可以是符號、常數(shù)或是符號與常數(shù)組合的表達(dá)式。操作數(shù)之間一定用逗號“,”分開。
6、 對操作數(shù)前綴的規(guī)定。匯編器允許將常數(shù)、符號或表達(dá)式作為地址、立即數(shù)或間接地址。指令操作數(shù)遵循以下規(guī)定: 前綴“#”后面的操作數(shù)是一個(gè)立即數(shù)。 前綴“*”后面的操作數(shù)是一個(gè)間接地址。 第11頁,共93頁。 注釋區(qū) 注釋是任選項(xiàng)。 注釋可以由ASC碼和空格組成。第12頁,共93頁。5.1.2 匯編語言中的常數(shù)與字符串 匯編器支持以下幾種類型的常數(shù)(常量)。 二進(jìn)制整數(shù) 二進(jìn)制整數(shù)常量最多由16位二進(jìn)制數(shù)字(0或1)組成,后綴為B(或b)。如果數(shù)字小于16位,匯編器將其右邊對其,并在前面補(bǔ)零。例如: 10001000B 136(十進(jìn)制) 0111100b 60(十進(jìn)制) 10b 2 (十進(jìn)制) 1
7、0001111B 143(十進(jìn)制) 第13頁,共93頁。 八進(jìn)制整數(shù) 八進(jìn)制整數(shù)型常量最多由6位八進(jìn)制數(shù)字(07)組成,后綴為Q(或q)或前綴為0 例如: 100011Q 32777(十進(jìn)制) 124q 84(十進(jìn)制) 對八進(jìn)制常數(shù)也可使用C語言的記號,即加前綴0。 0100011 32777(十進(jìn)制) 0124 84(十進(jìn)制)第14頁,共93頁。 十進(jìn)制整數(shù) 十進(jìn)制整數(shù)型常量由十進(jìn)制數(shù)字串組成,無后綴。取值范圍為:-3276832767或065535。例如: 2118 2118(十進(jìn)制) 65535 65535(十進(jìn)制) -32768 -32768(十進(jìn)制)第15頁,共93頁。 十六進(jìn)制整數(shù)
8、 十六進(jìn)制整數(shù)常量最多由4位十六進(jìn)制數(shù)字組成,帶后綴H(或h)。例如: 0DH 14(十進(jìn)制) 12BCH 4796(十進(jìn)制) 對十六進(jìn)制常數(shù)也可使用C語言的記號,即加前綴0 x: 0 x0D 14(十進(jìn)制) 0 x12BC 4796(十進(jìn)制)第16頁,共93頁。 浮點(diǎn)數(shù) 浮點(diǎn)整型常量由一串十進(jìn)制數(shù)字組成,可以帶小數(shù)點(diǎn)、分?jǐn)?shù)和指數(shù)部分。浮點(diǎn)數(shù)的表示方法為 n. nE|e n n代表一串十進(jìn)制數(shù),小數(shù)點(diǎn)必須指定。例如99.e9是有效數(shù),但99e9非法。 匯編時(shí)間常數(shù) 在程序中使用.set偽指令給一個(gè)符號賦值,該符號就成為一個(gè)匯編時(shí)間常數(shù),等效于一個(gè)常數(shù)。賦給符號的必須是絕對值。例如將常數(shù)值18賦
9、給符號nan_hua,即 nan_hua .set 18 LD # nan_hua,A第17頁,共93頁。 也可以用.set偽指令將符號常數(shù)賦給寄存器名。此時(shí),該符號變成了寄存器替代名。例如: AuxR1 .set AR1 MVMM AuxR1,SP 字符常數(shù) 字符常數(shù)是包括單引號內(nèi)的字符串。若單引號之間沒有字符,則值為0。每個(gè)字符在內(nèi)部表示為8位ASC碼。例如: a 內(nèi)部表示為61h B 內(nèi)部表示為42h第18頁,共93頁。 字符串 字符串是由雙引號括起來的一串字符。字符串的最大長度是可以變化的,由要求字符串的偽指令來設(shè)置。字符在內(nèi)部用8位ASC碼來表示。例如: “example” 定義了一
10、個(gè)長度為7的字符串:example第19頁,共93頁。5.1.3 匯編源程序中的符號 匯編源程序中的符號用于標(biāo)號、常數(shù)和替代字符。符號名最多可長達(dá)200個(gè)字符,由字母、數(shù)字以及下劃線和美元符號(AZ,az,09,_和$)等組成。 標(biāo)號分大小寫。在符號中,第一個(gè)字符不能用數(shù)字,符號中不能含空格。第20頁,共93頁。 標(biāo)號 用做標(biāo)號(labels)的符號代表在程序中對應(yīng)位置的符號地址。通常標(biāo)號是局部變量,在一個(gè)文件中局部使用的標(biāo)號必須是惟一的。 標(biāo)號還可以作為.global, .ref, .def或.bss等匯編偽指令的操作數(shù)。如: .global label lable1 NOP ADD lab
11、el, B B label1第21頁,共93頁。 符號常數(shù) 符號也可被設(shè)置成常數(shù)值。這樣可以用有意義的名稱來代表一些重要的常數(shù)值,提高程序的可讀性。 例5.1.3 定義符號常數(shù)舉例。 N .set 512 ;定義常數(shù) buffer .set 4*N nzg1 .set 1 nzg2 .set 2 nzg3 .set 3 item .struct ;item結(jié)構(gòu)定義 .int nzg1 ;常數(shù)偏移nzg1=1 .int nzg2 ;常數(shù)偏移nzg2=2 .int nzg3 ;常數(shù)偏移nzg2=3 tang_ning .endstruct array .tag item ;聲明數(shù)組 .bss ar
12、ray, tang_ning*N 第22頁,共93頁。 定義符號常數(shù)(-d選項(xiàng)) 使用-d選項(xiàng)可以將常數(shù)值與一個(gè)符號等同起來。定義以后,在匯編源文件中可用符號代替和它等同的值。-d選項(xiàng)的格式如下: asm500 -d name=value 在匯編源程序中,可以用下表所列的偽指令來檢測符號: 檢測類型 使用的偽指令 存在 不存在 與值相等 與值不相等.if $isdefed(“name”).if $isdefed(“name”)=0.if name=value.if name!=value注意,內(nèi)部函數(shù)$isdefed中的變量必須在雙引號內(nèi)。第23頁,共93頁。 預(yù)先定義的符號常數(shù) 匯編器有若干
13、預(yù)先定義的符號,包括: $,美元符號,代表段程序指針的當(dāng)前值; 寄存器符號包括AR0AR7; _large_model指定存儲器模式。默認(rèn)值為0,由-mk選項(xiàng)可以設(shè)置為1。第24頁,共93頁。 替代符號 可將字符串值(變量)賦給符號,這時(shí)符號名與該變量等效,成為字符串的別名。這種用來代表變量的符號稱為替代符號。當(dāng)匯編器遇到替代符號時(shí),將用字符串值代替它。 可在程序中的任何地方將變量賦給替代符號。例如: .asg “high”,AR2 ;寄存器AR2用high替代第25頁,共93頁。 局部標(biāo)號 局部標(biāo)號是一種特殊的標(biāo)號,使用的范圍和影響是臨時(shí)性的。局部標(biāo)號可用以下方法定義: 用$n來定義,這里n
14、是09的十進(jìn)制數(shù)。 用NAME?定義,其中NAME是任何一個(gè)合法的符號名。第26頁,共93頁。 下面舉例說明局部標(biāo)號$n的格式。該例中假設(shè)符號ADDRA, ADDRB, ADDRC已經(jīng)在前面做了定義。 例5.1.4 合法、非法局部標(biāo)號$n舉例。 合法使用局部標(biāo)號的代碼段 Label1: LD ADDRA, A ;將ADDRA裝入A SUB ADDRB, A ;A減去地址ADDRB BC $1, ALT ;結(jié)果小于0,轉(zhuǎn)到$1 LD ADDRB, A ;否則將ADDRB裝入A B $2 ;轉(zhuǎn)移到$2 $1 LD ADDRA, A ;將ADDRA裝入A $2 ADD ADDRC, A ;加上ADD
15、RC .newblock ;取消$1 的定義,使它可再 次被使用 BC $1, ALT ;若小于0,轉(zhuǎn)移到$1 STL A, ADDRC ;存A低16位 $1 NOP 第27頁,共93頁。 非法使用局部標(biāo)號的代碼段 Label1: LD ADDRA, A SUB ADDRB,A BC $1,ALT LD ADDRB, A B $2 $1 LD ADDRA, A $2 ADD ADDRC, A BC $1, ALT STL A,ADDRC $1 NOP ;錯(cuò)誤, $1 被多次 定義 第28頁,共93頁。 例5.1.5 name?形式的局部標(biāo)號的使用 ; 局部標(biāo)號 mylab 的第一個(gè)定義nopm
16、ylab? nop bmylab?mylab? nop bmylab?maymac .macromylab? nop bmylab? .sect “Secto_One” nopmylab? .word 0 nop nop bmylab? .newblockmylab? .word0 nop nop bmylab?第29頁,共93頁。5.1.4 匯編源程序中的表達(dá)式 表達(dá)式可以是常數(shù)、符號,或者是由算術(shù)運(yùn)算符分開的一系列常數(shù)和符號。有效表達(dá)式值的范圍從-3276832767。影響表達(dá)式計(jì)算順序的因素主要有以下3個(gè): 圓括號()。圓括號內(nèi)的表達(dá)式最先計(jì)算。 優(yōu)先級。見表3.2.2。優(yōu)先級高的先計(jì)算
17、。 從左到右運(yùn)算。具有相同優(yōu)先級的運(yùn)算按從左 到右順序計(jì)算。第30頁,共93頁。 運(yùn)算符 第3章中的表列出了可用在表達(dá)式中的運(yùn)算符。TMS320C54x匯編器使用與C語言相似的優(yōu)先級。 條件表達(dá)式 匯編器支持關(guān)系運(yùn)算符,可以用于任何表達(dá)式,這對條件匯編特別有用。有以下幾種關(guān)系運(yùn)算符: = 等于; = 等于; !=不等于; =大于或等于; 大于;小于 條件表達(dá)式為真是值為1,否則為0。表達(dá)式兩端的 操作數(shù)類型必須相同。第31頁,共93頁。 有效定義的表達(dá)式 某些匯編器要求有效定義的表達(dá)式作為操作數(shù)。操作數(shù)是匯編時(shí)間常數(shù)或鏈接時(shí)可重定位的符號。 例5.1.6 有效定義表達(dá)式. .dataLabel
18、.word0.word1.word2Label.word3X.set50hgoodsym1.set100h+Xgoodsym2.set$goodsym3.setlabel1goodsym4.setlabel2-label2第32頁,共93頁。 .globalYbadsym1.setybadsym2.set50h+Ybadsym3.set50h+zZ.set60h例5.1.7 無效的定義表達(dá)式第33頁,共93頁。 表達(dá)式上溢和下溢 匯編時(shí)執(zhí)行了算術(shù)運(yùn)算以后,匯編器檢查上溢和下溢的條件。無論上溢和下溢的出現(xiàn),它都會(huì)發(fā)出一個(gè)值被截?cái)嗔说木?。匯編器不檢查乘法的溢出狀態(tài)。 可重新定位符號和合法表達(dá)式
19、表5.1.2列出了有關(guān)絕對符號、可重新定位符號,以及外部符號的有效操作。表達(dá)式不能包含可重新定位符號和外部符號的乘或除,表達(dá)式中也不能包含對其他的段可重新定位但不能被分辨的符號。第34頁,共93頁。表5.1.2 帶有關(guān)絕對符號和可重新定位符號的表達(dá)式第35頁,共93頁。 以下例子說明了在表達(dá)式中絕對符號和可重新定位符號的使用。 .global extern_1 ; 定義在外部模塊中 intern_1 .word “D” ; 可重新定位,在現(xiàn)行模塊中定義 LAB1: .set 2 ; LAB1=2不可重新定位(絕對符號) intern_2 ; 可重新定位,在現(xiàn)行模塊中定義第36頁,共93頁。例
20、5.1.8LDextern_1-10, B ;合法LD10-extern_1, B ;不能將可重新定義符號變?yōu)樨?fù)LDextern_1/10, B ;不能將可重新定義符號乘除LDintern_1+extern_1, B;無效的加操作例 5.1.9LDintern_1-intern_2+extern_1, B ;合法LDintern_1+intern_2+extern_1,B ;非法LDintern_1+extern_1-intern_2, B ;非法第37頁,共93頁。5.9 堆棧的使用方法 當(dāng)程序調(diào)用中斷服務(wù)程序或子程序時(shí),需要將程序計(jì)數(shù)器PC值和一些重要的寄存器值進(jìn)行壓棧保護(hù),以便程序返回時(shí)
21、能從間斷處繼續(xù)執(zhí)行。 C54x提供一個(gè)用16位堆棧指正(SP)尋址的軟件堆棧。 當(dāng)向堆棧中壓入數(shù)據(jù)時(shí),堆棧是從高地址向低地址方向填入的。第38頁,共93頁。 如果程序中要用堆棧,必須先進(jìn)行設(shè)置,方法如下: size .set 120 stack .usect “STACK”, size STM #stack+size, SP第39頁,共93頁。 堆棧區(qū)的大小可以按照以下步驟來確定。 先開辟一個(gè)較大的堆棧區(qū),用已知數(shù)重填。 LD # -9224, B STM #length, AR1 MVMM SP, AR4 loop: STL B, *AR4- BANZ loop, *AR1-第40頁,共93
22、頁。 執(zhí)行以上程序后,堆棧區(qū)中的所有單元均重填0DBF8h。 運(yùn)行程序。 檢查堆棧中的數(shù)值。 DBF8DBF8DBF8DBF8DBF8DBF8數(shù)據(jù)RAM圖5.2.1 堆棧區(qū)大小的確定第41頁,共93頁。5.3 控制程序 TMS320C54x具有豐富的程序控制指令,利用這些指令可以執(zhí)行分支轉(zhuǎn)移、子程序調(diào)用、子程序返回、條件操作以及循環(huán)操作等控制操作。第42頁,共93頁。5.3.1 分支操作程序 程序控制中的分支操作包括:分支轉(zhuǎn)移、子程序返回和條件操作。 分支轉(zhuǎn)移程序 通過傳送控制到程序存儲器的其他位置,分支轉(zhuǎn)移會(huì)中斷連續(xù)的指令流。分支轉(zhuǎn)移回影響在PC產(chǎn)生和保存的程序地址。 分支轉(zhuǎn)移操作分成兩種形
23、式:無條件分支轉(zhuǎn)移和條件分支轉(zhuǎn)移,兩者都可以帶延時(shí)操作和不帶延時(shí)操作。如表5.3.1。P149 第43頁,共93頁。 例5.3.1 分支轉(zhuǎn)移舉例 STM #88H, AR0 LD #1000H, A zhangshan: SUB AR0, A BC zhangshan, AGT, AOV第44頁,共93頁。 子程序調(diào)用程序 子程序調(diào)用會(huì)中斷連續(xù)的指令流,但與分支轉(zhuǎn)移不同的是,這種傳送是臨時(shí)的。 當(dāng)函數(shù)的子程序被調(diào)用時(shí),緊跟在調(diào)用后的下一條指令的地址保存在堆棧中。這個(gè)地址用于返回到調(diào)用程序并繼續(xù)執(zhí)行調(diào)用前的程序。 子程序調(diào)用操作分成兩種形式:無條件調(diào)用和條件調(diào)用,兩者都可以帶延時(shí)操作和不帶延時(shí)操
24、作,如表5.3.2。P149第45頁,共93頁。 例5.3.2 子程序調(diào)用舉例 STM #123H, AR0 LD #456H, AR1 CALL new LD AR1, 16, A new: MPY AR0, AR1, A RET第46頁,共93頁。 子程序返回程序 子程序返回程序可以使程序重新再被中斷的連續(xù)指令處繼續(xù)執(zhí)行。返回指令通過彈出堆棧的值到程序計(jì)數(shù)器(PC)來實(shí)現(xiàn)返回功能。 C54x可以執(zhí)行無條件返回和條件返回,并且它們都可以帶延時(shí)或不帶延時(shí),如表5.3.3。p150 第47頁,共93頁。 條件操作程序 C54x的一些指令只有在滿足一個(gè)或多個(gè)條件才被執(zhí)行。 表5.3.4列出了這些指
25、令用到的條件以及對應(yīng)的操作數(shù)符號。 第48頁,共93頁。表5.3.4 條件指令所需的條件和相應(yīng)的操作數(shù)第49頁,共93頁。 在條件操作時(shí)也可以要求多個(gè)條件,只有所有條件滿足時(shí)才被認(rèn)為時(shí)條件滿足。特別注意的是,條件的組合有一定要求和規(guī)律,只有某些組合才有意義。為此,把操作數(shù)分成兩組,每組又分成三類。第50頁,共93頁。 例 5.3.3 條件分支轉(zhuǎn)移 BC sub, BLET CC start, AGET, AOV RC NTC第51頁,共93頁。5.3.2 循環(huán)操作程序 在程序設(shè)計(jì)時(shí),經(jīng)常需要重復(fù)執(zhí)行某一段程序。利用BANZ指令執(zhí)行循環(huán)計(jì)數(shù)和操作是十分方便的。 例5.3.4 計(jì)算 ,主要程序如下
26、: .bss x, 10 .bss y, 1 STM #x, AR1 STM #9, AR2 LD #0, A loop: ADD *AR1+, A BANZ loop, *AR2- STL A, y第52頁,共93頁。5.4 算術(shù)運(yùn)算程序 基本的算術(shù)運(yùn)算程序包括:加減法運(yùn)算、乘法運(yùn)算、除法運(yùn)算、長字和并行運(yùn)算。第53頁,共93頁。5.4.1 加減法運(yùn)算和乘法運(yùn)算 在數(shù)字信號處理中,加法運(yùn)算和乘法運(yùn)算時(shí)最常見的算術(shù)運(yùn)算,下面舉幾個(gè)例子。 例5.4.1 計(jì)算y=ax+b LD # a, T MPY # x, B ADD #b, B STL B, y第54頁,共93頁。 例5.4.2 計(jì)算y=x1
27、a1x2a2 LD #x1, T MPY #a1, B LD #x2, B MAC #a2, B STL B, y STH B, y+1第55頁,共93頁。 例 5.4.3 計(jì)算 .title“example.asm”.mmregsstack.usect“STACK”,10h.bssa,4.bssx,4.bssy,1.defstart.datatable:.word1,2,3,4.word8,6,4,2.textstart:STM#0,SWWSRSTM#STACK+10h,SPSTM#a,AR1RPT#7MVPDtable,*AR1+CALLSUMend:BendSUM:STM#a,AR3ST
28、M#x,AR4RPTZA,#3MAC*AR3+,*AR4+,ASTLA, yRET.end第56頁,共93頁。5.4.2 除法運(yùn)算 在C54x中沒有除法器硬件,也就沒有專門的除法命令。 但是,可以利用一條條件減法指令加上重復(fù)指令“RPT #15”就可以實(shí)現(xiàn)兩個(gè)無符號數(shù)的除法運(yùn)算。 條件減法指令的功能如下: SUBC Smem, src ; (src)-(smem) 15ALU輸出 如果ALU輸出0,則(ALU輸出) 1+1src 否則(src) 1src第57頁,共93頁。 例5.4.4 編寫16 348512的程序段。 .bssnum.1.bssden.1.bssquot.1.datatab
29、le:.word66*32768/10 ;0.66.word-33*32768/10 ;-0.33 .textstart:.STM#num,AR1RPT#1MVPDtable,*AR1+ ;傳送兩個(gè)數(shù)據(jù)至分子、分母單元LD den,16,A ;將分母移到累加器A(3116)MPYA num ;( num )* A(3116)B,獲商的符號 ;在B中第58頁,共93頁。ABSA ;分母取絕對值STHA, den ;分母絕對值送回原處LD num, A ;分子A (3116)ABSA ;分子取絕對值RPT#15 ;16次減重復(fù)SUBC den, A ;XC1,BLT ;如果B0(商是負(fù)數(shù)),則需變
30、號NEGA STLA, quot ;保存商第59頁,共93頁。5.4.3 長字運(yùn)算和并行運(yùn)算 長字指令 C54x可以利用32位長操作數(shù)進(jìn)行長字運(yùn)算。進(jìn)行長字運(yùn)算時(shí),需使用長字運(yùn)算,需使用長字指令,如: DLD Lmem, dst DST src, Lmem DADD Lmem, src, dst DSUB Lmem, src, dst DRSUB Lmem, src, dst 長操作數(shù)指令存在高16位和低16位操作數(shù)在存儲器中的排列方式問題。由于按指令中給出的地址存取的總是高16位操作數(shù),這樣,就有以下兩種排列的方法。第60頁,共93頁。 偶地址排列法:指令中給出的地址為偶地址,存儲器中低地址
31、存放高16位操作數(shù)。 例5.4.5 偶地址排列法舉例 .bssa,2.bssy,2.datatable:.word06CACH, 0BD90H.textSTM#a, AR1RPT#1MVPDtable, *AR1+STM#a, AR3DLD*AR3+, A執(zhí)行前 執(zhí)行后A=00 0000 0000 A=00 6CAC BD90HAR3=0100H AR3=0102H(0100H)= 6CACH (高字) (0100H)= 6CACH(0101H)= BD90H (低字) (0101H)= BD90H第61頁,共93頁。 奇地址排列法:指令中給出的地址為奇地址,存儲器中低地址存放低16位操作數(shù)。
32、 例5.4.6 奇地址排列法舉例 .bssa,2.bssy,2.datatable:.word06CACH,0BD90H.textSTM#a,AR1RPT#1MVPDtable,*AR1-STM#a,AR3DLD*AR3+,A執(zhí)行前 執(zhí)行后A=00 0000 0000 A=00 BD90 6CAC HAR3=0101H AR3=0103H(0100H)= 6CACH(低字) (0100H)= 6CACH(0101H)= BD90H (高字) (0101H)= BD90H第62頁,共93頁。 例5.4.7 計(jì)算Z32=X32+Y32 標(biāo)準(zhǔn)運(yùn)算.bssxhii,1.bssxlo,1.bssyhi,
33、1.bssylo,1.bsszhi,1.bsszlo.1LDxhi,16,AADDSxlo,AADDyhi,16,AADDSylo, ASTHA, zhiSTLA, zlo (6個(gè)字,6個(gè)周期) 長字運(yùn)算.bssxhi,2,1,1.bssyhi,2,1,1.bsszhi,2,1,1 DLDxhi, ADADDyhi, ADSTA, zhi(3個(gè)字,3個(gè)周期)第63頁,共93頁。 并行運(yùn)算 并行運(yùn)算就是同時(shí)利用D總線和E總線兩條參與運(yùn)算。D總線用來執(zhí)行加載或算術(shù)運(yùn)算,E總線用來存放先前的結(jié)果。 并行指令有4種:并行裝載和乘法指令,并行裝載和存儲指令,并行存儲和乘法指令,以及并行存儲和加/減法指令
34、。第64頁,共93頁。 表5.4.2列出了并行運(yùn)算指令的例子 第65頁,共93頁。 例5.4.8 編寫計(jì)算z=x+y 和 f=e+d的程序段 在此程序段中用到了并行加載/存儲指令,即在同一機(jī)器周期內(nèi)利用D總線加載和E總線存儲。 .bssx, 3.bssd, 3STM#x, AR5STM#d, AR2LD#0, ASMLD#AR5+, 16, AADD*AR5+, 16, ASTA, *AR5| LD*AR2+, BADD*AR2+,16,BSTHB, *AR2第66頁,共93頁。 例5.4.9 編寫計(jì)算Z64=W64+X64-Y64的程序段 DLD#w1, ADADD#x1, ADLD#w3,
35、 BADDC#x2, BADD#x3, 16, BDSUB#y1, ADSTA, #z1SUBB#y2, BSUB#y3, 16, BDSTB, #z3 W3 W2 W1 W0 W64+ X3 X2 C X1 X0 X64 - Y3 Y2 C Y1 Y0 Y64 Z3 Z2 Z1 Z0 Z64 由于沒有長字帶進(jìn)(借)位加、減法指令,所以只能用16為位帶進(jìn)(借)位加、減法指令A(yù)DDC和SUBB。第67頁,共93頁。5.5 重復(fù)操作程序 TMS320C54x的重復(fù)操作是使CPU重復(fù)執(zhí)行一條指令或一段指令,可以分為單指令重復(fù)和塊程序重復(fù)。具體來講,使用RPT、RPTZ能重復(fù)下一條指令;而RPTB用于
36、重復(fù)代碼塊若干次。第68頁,共93頁。5.5.1 單指令重復(fù)操作 重復(fù)指令RPT或RPTZ允許重復(fù)執(zhí)行緊隨其后的那一條指令。下一條指令的重復(fù)次數(shù)由該指令的操作數(shù)決定,并且等于操作數(shù)加1。 由于要重復(fù)的指令只需要取指一次,與利用BANZ指令進(jìn)行相比,效率要高。第69頁,共93頁。 例5.5.1 對一個(gè)數(shù)組進(jìn)行初始化: x8=0,0,0,0,0,0,0.bssx, 8STM#x, AR1LD#0, ARPT#7 STLA, *AR1+第70頁,共93頁。5.2.2 塊程序重復(fù)操作 用于塊程序重復(fù)操作指令為RPTB和RPTBD,可以重復(fù)代碼塊N+1次,N是保存在塊重復(fù)計(jì)數(shù)器(BRC)的值。 循環(huán)由S
37、T1狀態(tài)寄存器的塊重復(fù)標(biāo)志位(BRAF)和緊跟在ST1狀態(tài)寄存器后面的存儲器映像寄存器控制。循環(huán)過程如下: 將塊重復(fù)標(biāo)志位置1,激活塊程序重復(fù)循環(huán); 將一個(gè)取指在065535范圍里的循環(huán)次數(shù)N加載到BRC,N的取指應(yīng)當(dāng)比塊循環(huán)次數(shù)少1; 塊重復(fù)指令把塊重復(fù)的起始地址放在塊重復(fù)開始地址寄存器中; 塊重復(fù)指令把塊重復(fù)的末地址放在塊重復(fù)結(jié)束地址寄存器中。第71頁,共93頁。 例5.5.2 對數(shù)據(jù)組x8中的每個(gè)元素加1. .bssx, 8beginLD#1, 16, BSTM#7, BRC STM#x, AR4RPTBnext-1ADD*AR4, 16, B, ASTHA, *AR4+nextLD#0
38、, B第72頁,共93頁。5.5.3 循環(huán)嵌套 在TMS320C54x匯編語言源程序設(shè)計(jì)中,實(shí)現(xiàn)循環(huán)嵌套的一種簡單方法是只在最內(nèi)部的循環(huán)使用RPTBD指令,在所有外部的循環(huán)用BANZD指令。第73頁,共93頁。 下面是一個(gè)三重循環(huán)嵌套結(jié)構(gòu),內(nèi)層、中層和外層三重循環(huán)分別采用RPT、RPTB和BANZ指令,重復(fù)執(zhí)行N、M和L次。 STM #L-1,AR7;2T 外部STM #L-1,BRC;2TRPTB 2nd-1 中間 中間RPT #N-1 內(nèi)部 中間 中間 外部 外部BANZ 1st,*AR7-;4T 3 2 11st:2nd:第74頁,共93頁。 上述三重循環(huán)開銷如表: 循環(huán)指令 開銷(機(jī)器
39、周期數(shù)) 1(內(nèi)層)RPT1 2(中層)RPTB 4+2(加載BRC) 3(外層)BANZ 4N+2(加載AR)第75頁,共93頁。5.6 數(shù)據(jù)塊傳送程序 TMS320C54x的數(shù)據(jù)傳送指令用于數(shù)據(jù)傳送的指令有10條,分別可以實(shí)現(xiàn)數(shù)據(jù)存儲器之間、數(shù)據(jù)存儲器和MMR之間、程序存儲器和數(shù)據(jù)存儲器之間、程序存儲器和數(shù)數(shù)據(jù)存儲器之間的數(shù)據(jù)傳送,見表5.6.1。 第76頁,共93頁。 程序存儲器 數(shù)據(jù)存儲器 重復(fù)執(zhí)行MVPD指令,可以實(shí)現(xiàn)程序存儲器至數(shù)據(jù)存儲器的數(shù)據(jù)傳送,在系統(tǒng)初始化過程中很有用。 例5.6.1 對數(shù)組x8=0,1,2,3,4,5,6,7進(jìn)行初始化.bssx, 8.dataTBL.wor
40、d 0,1,2,3,4,5,6,7.textSTART:STMRPT#7 MVPDTBL, *AR5+第77頁,共93頁。 數(shù)據(jù)存儲器 數(shù)據(jù)存儲器 在數(shù)字信號處理時(shí),經(jīng)常需要將數(shù)據(jù)存儲器中的一批數(shù)據(jù)傳送到數(shù)據(jù)存儲器的另一個(gè)地址空間。 例5.6.2 進(jìn)行N點(diǎn)FFT運(yùn)算時(shí),為節(jié)約存儲空間要用到原位計(jì)算,將數(shù)組x16賦到y(tǒng)16,計(jì)算一個(gè)蝶形后,所得的輸出數(shù)據(jù)可以立即存入原輸入數(shù)據(jù)所占用的存儲單元。 .bssx, 16 .bssy, 16 STM#x,AR2 STM#y,AR3 RPT#15 MVDDAR2+, *AR3+第78頁,共93頁。 程序存儲器 數(shù)據(jù)存儲器 例5.6.3 數(shù)據(jù)存儲器到程序存儲
41、器的數(shù)據(jù)傳送 WRTIE_A: STM#380h,AR1RPT#(128-1)WRITA*AR1+RET第79頁,共93頁。 數(shù)據(jù)存儲器 MMR 例5.6.4 雙操作數(shù)方式實(shí)現(xiàn)IIR高通濾波器 table:.word0;.word0;.word653*32768/10000.word-1306*32768/10000.word653*32768/10000.word-3490*32768/10000.word-600*32768/10000.textstart:SSBXFRCTSTM#x2,AR1RPT#1MVPD#table,*AR1+STM#COEF,AR1RPT#4MVPD#table+
42、2,*AR1+STM#x2,AR3STM#COEF+4,AR4MVMMAR4,AR1STM#3,BKSTM#-1,AR0PORTRPA1,*AR3LD*AR3+0%,16,AMAC*AR3,*AR4,AMAC*AR3+0%,*AR4-,AMAC*AR3+0%,*AR4-,ASTHA,*AR3MPY*AR3+0%,*AR4-,A第80頁,共93頁。MAC*AR3+0%,*AR4-,AMAC*AR3+0%,*AR4-,A STHA,*AR3MVMMAR1,AR4BDIIR1PORTW*AR3,PA0.end第81頁,共93頁。5.7 小數(shù)運(yùn)算程序 兩個(gè)小數(shù)相乘,乘積的結(jié)果是小數(shù)點(diǎn)右側(cè)的位數(shù)增加。因
43、此在小數(shù)乘法時(shí),既可以存儲32位乘積,也可以存儲高16位乘積,從而用較少的資源保存結(jié)果,同時(shí)也利于遞推運(yùn)算。 數(shù)的定標(biāo) 數(shù)的定標(biāo)通常有Q表示法,如Q0、Q1等。Q越大,可以表示的數(shù)的范圍越小,但精度越高。第82頁,共93頁。 小數(shù)的表示方法 C54x采用基于2的補(bǔ)碼小數(shù)表示形式。每個(gè)16位數(shù)用1個(gè)符號位、15-i個(gè)小數(shù)位來表示。2的補(bǔ)碼小數(shù)的每一位的權(quán)值為 MSB LSB-1.2-12-22-32-15第83頁,共93頁。 小數(shù)乘法與冗余符號位 小數(shù)乘法的例子 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 0 0第84頁,共93頁。 上述乘積結(jié)果為7位,當(dāng)將其送到累加器時(shí),為保持乘積的符號,必須進(jìn)行符號位擴(kuò)展,這樣,累加器的值為11101000,出現(xiàn)了冗余符號位。原因是兩個(gè)帶符號位數(shù)相乘,得到的乘積帶有2個(gè)符號位,造成的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 腳手架搭設(shè)專項(xiàng)施工方案
- 個(gè)人小額無抵押借款合同協(xié)議書
- 結(jié)束協(xié)議房地產(chǎn)代理合同
- 蔬菜營銷策略購買合同
- 瓷磚訂購合同模板
- 電子元件采購合同范本
- 購銷紡織品的合同樣本
- 校園多媒體設(shè)備招標(biāo)文件
- 網(wǎng)絡(luò)購銷合同規(guī)范化管理的方法與策略
- 農(nóng)資采購合同的效力問題
- 2024年秋期國家開放大學(xué)《0-3歲嬰幼兒的保育與教育》大作業(yè)及答案
- 2024年就業(yè)保障型定向委培合同3篇
- 2024滬粵版八年級上冊物理期末復(fù)習(xí)全冊知識點(diǎn)考點(diǎn)提綱
- 人教版2024-2025學(xué)年第一學(xué)期八年級物理期末綜合復(fù)習(xí)練習(xí)卷(含答案)
- 殘聯(lián)內(nèi)部審計(jì)計(jì)劃方案
- 2024-2030年中國漫畫行業(yè)發(fā)展趨勢與投資戰(zhàn)略研究研究報(bào)告
- 儺戲面具制作課程設(shè)計(jì)
- 2024年大學(xué)生安全知識競賽題庫及答案(共190題)
- 2024中國華電集團(tuán)限公司校招+社招高頻難、易錯(cuò)點(diǎn)練習(xí)500題附帶答案詳解
- 吊裝作業(yè)施工方案
- 智能工廠梯度培育行動(dòng)實(shí)施方案
評論
0/150
提交評論