39C54x的匯編語言程序設(shè)計_第1頁
39C54x的匯編語言程序設(shè)計_第2頁
39C54x的匯編語言程序設(shè)計_第3頁
39C54x的匯編語言程序設(shè)計_第4頁
39C54x的匯編語言程序設(shè)計_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第5章TMS320C54x匯編語言程序設(shè)計內(nèi)容提要匯編語言程序設(shè)計是應(yīng)用軟件設(shè)計的基礎(chǔ),主要任務(wù)是利用匯編指令和偽指令編寫源程序以完成指定的功能。本章將結(jié)合例子介紹TMS320C54x匯編語言源程序設(shè)計的基本方法,涉及的內(nèi)容包括:匯編語言源程序的格式常數(shù)、字符串、符號和表達式的規(guī)定堆棧的使用方法分支、調(diào)用、返回控制程序加法、乘法、除法、長字和并行運算程序單指令、塊重復(fù)、循環(huán)嵌套等重復(fù)操作程序數(shù)據(jù)塊傳送程序小數(shù)運算程序和浮點運算程序5.1概述TMS320C54x匯編語言源程序由源語句組成。這些語句可以包含匯編語言指令、匯編偽指令和注釋。程序的編寫必須符合一定的格式,以便匯編器將源文件轉(zhuǎn)換成機器語言的目標(biāo)文件。本節(jié)將介紹匯編語言源程序的格式、各種常數(shù)、符號、字符串和表達式的規(guī)定。匯編語言程序以.asm為擴展名,可以用任意的編輯器編寫源文件。一條語句占源程序的一行,長度可以是源文件編輯器格式允許的長度,但匯編器每行最多讀200個字符。因此,語句的執(zhí)行部分必須限制在200個字符以內(nèi)。5.1.1匯編語言源程序格式1.源文件格式助記符指令源語句的每一行通常包含4個部分:標(biāo)號區(qū)、助記符區(qū)、操作數(shù)區(qū)和注釋區(qū)。助記符指令語法格式:[標(biāo)號][:]助記符[操作數(shù)][;注釋]【例5.1.1】助記符指令源語句舉例。語句的書寫規(guī)則:①所有語句必須以標(biāo)號、空格、星號或分號(*或;)開始;②標(biāo)號是可選項,若使用標(biāo)號,則標(biāo)號必須從第一列開始;③所有包含有匯編偽指令的語句必須在一行完成指定;④各部分之間必須用空格分開,Tab字符與空格等效;⑤程序中注釋是可選項。如果注釋在第一列開始時,前面必須標(biāo)上星號或分號,在其他列開始的注釋前面必須以分號開頭;⑥如果源程序很長,需要書寫若干行,可以在前一行用反斜杠字符(\)結(jié)束,余下部分接著在下一行繼續(xù)書寫。2.標(biāo)號所有匯編指令和大多數(shù)匯編偽指令都可以選用標(biāo)號,供本程序或其它程序調(diào)用。①標(biāo)號必須從語句的第1列寫起,其后的冒號“:”可任選;②標(biāo)號為任選項,若不使用標(biāo)號,則語句的第一列必須是空格、星號或分號;③標(biāo)號是由字母、數(shù)字以及下劃線和美元符號等組成,最多可達32個字符;④標(biāo)號分大小寫,且第一個字符不能是數(shù)字。在使用標(biāo)號時,標(biāo)號的值是段程序計數(shù)器SPC的當(dāng)前值。例如,若使用.word偽指令初始化幾個字,則標(biāo)號將指到第一個字?!纠?.1.2】標(biāo)號格式舉例?!?000000;假設(shè)匯編了某個其他代碼10000040000AStart:.word0Ah,3,70000410003└──標(biāo)號,值為40h00004200073.助記符助記符用來表示指令所完成的操作,可以是匯編語言指令、匯編偽指令、宏偽指令。助記符指令:一般用大寫,不能從第一列開始;匯編偽指令:用來為程序提供數(shù)據(jù)和控制匯編進程。以句號“.”開始,且用小寫;宏偽指令:用來定義一段程序,以便宏調(diào)用來調(diào)用這段程序。以句號“.”開始,且用小寫;宏調(diào)用:用來調(diào)用由宏偽指令定義的程序段。4.操作數(shù)操作數(shù)是指指令中參與操作的數(shù)值或匯編偽指令定義的內(nèi)容,緊跟在助記符的后面,由一個或多個空格分開。操作數(shù)之間必須用逗號“,”分隔;操作數(shù)可以是常數(shù)、符號或表達式;操作數(shù)中的常數(shù)、符號或表達式可用來作為地址、立即數(shù)或間接地址;(1)指令的操作數(shù)前綴匯編器允許指定的常數(shù)、符號或表達式作為地址、立即數(shù)或間接地址。作為操作數(shù)的前綴有三種情況:使用“#”符號作為操作數(shù)的前綴;使用“*”符號作為操作數(shù)的前綴;使用“@”符號作為操作數(shù)的前綴。①用“#”作前綴使用“#”號作為前綴,匯編器將操作數(shù)作為立即數(shù)處理。即使操作數(shù)是寄存器或地址,也將作為立即數(shù)。如果操作數(shù)是地址,匯編器將把地址處理為一個數(shù)值,而不使用地址的內(nèi)容。例如:Label:ADD#99,B操作數(shù)#99是一個立即數(shù)。②用“*”作前綴使用“*”符號作為前綴,匯編器將操作數(shù)作為間接地址,即把操作數(shù)的內(nèi)容作為地址。例如:Label:LD*AR3,B操作數(shù)*AR3指定一個間接地址。該指令將引導(dǎo)匯編器找到寄存器AR3的內(nèi)容作為地址,然后將該地址中的內(nèi)容裝入指定的累加器B中。③用“@”作前綴使用“@”符號作為前綴,匯編器將操作數(shù)作為直接地址,即操作數(shù)由直接地址碼賦值。例如:Label:LD@x,A只要DP=0,將直接地址x中的內(nèi)容裝入指定的累加器A中。4.操作數(shù)(2)偽指令的立即數(shù)將“#”加在數(shù)值之前而構(gòu)成的立即數(shù)方式,主要用在指令中。例如:SUB#18,B;操作數(shù)#18為立即數(shù)通常,立即數(shù)在偽指令中用的較少,但在某些情況下,立即數(shù)也可以作為偽指令的操作數(shù)。例如:.byte18立即數(shù)方式?jīng)]有使用,但匯編器認為操作數(shù)是一個數(shù)值18(即立即數(shù)),用18數(shù)值初始化一個字節(jié)。5.注釋用來說明指令功能的文字,便于用戶閱讀。注釋可位于句首或句尾,位于句首時,以“*”或“;”開始,位于句尾時,以分號“;”開始。注釋可單獨一行或數(shù)行;注釋是任選項。例如:1100000.bsssym,;保留空間于.bss***************************************改變段,允許第五個‘mylab’定義***************************************5.1.2匯編語言中的常數(shù)與字符串匯編器可支持7種類型的常數(shù)(常量)。數(shù)據(jù)類型舉例說明二進制1110001b或1110001B

八進制226q或572Q

十進制1234或+1234或-11234缺省型十六進制0A40h或0A40H或0xA40

浮點數(shù)1.623e-23僅用于C語言字符‘D’

字符串“thisisastring”

1.二進制整數(shù)二進制整型常量最多由16位二進制數(shù)字(0或1)組成,后綴為B(或b)。如果數(shù)字小于16位,匯編器將其右邊對齊,并在前面補零。例如:10001000B136(十進制)或88(十六進制)0111100b60(十進制)或3C(十六進制)10b2(十進制)或2(十六進制)10001111B143(十進制)或8F(十六進制)2.八進制整數(shù)八進制整型常量最多由6位的八進制數(shù)字(0到7)組成,后綴為Q(或q)或前綴為0(零)。例如:100011Q32777(十進制)或8009(十六進制)124q84(十進制)或54(十六進制)八進制常數(shù)也可使用C語言的記號,即加前綴0。010001132777(十進制)或8009(十六進制)012484(十進制)或54(十六進制)3.十進制整數(shù)十進制整型常量由十進制數(shù)字串組成,無后綴。取值范圍為:-32768~32767或0~65535。例如:21182118(十進制)或846(十六進制)6553565535(十進制)或0FFFF(十六進制)-32768-32768(十進制)或8000(十六進制)4.十六進制整數(shù)十六進制整型常量最多由4位十六進制數(shù)字組成,帶后綴H(或h)。它必須以數(shù)字(0~9)開始,也可以加前綴0x。例如:0DH14(十進制)或000D(十六進制)12BCH4796(十進制)或12BC(十六進制)十六進制常數(shù)也可用C語言記號,即加前綴0x。0x0D14(十進制)或000D(十六進制)0x12BC4796(十進制)或12BC(十六進制)5.浮點數(shù)浮點整型常量由一串十進制數(shù)字組成,可以帶小數(shù)點、分數(shù)和指數(shù)部分。浮點數(shù)的表示方法:[±][n].[n][E|e][±][n]n,為一串十進制數(shù),浮點數(shù)前可帶加減號(+或-),且小數(shù)點必須指定。例如:99.e9——有效的數(shù);99e9——非法。合法:.314,3.14,-.314e-19。6.匯編時間常數(shù)在程序中使用.set偽指令給一個符號賦值,該符號就成為一個匯編時間常數(shù),等效于一個常數(shù)。為了使用表達式中的常數(shù),賦給符號的必須是絕對值。例如:將常數(shù)值18賦給符號bei_hua。bei_hua.set18LD#bei_hua,A也可以用.set偽指令將符號常數(shù)賦給寄存器名。此時,該符號變成了寄存器的替代名。例如:AuxRl.setARlMVMMAuxRl,SP注意:常量不能進行符號擴展。如:0ACH等于十六進制的00AC或十進制172,不等于-84。7.字符常數(shù)字符常數(shù)是包括在單引號內(nèi)的字符串。若單引號之間沒有字符,則值為0。每個字符在內(nèi)部表示為8位ASCII碼。例如:‘a(chǎn)’內(nèi)部表示為61h‘B’內(nèi)部表示為42h8.字符串字符串是由雙引號括起來的一串字符,最大長度是可以變化的,由要求字符串的偽指令來設(shè)置。字符在內(nèi)部用8位ASCII碼來表示。例如:“example”定義了一個長度為7的字符串:example8.字符串字符串可用于下列偽指令中:.copy——作為復(fù)制偽指令中的文件名.sect——作為命名段偽指令中的段名.setsect——作為該偽指令中的段地址.byte——作為數(shù)據(jù)初始化偽指令中的變量名.string——作為該偽指令的操作數(shù)注意:字符常數(shù)與字符串的差別。字符常數(shù)代表單個整數(shù)值。字符串只是一串字符。5.1.3匯編源程序中的符號匯編程序中的符號用于標(biāo)號、常數(shù)和替代字符。1、由字母、數(shù)字以及下劃線和美元符號(A~Z,a~z,0~9,_和$)等組成;2、符號名最多可長達200個字符;3、在符號中,第1位不能是數(shù)字,并且符號中不能含空格。1.標(biāo)號作為標(biāo)號的符號代表在程序中對應(yīng)位置的符號地址。通常,標(biāo)號是局部變量,在一個文件中局部使用的標(biāo)號必須是唯一的。助記符操作碼和匯編偽指令名(不帶前綴“.”)為有效標(biāo)號。標(biāo)號分大小寫。例如:ABC,Abc,abc是3個不同的符號。在調(diào)用匯編器時使用-c選項,可以不分大小寫。標(biāo)號還可以作為.global,.ref,.def或.bss等匯編偽指令的操作數(shù)。如:.globallabellable1NOPADDlabel,BBlabel12.符號常數(shù)符號也可被設(shè)置成常數(shù)值。為了提高程序的可讀性,可以用有意義的名稱來代表一些重要的常數(shù)值。偽指令.set和.struct/.tag/.endstruct可以用來將常數(shù)賦給符號名。注意:符號常數(shù)不能被重新定義。【例5.1.3】定義符號常數(shù)舉例。N.set512;定義常數(shù)buffer.set4*Nnzg1.set1nzg2.set2nzg3.set3item.struct;item結(jié)構(gòu)定義.intnzg1;常數(shù)偏移nzg1=1.intnzg2;常數(shù)偏移nzg2=2.intnzg3;常數(shù)偏移nzg2=3tang.endstructarray.tagitem;聲明數(shù)組.bssarray,tang*N3.定義符號常數(shù)使用-d選項可以將常數(shù)值與一個符號等同起來。定義符號常數(shù)后,在匯編源文件中可用符號代替和它等同的值。定義格式:asm500-dname=[value]匯編命令匯編選項符號名稱符號的值若value省略,則符號的值設(shè)置為l。檢測類型及偽指令檢測類型使用的偽指令存在不存在與值相等與值不等.if$isdefed("name").if$isdefed("name")=0.ifname=value.ifname!=value注意:內(nèi)部函數(shù)$isdefed中的變量必須括在雙引號內(nèi)。引號表明變量按字面解釋而不是作為替代字符。4.預(yù)先定義的符號常數(shù)匯編器有若干預(yù)先定義符號,包括:①美元符號$,代表段程序指針SPC的當(dāng)前值;②映像寄存器符號,包括AR0~AR7;③映像寄存器由匯編器設(shè)置為符號。用于指定存儲器模式。由-mk選項設(shè)置,默認值為0。5.替代符號可將字符串值(變量)賦給符號,使符號名與該變量等效,成為字符串的別名,這種用來代表變量的符號稱為替代符號。當(dāng)匯編器遇到替代符號時,將用字符串值替代符號。和符號常數(shù)不同,替代符號可以被重新定義??稍诔绦蛑械娜魏蔚胤綄⒆兞抠x給替代符號。例如:.asg"high",AR2;寄存器AR25.局部標(biāo)號局部標(biāo)號是一種特殊的標(biāo)號,使用的范圍和影響是臨時性的。定義方法:①用$n來定義。n是0~9的十進制數(shù);②用NAME?定義。NAME是任何一個合法的符號名。匯編器用緊隨其后一個唯一數(shù)值的句點代替問號。注意:局部標(biāo)號不能用偽指令來定義。局部標(biāo)號可以被取消定義,并可以再次被定義或自動產(chǎn)生。取消局部變量的方法:①使用.newblock偽指令;②使用偽指令.sect,.text或.data改變段;③使用偽指令.include或.copy,進入include文件;④達到include文件的結(jié)尾,離開include文件?!纠?.1.4】合法、非法局部標(biāo)號$n舉例。假設(shè)符號ADDRA,ADDRB,ADDRC已經(jīng)在前面作了定義。Label1:LDADDRA,A;將ADDRA裝入累加器ASUBADDRB,A;減去地址BBC$1,ALT;如果小于0,分支轉(zhuǎn)移到$1LDADDRB,A;否則將ADDRB裝入累加器AB$2;分支轉(zhuǎn)移到$2$1LDADDRA,A;$1:將ADDRA裝入累加器A$2ADDADDRC,A;$2:加上ADDRC.newblock;取消$1的定義,使它可被再次使用BC$1,ALT;若小于0,分支轉(zhuǎn)移到$1STLA,ADDRC;存ACC的低16位到ADDRC$1NOP、、、、、、、、、、、錯誤、、、、、、、、、、、、、、、、、、、、沒有.newblockBC$1,ALT;若小于0,分支轉(zhuǎn)移到$1STLA,ADDRC;存ACC的低16位到ADDRC$1NOP;錯誤:$1被多次定義、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、【例5.1.5】name?形式的局部標(biāo)號的使用方法。;局部標(biāo)號’mylab’的第1個定義NOPmylab?NOPBmylab?.copy“a.inc”;包括文件中有‘mylab’第2次定義mylab?NOP;從包括文件中退出復(fù)位后,‘mylab’的第3個定義Bmylab?;在宏中‘mylab’的第4個定義,;為了避免沖突,宏使用不同的名稱空間maymac.macromylab?NOPBmylab?.endmmymac;宏調(diào)用。引用‘mylab'的第3個定義Bmylab?;既不被宏調(diào)用復(fù)位,也不與定義在宏中的相同名沖突;改變段,允許‘mylab'的第5個定義.sect“Secto_One”NOPmylab?.word0NOPNOPBmylab?;.newblock偽指令,允許‘mylab'的第6個定義.newblockmylab?.word0NOPNOPBmylab?5.1.4匯編源程序中的表達式表達式可以是常數(shù)、符號,或者是由算術(shù)運算符分開的一系列常數(shù)和符號。有效表達式的值:-32768~32767影響表達式的主要因素:①圓括號()。圓括號內(nèi)的表達式最先計算;不能用大括號{}或中括號[]代替圓括號()。②優(yōu)先級?!疌54x匯編器使用與C語言相似的優(yōu)先級,優(yōu)先級高的先計算;③從左到右運算。具有相同的優(yōu)先級,按從左到右的順序計算。序號符號運算操作求值順序1+-~!取正、取負、按位求補、邏輯負從右至左2*/%乘法、除法、求模從左至右3+-加法、減法從左至右4^指數(shù)從左到右5<<>>左移、右移從左至右6<<=小于、小于等于從左至右7>>=大于、大于等于從左至右8!==不等于、等于從左至右9&按位與運算從左至右10∧按位異或運算從左至右11|按位或運算從左至右1.運算符’C54x匯編器使用與C語言相似的優(yōu)先級。取正(+)、負(-)和乘(*)比二進制形式有較高的優(yōu)先級。2.條件表達式匯編器支持關(guān)系運算符,可以用于任何表達式。=等于==等于!=不等于>=大于或等于<=小于或等于>大于<小于3.有效定義的表達式某些匯編器要求有效定義的表達式作為操作數(shù)。操作數(shù)是匯編時間常數(shù)或鏈接時可重定位的符號。有效定義的表達式是指表達式中的符號或匯編時間常數(shù)在表達式之前就已經(jīng)被定義。有效定義的表達式的計算必須是絕對的。【例5.1.6】有效定義的表達式。.datalabel1.word0;將16位值0,1,2放入標(biāo)號為label1的當(dāng)前段連續(xù)字.word1.word2label2.word3;將3放入標(biāo)號為label2的字中X.set50h;定義X的值goodsym1.setl00h+X;有效定義的表達式goodsym2.set$;引用已定義的所有局部標(biāo)號goodsym3.setlabel1goodsym4.setlabel2-label1;有效定義的表達式【例5.1.7】無效定義的表達式。.globalY;定義Y為全局外部符號badsym1.setY;Y在當(dāng)前文件中未定義badsym2.set50h+Y;無效的表達式badsym3.set50h+Z;無效的表達式,Z還未定義Z.set60h;定義Z,但應(yīng)在表達式使用之前4.表達式上溢和下溢匯編時執(zhí)行了算術(shù)操作以后,匯編器檢查上溢和下溢的條件。當(dāng)出現(xiàn)上溢或下溢時,匯編器會發(fā)出一個值被截斷了的警告。匯編器不檢查乘法的溢出狀態(tài)。5.可重新定位符號和合法表達式對于絕對符號、可重新定位符號以及外部符號的有效操作,可參見下表。帶有絕對符號和可重新定位符號的表達式如果A為…并且B為…A+B為…A-B為…絕對絕對絕對可重新定位可重新定位可重新定位外部外部外部絕對外部可重新定位絕對可重新定位外部絕對可重新定位外部絕對外部可重新定位可重新定位非法非法外部非法非法絕對非法非法可重新定位絕對非法外部非法非法表達式不能包含可重新定位符號和外部符號的乘或除;表達式中不能含有對其他的段為可重新定位的符號;用.global偽指令定義為全局的符號和寄存器也可以用在表達式中。這些符號和寄存器被聲明為外部符號;可重新定位的寄存器也可以用在表達式中,這些寄存器的地址相對于定義它們的寄存器段是可重新定位的,除非將它們聲明為外部符號?!纠纭浚涸谙旅娴某绦蛑?,使用了4個定義在相同段的符號。.globalextern_1;定義在外部的全局符號intern_1:.word‘’’D’;定義在現(xiàn)行模塊中,可重新定位LAB1:.set2;LAB1=2,絕對符號intern_2:.word3;定義在現(xiàn)行模塊中,可重新定位LD#LAB1+((5+4)*3),A;LAB1為絕對符號,A=29LD#LAB1+3+(4*7),A;LAB1為絕對符號,A=33所有合法表達式可以化簡為兩種形式:①可重新定位符號±絕對符號;②絕對符號。單操作數(shù)運算僅能應(yīng)用于絕對符號,不能應(yīng)用于可重新定位符號。表達式簡化為僅含有可重新定位符號是非法的。【例5.1.8】判斷下列指令中表達式的合法性。LDextern_1-10,B合法└──可重新定位LD10-extern_1,B非法└──不可將重新定位符號變負LD-(intern_1),B非法└──可重新定位符號不可變負LDextern_1/10,B非法└──可重新定位符號不可乘除LDintern_1+extern_1,B非法└──可重新定位+可重新定位=非法【例5.1.9】判斷下列指令中表達式的合法性。LDintern_1-intern_2+extern_1,B可重新定位可重新定位可重新定義-可重新定義=絕對符號絕對符號可重新定位絕對符號+可重新定位→合法LDintern_1+intern_2+extern_1,B非法可重新定義+可重新定義=非法♂LDintern_1+extern_1-intern_2,B非法可重新定義+可重新定義=非法♂5.2堆棧的使用方法當(dāng)程序調(diào)用中斷服務(wù)程序或子程序時,需要將程序計數(shù)器PC的值和一些重要的寄存器值進行壓棧保護,以便程序返回時能從間斷處繼續(xù)執(zhí)行?!疌54x提供一個用16位堆棧指針SP尋址的軟件堆棧。當(dāng)向堆棧中壓入數(shù)據(jù)時,堆棧是從高地址向低地址方向填入,堆棧指針SP先減1,然后將數(shù)據(jù)壓入堆棧。當(dāng)從堆棧中彈出數(shù)據(jù)時。數(shù)據(jù)先從堆棧中彈出,然后堆棧指針SP加1。1.堆棧的設(shè)置若程序中要使用堆棧,必須先進行設(shè)置,如:size.set120在RAM中定義一個STACKtack.usect“STACK”,size的保留空間,共120個單元STM#stack+size,SP保留區(qū)的高地址賦給SP,作為堆棧的棧底在數(shù)據(jù)RAM空間開辟一個堆棧區(qū)。設(shè)置堆棧指針,#stack+size→SP。設(shè)置好堆棧后,就可以使用堆棧了,如:CALLpmad;(SP)-1→SP,(PC)+2→TOS,pmad→PCRET;(TOS)→PC,(SP)+1→SP2.堆棧區(qū)大小的確定堆棧區(qū)的大小可以按照以下步驟來確定:①先開辟一個較大的堆棧區(qū),用已知數(shù)充填,如:LD#-9224,B;堆棧區(qū)要充填的數(shù)0DBF8h加載BSTM#length,AR1;設(shè)置循環(huán)次數(shù)MVMMSP,AR4;設(shè)置數(shù)據(jù)指針AR4,SP→AR4loop:STLB,*AR4-;循環(huán),充填數(shù)據(jù)BANZloop,*AR1-堆棧區(qū)的大小可以按照以下步驟來確定:①先開辟一個較大的堆棧區(qū),用已知數(shù)充填。②運行程序,執(zhí)行所有堆棧操作。③檢查堆棧中的數(shù)值。用過的堆棧區(qū)就是實際需要的堆棧空間。5.3控制程序’C54x具有豐富的程序控制指令,利用這些指令可以執(zhí)行分支轉(zhuǎn)移、子程序調(diào)用、子程序返回,條件執(zhí)行以及循環(huán)等控制操作。5.3.1分支操作程序程序控制中的分支操作包括:分支轉(zhuǎn)移程序子程序調(diào)用子程序返回條件操作程序通過傳送控制到程序存儲器的其他位置,分支轉(zhuǎn)移會中斷連續(xù)的指令流。分支轉(zhuǎn)移指令可以改寫PC值,使程序改變流向。其指令分為無條件分支轉(zhuǎn)移和條件分支轉(zhuǎn)移兩類。兩者都可以帶延時操作和不帶延時操作。分支轉(zhuǎn)移指令分類指令說明無條件分支轉(zhuǎn)移B[D]用該指令指定的地址加載PCBACC[D]用累加器的低16位指定的地址加載PC條件分支轉(zhuǎn)移BC[D]若滿足指令給定條件,用該指令指定的地址加載PCBANG[D]若當(dāng)前選擇輔助寄存器不等于0,用該指令指定的地址加載PC遠程分支轉(zhuǎn)移FB[D]用該指令指定的地址加載PC和XPCFBACC[D]用累加器的低23位指定的地址加載PC和XPC無條件分支轉(zhuǎn)移:無條件執(zhí)行分支轉(zhuǎn)移;條件分支轉(zhuǎn)移:要在滿足用戶一個或多個條件時才執(zhí)行分支轉(zhuǎn)移;遠程分支轉(zhuǎn)移:允許分支轉(zhuǎn)移到擴展存儲器?!纠?.3.1】分支轉(zhuǎn)移舉例。STM#88H,AR0;將操作數(shù)#88H裝入AR0LD#1000H,A;將操作數(shù)#1000H裝入ACCzhong:SUBAR0,A;將A中的內(nèi)容減去AR0中的;內(nèi)容結(jié)果裝入ABCzhong,AGT,AOV;若累加器A>0且溢出,;則轉(zhuǎn)至zhong,否則往下執(zhí)行與分支轉(zhuǎn)移一樣,通過傳送控制到程序存儲器的其他位置,子程序調(diào)用會中斷連續(xù)的指令流。但是與分支轉(zhuǎn)移不同的是,這種傳送是臨時的。當(dāng)函數(shù)的子程序被調(diào)用時,緊跟在調(diào)用后的下一條指令的地址保存在堆棧中。這個地址用于返回到調(diào)用程序并繼續(xù)執(zhí)行調(diào)用前的程序。子程序調(diào)用操作分成兩種形式:無條件調(diào)用和條件調(diào)用,兩者都可以帶延時操作和不帶延時操作。2.子程序調(diào)用程序子程序調(diào)用指令分類指令說明無條件調(diào)用CALL[D]將返回的地址壓入堆棧,并用該指令指定的地址加載PCCALA[D]將返回的地址壓入堆棧,用累加器A或B指定的地址加載PC條件調(diào)用CC[D]如果滿足指令給定條件,將返回的地址壓入堆棧,并用該指令指定的地址加載PC遠程調(diào)用FCALL[D]將XPC和PC壓入堆棧,并用該指令指定的地址加載PC和XPCFCALA[D]將XPC和PC壓入堆棧,用累加器的低23位指定的地址加載PC和XPC無條件調(diào)用是指無條件執(zhí)行調(diào)用。條件調(diào)用和無條件調(diào)用操作相同,但是條件調(diào)用要在滿足一個或多個條件時才執(zhí)行調(diào)用。遠程調(diào)用允許對擴展存儲器的子程序或函數(shù)進行調(diào)用?!纠?.3.2】子程序調(diào)用舉例。STM#123H,AR0;將操作數(shù)#123H裝入AR0LD#456H,AR1;將操作數(shù)#456H裝入AR1CALLnew;調(diào)子程序newLDAR1,16,A;將AR1的內(nèi)容左移16位后裝入Anew:MPYAR0,AR1,A;AR0與AR1的內(nèi)容相乘,結(jié)果放入A中RET;子程序返回3.子程序返回程序子程序返回程序可以使程序重新在被中斷的連續(xù)指令處繼續(xù)執(zhí)行。返回指令通過將彈出堆棧的值(包含將要執(zhí)行的下一條指令的地址),送到程序計數(shù)器PC來實現(xiàn)返回功能?!疌54x可以執(zhí)行無條件返回和條件返回,并且它們都可以帶延時或不帶延時操作。子程序返回指令分類指令說明無條件返回RET[D]將堆棧頂部的返回地址加載到PC。RETE[D]將堆棧頂部的返回地址加載到PC,并使能可屏蔽中斷。RETF[D]將RTN寄存器中的返回地址加載到PC,并使能可屏蔽中斷。條件返回RC[D]如果滿足指令給定條件,將堆棧頂部的返回地址加載到PC。遠程返回FCALL[D]將堆棧頂部的值彈出加載到XPC,將堆棧中下一個值彈出加載到PC。FCALA[D]將堆棧頂部的值彈出加載到XPC,將堆棧中下一個值彈出加載到PC,并使能可屏蔽中斷。3.子程序程序無條件返回是無條件執(zhí)行返回操作。條件返回可以給予被調(diào)用函數(shù)或中斷服務(wù)程序(ISR)更多的返回方式,以便根據(jù)被處理的數(shù)據(jù)選擇返回路徑,通過使用條件返回指令來實現(xiàn)返回。遠程返回允許從擴展存儲器的子程序或函數(shù)返回。5.3.1分支操作’C54x的一些指令只有在滿足一個或是多個條件后才被執(zhí)行,如條件分支轉(zhuǎn)移、條件調(diào)用和條件返回等指令。這些指令都用條件來限制分支轉(zhuǎn)移、調(diào)用和返回操作。這些條件可用條件算符來表示。4.條件操作程序條件算符操作符號條件說明操作符號條件說明AEQA=0累加器A等于0AOVAOV=1累加器A溢出BEQB=0累加器B等于0BOVBOV=1累加器B溢出ANEQA10累加器A不等于0ANOVAOV=0累加器A不溢出BNEQB10累加器B不等于0BNOVBOV=0累加器B不溢出ALTA<0累加器A小于0CC=1ALU進位位置1BLTB<0累加器B小于0NCC=0ALU進位位置0ALEQA£0累加器A小于等于0TCTC=1測試/控制標(biāo)志位置1BLEQB£0累加器B小于等于0NTCTC=0測試/控制標(biāo)志位置0AGTA>0累加器A大于0BIOBIO低BIO信號電平為低BGTB>0累加器B大于0NBIOBIO高BIO信號電平為高AGEQA30累加器A大于等于0UNC無無條件操作BGEQB30累加器B大于等于0

在條件操作時也可以要求有多個條件,只有所有條件滿足時才被認為是滿足條件。這種多個條件的組合就構(gòu)成了指令的多重條件。多重條件算符第1組第2組A類B類A類B類C類EQNEQLEQGEQLTGTOVNOVTCNTCCNCBIONBIO選用多重條件時應(yīng)當(dāng)注意以下幾點:①第1組:分為兩類,最多可選擇兩個條件,組內(nèi)兩類條件可以與/或構(gòu)成多重條件,但不能用組內(nèi)同類條件構(gòu)成與/或多重條件。當(dāng)選擇兩個條件時,累加器必須是同一個。例如,可以同時選擇AGT和AOV,但不能同時選擇AGT和BOV。②第2組:分為三類,最多可選三個條件,可以在每類中各選一個條件進行與/或構(gòu)成多重條件,但不能在同類選兩個以上條件。例如,可以同時測試TC、C和BIO,但不能同時測試NTC、C和NC。③組與組之間可用或構(gòu)成多重條件?!纠?.3.3】條件操作程序。BCsub,BLEQ;條件分支轉(zhuǎn)移若累加器B≤0,則轉(zhuǎn)至sub,否則,往下執(zhí)行CCstart,AGEQ,AOV;條件調(diào)用若累加器A≥0且溢出,則調(diào)用start,否則往下執(zhí)行RCNTC;條件返回若TC=0,則返回,否則往下執(zhí)行【注意】:若需要多個條件相與時,用單條指令表示。如:BCnew,AGT,AOV轉(zhuǎn)移條件:AGT和AOV的與邏輯若需要兩個條件相或時,需用兩條指令分別表示。如:若累加器A大于0或溢出,則轉(zhuǎn)移至sub轉(zhuǎn)移條件:AGT和AOV的或邏輯BCsub,AGTBCsub,AOV5.3.1分支操作程序5.比較轉(zhuǎn)移程序利用比較指令CMPR可實現(xiàn)比較轉(zhuǎn)移操作。比較操作指令:CMPR測試條件,輔助寄存器ARx指令功能:輔助寄存器ARx與AR0進行比較,若比較結(jié)果使所給定的測試條件成立,則TC位置1。實現(xiàn)方法:①通過CMPR的比較結(jié)果得TC值;②根據(jù)TC值,由條件轉(zhuǎn)移指令實現(xiàn)分支轉(zhuǎn)移。例如:比較操作后條件分支轉(zhuǎn)移STM#5,AR1;AR1=5STM#10,AR0;AR0=10loop:……*AR1+;AR1=AR1+1……CMPRLT,AR1;若AR1-AR0<0,則TC=1,否則為0BCloop,TC;若AR1-AR0<0,則循環(huán)若AR1=AR0,則順序執(zhí)行5.3.2循環(huán)操作程序在程序設(shè)計時,經(jīng)常需要重復(fù)執(zhí)行某一段程序。利用BANZ(當(dāng)輔助寄存器不為0時轉(zhuǎn)移)指令可實現(xiàn)循環(huán)計數(shù)和操作。循環(huán)操作指令:BANZ轉(zhuǎn)移地址,輔助寄存器指令功能:當(dāng)輔助寄存器不為0時,則轉(zhuǎn)至轉(zhuǎn)移地址,否則順序執(zhí)行?!纠?.3.4】用AR2作為循環(huán)計數(shù)器,由BANZ實現(xiàn)程序的循環(huán)控制。.bssx,10;給x保留10個空間.bssy,1;給y保留1個空間STM#x,AR1;設(shè)置數(shù)據(jù)段的首地址STM#9,AR2;設(shè)置循環(huán)計數(shù)值LD#0,A;累加器清0loop:ADD*AR1+,A;累加運算,并修改地址BANZloop,*AR2-;若計數(shù)值不為0,則循環(huán),并計數(shù)值減1若計數(shù)值為0,則結(jié)束循環(huán)STLA,@y;累加和存入y中注意:BANZloop,*AR2-;先判斷,再修正AR2=AR2-15.4算術(shù)運算程序基本算術(shù)運算包括:加減法和乘法運算除法運算長字和并行運算5.4.1加、減法和乘法在數(shù)字信號處理中,加法和乘法運算是最常見的算術(shù)運算?!纠坑嬎銀=a×x+b程序:LD@a,T;取a值,T=aMPY@x,B;完成ax乘積,B=axADD@b,B;完成ax+b運算,B=ax+bSTLB,@y;計算結(jié)果存入y中【例】計算y=xl×al+x2×a2程序:LD@x1,T;T=x1MPY@a1,B;B=x1a1LD@x2,T;T=x2MAC@a2,B;乘法累加,B=x1a1+x2a2STLB,@y;計算結(jié)果的低字BL存入y中STHB,@y+1;計算結(jié)果的高字BH存入y+1中【例5.4.3】計算程序:*********************************************example.asm*********************************************.title“example.asm”.mmregsstack.usect“STACK”,10h;為堆棧指定空間.bssa,4;為變量分配9個字的空間.bssx,4.bssy,1.defstart.datatable:.word1,2,3,4;變量初始化.word8,6,4,2.textstart:STM#0,SWWSR;插入0個等待狀態(tài)STM#STACK+10h,SP;設(shè)置堆棧指針STM#a,AR1;AR1指向aRPT#7;移動8個數(shù)據(jù)MVPDtable,*AR1+;從程序存儲器到數(shù)據(jù)存儲器CALLSUM;調(diào)用SUM子程序end:BendSUM:STM#a,AR3;子程序執(zhí)行STM#x,AR4RPTZA,#3MAC*AR3+,*AR4+,ASTLA,@yRET.end【例】求4項乘積aixi(i=1,2,3,4)中的最大值,并存放累加器A中。程序:STM#a,AR1;ai首地址a給AR1STM#x,AR2;xi首地址x給AR2STM#2,AR3;設(shè)置計數(shù)器AR3=2LD*AR1+,T;取系數(shù)T=ai,并修改AR1MPY*AR2+,A;乘法運算A=aixi,并修改AR2loop1:LD*AR1+,T;取系數(shù)T=ai,并修改AR1MPY*AR2+,B;乘法運算B=aixi,并修改AR2MAXA;求A和B中的最大值BANZloop1,*AR3-;若AR3≠0,則循環(huán),并修改AR3若AR3=0,則不循環(huán)5.4.2除法運算在’C54x中沒有除法器硬件,也沒有專門的除法指令。但是,利用條件減法指令(SUBC)和重復(fù)指令(RPT)可實現(xiàn)兩個無符號數(shù)的除法運算。條件減法指令:SUBCSmem,src功能:(src)-(Smem)<<15→ALU輸出端若ALU輸出0,則(ALU輸出)<<1+1→src否則(src)<<1→src重復(fù)指令:RPT#K功能:RC=#K,重復(fù)執(zhí)行下條指令K+1次。1.|被除數(shù)|<|除數(shù)|例:編寫0.4÷(-0.8)的程序.bssnum,1.bssden,1.bssquot,1.datatable.word4*32768/10;0.4.word-8*32768/10;-0.8.textstart:STM#num,AR1RPT#1LD@den,16,A;分母送AHMPYA@num;商符號送B(num)×AH→B,即分子×分母→B,取符號。ABSA;取分母絕對值STHA,@denLD@num,16,A;分子送AHABSA;取分子絕對值RPT#14;15次減法循環(huán)SUBC@den,A;完成除法XC1,BLT;若B<0,則變號NEGASTLA,@quot;保存商運行結(jié)果:被除數(shù)除數(shù)商(十六進制)商(十進制)4*32768/100(0.4)-8*32768/100(-0.8)0xC000-0.5-12810240xF000-0.1252.|被除數(shù)|>|除數(shù)|例:編寫16384÷512的程序.bssnum,1.bssden,1.bssquot,1.datatable.word16384;16384.word512;512.textstart:STM#num,AR1RPT#1MVPDtable,*AR1+;傳送2個數(shù)據(jù)至分子、分母單元LD@den,16,A;將分母移到累加器A(31~16)MPYA@num;(num)*A(32~16)→B,獲取商的符號ABSA;分母取絕對值STHA,@den;分母絕對值存回原處LD@num,A;分子→A(32~16)ABSA;分子取絕對值RPT#15;16次減法重復(fù)操作,完成除法SUBC@den,AXC1,BLT;如果B<0(商是負數(shù)),則需要變號NEGASTLA,@quot;保存商運行結(jié)果:被除數(shù)除數(shù)商(十六進制)商(十進制)163845120xC0203266*32768/100(0.66)-33*32768/100(-0.33)0xFFFE-2注意:SUBC指令僅對無符號數(shù)進行操作,因此先對被除數(shù)和除數(shù)取絕對值,然后利用乘法操作獲取商的符號,最后通過條件操作指令給商加上適當(dāng)?shù)姆枴?.4.3長字運算和并行1.長字運算’C54x可以利用32位長操作數(shù)進行長字運算。長字指令:DLDLmem,dst;dst=Lmem單周期DSTsrc,Lmem;Lmem=src雙周期DADDLmem,src[,dst];dst=src+Lmem單周期DSUBLmem,src[,dst];dst=src-Lmem單周期DRSUBLmem,src[,dst];dst=Lmem-src單周期(1)偶地址排列指令中給出的地址為偶地址,則存儲器低地址存放高16位操作數(shù)。如:DLD*AR3+,A執(zhí)行前:A0000000000AR30100數(shù)據(jù)存儲器┌①─(AR30101)─0100h6CAC高字執(zhí)行后:A006CACBD90②←0101HBD90低字AR30102【例5.4.5】偶地址排列法舉例。.bssa,2.bssy,2.datatable:.word06CACH,0BD90H.text…STM#a,AR1RPT#1MVPDtable,*AR1+STM#a,AR3DLD*AR3+,A執(zhí)行前:A=0000000000hAR3=0100h(0100h)=6CACh(高字)(0101h)=BD90h(低字)執(zhí)行后:A=006CACBD90hAR3=0102h(0100h)=6CACh(0101h)=BD90h1.長字運算(2)奇地址排列指令中給出的地址為奇地址,則存儲器低地址存放低16位操作數(shù)。如:DLD*AR3+,A執(zhí)行前:A0000000000AR30101數(shù)據(jù)存儲器┌②─(AR30103)─0100h6CAC低字執(zhí)行后:A00BD906CAC①←0101HBD90高字AR30103【例5.4.6】奇地址排列法舉例。.bssa,2.bssy,2.datatable:.word06CACH,0BD90H.text…STM#a,AR1RPT#1MVPDtable,*AR1-STM#a,AR3DLD*AR3+,A執(zhí)行前:A=0000000000hAR3=0101h(0100h)=6CACh(低字)(0101h)=BD90h(高字)執(zhí)行后:A=00BD906CAChAR3=0103h(0100h)=6CACh(0101h)=BD90h【例5.4.7】計算Z32=X32+Y32。標(biāo)準(zhǔn)運算.bssxhi,1.bssxlo,1.bssyhi,1.bssylo,1.bsszhi,1.bsszlo,1…LD@xhi,16,AADDS@xlo,AADD@yhi,16,AADDS@ylo,ASTHA,@zhiSTLA,@zlo6字,6T長字運算.bssxhi,2,1,1.bssyhi,2,1,1.bsszhi,2,1,1…DLD@xhi,ADADD@yhi,ADSTA,@zhi3字,3T5.4.3長字運算和并行2.并行運算并行運算就是同時利用D總線和E總線,通過并行指令來實現(xiàn)數(shù)據(jù)的加載和算術(shù)運算。D總線用來執(zhí)行加載或算術(shù)運算。E總線用來存放先前的結(jié)果。并行指令:并行加載和乘法指令并行加載和存儲指令并行存儲和乘法指令并行存儲和加/減指令并行加載和乘法指令:LD||MAC[R]LD||MAS[R]例如:LDXmem,dst1||MAC[R]Ymem,[,dst2]功能:dst1=Xmem<<16;dst2=dst2+T*Ymem。并行加載和存儲指令:ST||LD例如:STsrc,Ymem||LDXmem,dst功能:Ymem=src>>(16-ASM);dst=Xmem<<16。并行存儲和乘法指令:ST||MPYST||MAC[R]ST||MAS[R]例如:STsrc,Ymem||MAC[R]Xmem,dst功能:Ymem=src>>(16-ASM);dst=dst+T*Xmem。并行存儲和加/減指令:ST||ADDST||SUB例如:STsrc,Ymem||ADDXmem,dst功能:Ymem=src>>(16-ASM);dst=dst+Xmem?!咀⒁狻坎⑿兄噶罹鶠閱巫謫沃芷谥噶睿徊⑿兄噶钕却鎯?,后加載或算術(shù)運算;并行指令的操作均在累加器的高位中進行,并且大多數(shù)指令受ASM位的影響?!纠?.4.8】編寫計算z=x+y和f=e+d的程序·bssx,3·bssd,3STM#x,AR5STM#d,AR2LD#0,ASMLD*AR5+,16,AADD*AR5+,16,ASTA,*AR5||LD*AR2+,BADD*AR2+,16,BSTHB,AR25.4.3長字運算和并行3、64位加法和減法運算可利用長字指令可完成64位數(shù)的加減運算?!纠?.4.9】編寫完成Z64=W64+X64-Y64的程序。運算過程:S64=s3s2s1s0s1s0=w1w0+x1x0s3s2=w3w2+x3x2+CZ64=z3z2z1z0z1z0=s1s0-y1y0z3z2=s3s2-y3y2-0程序:DLD@w1,A;A=w1w0DADD@x1,A;A=s1s0,產(chǎn)生CDLD@w3,B;B=w3w2ADDC@x2,B;B=w3w2+x2+CADD@x3,16,B;B=s3s2=w3w2+x3x2+CDSUB@y1,A;A=s1s0-y1y0,產(chǎn)生0DSTA,@z1;z1z0=s1s0-y1y0SUBB@y2,B;B=s3s2-y2-0SUB@y3,16,B;B=z3z2DSTB,@z3;z3z2=s3s2-y3y2-04、32位乘法運算【例】編寫完成W64=X32×Y32的程序。運算過程:w0=x0y0Lw1=x0y0H+x1y0L+y1x0Lw2=x1y0H+y1x0H+y1x1Lw3=y1x1H乘法運算:U×US×US×S乘法指令:MPYUSmem,dst;dst=U(T)×U(Smem)MACSUXmem,Ymem,src;src=U(Xmem)×S(Ymem)+srcMACXmem,Ymem,src;src=S(Xmem)×S(Ymem)+src程序:STM#x0,AR2;AR2←x0STM#y0,AR3;AR3←y0LD*AR2,T;T=x0MPYU*AR3+,A;A=u(x0)×u(y0)STLA,@w0;(w0)←ALDA,-16,A;A=x0y0HMACSU*AR2+,*AR3-,A;A=y1x0+x0y0HMACSU*AR3+,*AR2,A;A=x1y0+y1x0+x0y0HSTLA,@w1;(w1)←ALDA,-16,A;A=y1x0H+x1y0HMAC*AR2,*AR3,A;A=y1x1+y1x0H+x1y0HSTLA,@w2;(w2)←ASTHA,@w3;(w3)←A5.5重復(fù)操作程序’C54x的重復(fù)操作是使CPU重復(fù)執(zhí)行一條指令或一段指令??梢苑譃閱沃噶钪貜?fù)和塊程序重復(fù)。實現(xiàn)重復(fù)操作的指令:RPT——重復(fù)下條指令;RPTZ——累加器清0,并重復(fù)下條指令;RPTB——塊重復(fù)指令。使用RPT、RPTZ能重復(fù)下一條指令;而RPTB用于重復(fù)代碼塊若干次。利用重復(fù)指令可實現(xiàn)比BANZ指令更快的循環(huán)程序。利用RPT和RPTZ可重復(fù)執(zhí)行緊隨其后的一條指令。重復(fù)次數(shù)由該指令的操作數(shù)決定,并且等于操作數(shù)加1。若要重復(fù)執(zhí)行N+1次,則重復(fù)指令中應(yīng)規(guī)定重復(fù)次數(shù)為N。該數(shù)值保存在16位重復(fù)計數(shù)器RC中,可通過RPT或RPTZ指令加載。一條指令的最大重復(fù)次數(shù)為65536。由于要重復(fù)的指令只需要取指一次,對于多周期指令,采用重復(fù)操作后,可使多周期指令變成單周期指令,提高運行速度。5.5.1單指令重復(fù)【例5.5.1】對數(shù)組進行初始化,使x[8]={0,0,0,0,0,0,0,0}。.bssx,8STM#x,AR1LD#0,ARPT#7STLA,*AR1+↓↓↓↓↓↓↓↓↓↓↓↓↓↓.bssx,8STM#x,AR1RPTZA,#7STLA,*AR1+【注意】:①對x[8]中的8個元素置0,重復(fù)次數(shù)為7,即執(zhí)行1次STLA,AR1+指令后,再重復(fù)執(zhí)行7次;②RPTZ指令設(shè)定重復(fù)次數(shù)后,再對累加器清零。在執(zhí)行重復(fù)操作期間,除了RS外所有中斷被禁止,直到重復(fù)循環(huán)完成?!疌54x能響應(yīng)HOLD信號,若HM=0,CPU繼續(xù)執(zhí)行重復(fù)操作,若HM=1,則暫停重復(fù)操作。5.5.2塊程序重復(fù)對于整個程序塊需要重復(fù)操作時,可采用程序塊重復(fù)操作。用于塊程序重復(fù)操作指令為RPTB和RPTBD。程序塊的長度由塊程序重復(fù)指令RPTB的操作數(shù)來確定,而重復(fù)次數(shù)由塊重復(fù)計數(shù)器BRC來決定。通常RPTB的操作數(shù)為程序塊的結(jié)束地址,而重復(fù)次數(shù)可用STM指令對BRC進行設(shè)定。塊重復(fù)操作的特點:①程序塊的起始地址RSA是RPTB指令的下一行;②塊結(jié)束地址REA由RPTB指令的操作數(shù)規(guī)定;③對程序塊進行重復(fù)操作時,不論程序塊多長,重復(fù)次數(shù)多大,所用的機器周期為0;④與單指令重復(fù)操作不同,塊重復(fù)操作可以響應(yīng)中斷。塊程序重復(fù)指令的特點是對任意長程序段的循環(huán)開銷為0。循環(huán)由ST1狀態(tài)寄存器的塊重復(fù)標(biāo)志位(BRAF)和緊跟在ST1狀態(tài)寄存器后面的存儲器映像寄存器控制。循環(huán)過程:①將塊重復(fù)標(biāo)志位BRAF置1,激活塊程序重復(fù)循環(huán);②將一個取值在0~65535范圍里的循環(huán)次數(shù)N加載到BRC;③塊重復(fù)指令把塊重復(fù)的起始地址放在塊重復(fù)開始地址寄存器RSA中;④塊重復(fù)指令把塊重復(fù)的末地址放在塊重復(fù)結(jié)束地址寄存器REA中。5.5.2塊程序重復(fù)【例5.5.2】對數(shù)組x[8]中的每一元素加1。.bssx,8;設(shè)置數(shù)組空間begin:LD#1,16,B;立即數(shù)1送入BHSTM#7,BRC;設(shè)置重復(fù)次數(shù),BRC=7,循環(huán)8次STM#x,AR4;數(shù)組首地址x送入AR4RPTBnext-1;設(shè)置循環(huán)結(jié)束地址ADD*AR4,16,B,A;數(shù)組數(shù)據(jù)左移16位與BH相加STHA,*AR4+;存入數(shù)組結(jié)果,并修改地址next:LD#0,B;B清0…【注意】①塊結(jié)束地址REA通常取程序塊最后一條指令的下一條指令地址-1;②重復(fù)次數(shù)為7次③RPTB指令可以響應(yīng)中斷。5.5.3循環(huán)嵌套循環(huán)嵌套是程序編制中常用的技巧,可以用來簡化較為復(fù)雜的程序。塊程序重復(fù)指令RPTB所用的寄存器有:BRC——重復(fù)計數(shù)器;RSA——起始地址寄存器;REA——結(jié)束地址寄存器。RPT重復(fù)操作可以和塊重復(fù)操作RPTB以及循環(huán)操作BANZ進行嵌套,實現(xiàn)多重嵌套?!纠?.5.2】三重循環(huán)嵌套程序。三重循環(huán)嵌套結(jié)構(gòu):內(nèi)層——RPT——執(zhí)行N次中層——RPTB——執(zhí)行M次外層——BANZ——執(zhí)行L次循環(huán)嵌套的開銷循環(huán)操作指令重復(fù)次數(shù)機器周期內(nèi)層單程序重復(fù)操作RPTN1中層塊程序重復(fù)操作RPTBM4+25.6數(shù)據(jù)塊傳送程序可以用于數(shù)據(jù)傳送的指令有10條,分別可以實現(xiàn)數(shù)據(jù)存儲器之間、數(shù)據(jù)存儲器和MMR之間、程序存儲器和數(shù)據(jù)存儲器之間、程序存儲器和數(shù)據(jù)存儲器之間的數(shù)據(jù)塊傳送等。這些指令傳送速度比加載和存儲指令快,傳送數(shù)據(jù)不需要通過累加器,可以尋址程序存儲器,與RPT指令相結(jié)合可以實現(xiàn)數(shù)據(jù)塊傳送。1.數(shù)據(jù)傳送指令用于數(shù)據(jù)傳送指令可分為四類:(1)數(shù)據(jù)存儲器之間的數(shù)據(jù)傳送MVDKSmem,dmad2字2周期MVKDdmad,Smem2字2周期MVDDXmem,Ymem1字1周期(2)數(shù)據(jù)存儲器與MMR之間的數(shù)據(jù)傳送MVDMdmad,MMR2字2周期MVMDMMR,dmad2字2周期MVMMMMRx,MMRy1字2周期(3)程序存儲器和數(shù)據(jù)存儲器之間的數(shù)據(jù)傳送MVPDpmad,Smem2字3周期MVDPSmem,pmad2字4周期READASmem1字5周期WRITASmem1字5周期(4)從PA口讀/寫數(shù)據(jù)PORTRPA,Smem2字2周期PORTWSmem,PA2字2周期數(shù)據(jù)傳送指令的特點①

傳送速度比加載和存儲指令要快;②數(shù)據(jù)傳送不通過累加器;③

可尋址程序存儲器;④與RPT結(jié)合,可實現(xiàn)數(shù)據(jù)塊傳送。2.程序存儲器至數(shù)據(jù)存儲器的數(shù)據(jù)傳送重復(fù)執(zhí)行MVPD指令,可以實現(xiàn)程序存儲器至數(shù)據(jù)存儲器的數(shù)據(jù)傳送,在系統(tǒng)初始化過程中十分有用?!纠?.6.1】數(shù)組x[8]={0,1,2,3,4,5,6,7}初始化。.bssx,8.dataTBL:.word0,1,2,3,4,5,6,7.textSTART:STM#x,AR5RPT#7MVPDTBL,*AR5+……3.數(shù)據(jù)存儲器之間的數(shù)據(jù)傳送在數(shù)字信號處理時,經(jīng)常需要將數(shù)據(jù)存儲器中的一批數(shù)據(jù)傳送到數(shù)據(jù)存儲器的另一個地址空間?!纠?.6.2】進行N點FFT運算時,為節(jié)約存儲空間要用到原位計算,將數(shù)組X[16]賦到數(shù)組Y[16],計算一個蝶形后,所得輸出數(shù)據(jù)可以立即存入原輸入數(shù)據(jù)所占用的存儲單元。.bssx,16.bssy,16…STM#x,AR2STM#y,AR3RPT#15MVDDAR2+,*AR3+4.數(shù)據(jù)存儲器和MMR之間的數(shù)據(jù)傳送【例5.6.4】雙操作數(shù)方式實現(xiàn)IIR高通濾波器:table:.word0;x(n-2).word0;x(n-1).word653*32768/10000;x(n-0).word-1306*32768/10000;B2.word653*32768/10000;B0.word-3490*32768/10000;A2.word-600*32768/10000;A1/2.textstart:SSBXFRCTSTM#x2,AR1RPT#1MVPD#table,*AR1+【例5.6.4】雙操作數(shù)方式實現(xiàn)IIR高通濾波器:STM#COEF,AR1RPT#4MVPD#table+2,*AR1+STM#x2,AR3STM#COEF+4,AR4;AR4指向A1MVMMAR4,AR1;保存地置值在AR1中STM#3,BK;設(shè)置循環(huán)緩沖區(qū)長度STM#-1,AR0;設(shè)置變址尋址步長IIR1:PORTRPA1,*AR3;從PA1口輸入數(shù)據(jù)x(n)LD*AR3+0%,16,A;計算反饋通道。A=x(n)MAC*AR3,*AR4,A;A=x(n)+A1*x1MAC*AR3+0%,*AR4-,A;A=x(n)+A1*x1+A1*x1【例5.6.4】雙操作數(shù)方式實現(xiàn)IIR高通濾波器:MAC*AR3+0%,*AR4-,A;A=x(n)+2*A1*x1+A2*x2=x0STHA,*AR3;保存x0MPY*AR3+0%,*AR4-,A;計算前向通道。A=B0*x0MAC*AR3+0%,*AR4-,A;A=B0*x0+B1*x1MAC*AR3,*AR4-,A;A=B0*x0+B1*x1+B2*x2=y(n)STHA,*AR3;保存y(n)MVMMAR1,AR4;AR4重新指向A1BDIIR1;循環(huán)PORTW*AR3,PA0;向PA0口輸出數(shù)據(jù).end5.7小數(shù)運算程序在定點DSP芯片中,采用定點數(shù)進行數(shù)值運算時,若操作數(shù)采用整型數(shù),則DSP芯片給定的字長(一般16位)決定了整型數(shù)的最大范圍。通常,定點DSP采用小數(shù)乘法。其原因:①乘法器為16位,對于大于16位的數(shù)據(jù)難以實現(xiàn)乘法遞推,且乘積占用存儲資源大;②小數(shù)乘法時,既可以存儲32位乘積,也可以存儲高16位乘積,可用較少的資源保存結(jié)果;③小數(shù)乘法便于乘法遞推。1.數(shù)的定標(biāo)采用小數(shù)運算時,設(shè)定小數(shù)點在16位中的位置稱為定標(biāo)。小數(shù)點在16位數(shù)中的位置不同,可以表示不同大小和不同精度的小數(shù)。數(shù)的定標(biāo)通常有Q表示法,如Q0,Q1,…,Q15。Q越大,可以表示的數(shù)的范圍越小,但精度越高。在具體的定點程序中,必須根據(jù)具體情況適當(dāng)選擇合適的定標(biāo)。2.小數(shù)的表示方法’C54x采用基于2的補碼小數(shù)表示形式。每個16位數(shù)用1個符號位(最高位)、i個整數(shù)位、15-i個小數(shù)位來表示。采用2的補碼小數(shù)(Q15格式),其位權(quán)值為:MSB……LSB-1.2-12-22-3…2-15例如:00000010.10100000——21+2-1+2-3=2.6252的補碼小數(shù)表示方法:將十進制小數(shù)乘以32768,并將整數(shù)乘積轉(zhuǎn)換成16進制數(shù)。正數(shù):乘以32768,整數(shù)轉(zhuǎn)換成16進制數(shù);負數(shù):其絕對值乘以32768,整數(shù)取反加1。如:1——7FFFH1×32768=7FFFH0.5——4000H0.5×32768=4000H0.25——2000H0.25×32768=2000H0——0000H0×32768=0000H-0.25——E000H(0.25×32768)補=E000H-0.5——C000H(0.5×32768)補=C000H-1——8000H(1×32768)補=8000H【注意】:匯編時,不能直接寫成十進制小數(shù)。如:0.907——.word32768*907/10003.小數(shù)乘法與冗余符號位小數(shù)乘法實例:0.625′(-0.125)=-0.078125乘積:-0.078125=11010007位二進制擴展8位后,乘積:11101000=-0.1865出錯原因:兩帶符號數(shù)相乘,其結(jié)果帶有2個符號位。Sxxx(Q3格式)×Syyy(Q3格式)SSzzzzzz(Q6格式)解決辦法:運算結(jié)果左移一位,消去多余符號位。可通過對FRCT位置1,乘法器自動

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論