DSP芯片的匯編語言_第1頁
DSP芯片的匯編語言_第2頁
DSP芯片的匯編語言_第3頁
DSP芯片的匯編語言_第4頁
DSP芯片的匯編語言_第5頁
已閱讀5頁,還剩67頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第五講DSP芯片的匯編語言

TMS320C54X共有129條指令。

按功能分為4大類:?算術(shù)運算指令;?邏輯運算指令;?程序控制指令;

?存儲和裝入指令。1.算術(shù)運算指令(79條分為6小類)

?加法指令(ADD);

?減法指令(SUB);

?乘法指令(MPY);

?乘加指令(MAC)和乘減指令(MAS);

?雙數(shù)/雙精度指令(DADD、DSUB);?特殊操作指令(ABDST、SQDST)。

(1)加法指令(13條)《附錄ATMS320C54X指令集》

說明:①不同的加法指令用途不同;ADD:不帶進位;ADD《:不帶進位、移位;ADDC:帶進位;ADDM:專用于立即數(shù);ADDS:無符號數(shù);AddInstructions附錄A

加法指令舉例【例1】ADD*AR3+,14,A;將AR3所指的數(shù)據(jù)存儲單元內(nèi)容,左移14位與A相加,結(jié)果放A中,AR3加1。

加法指令舉例【例1】ADD*AR3+,14,A;將AR3所指的數(shù)據(jù)存儲單元內(nèi)容,左移14位與A相加,結(jié)果放A中,AR3加1。

Example2:ADD#4568,8,A,BExample2:ADD#4568,8,A,B(2)減法指令(13條)《附錄A》

說明:SUBS用于無符號數(shù)的減法運算;SUBB用于帶借位的減法運算(如32位擴展精度的減法);SUBC為條件減法.

減法指令舉例:P182Example3:SUBB5,AExample3:SUBB5,A(3)乘法指令(10條)《附錄A》

說明:①不同的乘法指令完成不同的功能MPY:普通乘指令;MPYR:帶四舍五入指令;MPYA:A累加器高端參與乘法;MPYU:無符號乘法;SQUR:平方;②小數(shù)乘法將FRCT設(shè)置為1,系統(tǒng)自動將乘積結(jié)果左移1位。乘法指令舉例【例5】MPY13,A;P164(4)乘加和乘減指令(15條)《附錄A》【例6】MAC*AR5+,A;A+(AR5)*T→A,AR5=AR5+1

(4)乘加和乘減指令(15條)《附錄A》【例6】MAC*AR5+,A;A+(AR5)*T→A,AR5=AR5+1

MAC *AR3+,*AR4+,A;?Example7:MACR*AR5+,*AR6+,A,BExample7:MACR*AR5+,*AR6+,A,B問題?請用ADD和MPY指令代替

MAC*AR5+,#1234h,AMPY*AR5+,#1234h,BADDB,A?什么區(qū)別?(5)長操作數(shù)指令(6條)《附錄A》

DADD Lmem,src[,dst]

;P149例8:DADD*AR3–,A,B例

8:DADD*AR3–,A,B(6)特殊應(yīng)用指令(15條)《附錄A》?求絕對值?求累加器指數(shù)?求累加器的最大/小值

?歸一化?求多項式的值?求兩點之間距離的平方?求最小均方值?對稱有限沖擊響應(yīng)濾波器等

FIRSXmem,Ymem,pmad

;B=B+A(32~16)*pmad,A=(Xmem+Ymem)<<16MAXdstdst=max(A,B)MINdstdst=min(A,B)例9:

FIRS*AR3+,*AR4+,COEFFS;P154例9:FIRS*AR3+,*AR4+,COEFFS2.邏輯指令(5小類)?與指令(AND);?或指令(OR);?異或指令(XOR);?移位指令(ROL);?測試指令(BITF)。(1)與、或、異或指令(共15條)《附錄A》(2)移位指令和測試指令(共11條)《附錄A》與指令(AND)ANDSmem,srcAND#lk[,SHFT],src[,dst]AND#lk,16,src[,dst]ANDsrc[,SHIFT][,dst]ANDM#lk,Smem例

10:ANDA,3,B例

10:ANDA,3,B例11:XORM0404h,*AR4–例11:XORM0404h,*AR4–例12:BITF5,00FFh例12:BITF5,00FFh例13:BITT*AR7+0例13:BITT*AR7+0例14:

CMPM*AR4+,#0404h;比較Smem與常數(shù)#1k是否相等,若相等TC=1,否則TC=0。

3.程序控制指令(7小類)

?分支指令(B,BC);

?調(diào)用指令(CALL);?返回指令(RET);

?中斷指令(INTR,TRAP);?重復(fù)指令(RPT);

?堆棧操作指令(FRAME,POP);

?其他程序控制指令(IDLE,NOP)。(1)分支指令(6條)《附錄A》含義:根據(jù)條件判斷改寫PC值,使程序發(fā)生分支轉(zhuǎn)移。兩種形式:有條件分支轉(zhuǎn)移和無條件轉(zhuǎn)移。常用指令:

B[D]、BACC[D];BC[D]、BANZ[D]

例15:BANZ[D]pmad,Sind若當(dāng)前輔助寄存器ARx不為0,則pmad值賦給PC,否則PC值加2。若為延遲方式,此時緊跟該指令的兩條單字指令或一條雙字指令先被取出執(zhí)行,然后程序再跳轉(zhuǎn)。該指令不能被循環(huán)執(zhí)行。

如:BANZ2000h,*AR3-例16:條件分支轉(zhuǎn)移指令BC舉例。P145表7-3BCnew,AGT,AOV;若累加器A>0且溢出,則轉(zhuǎn)至new,否則往下執(zhí)行。單條指令中的多個條件是“與”的關(guān)系。

請問:若將上一條指令改為“若累加器A大于0或溢出,則轉(zhuǎn)移至new”,指令應(yīng)該如何寫?BCnew,AGTBCnew,AOV

例17:計算.bss x,5;為變量分配6個字的存儲空間.bss y,1STM #x,AR1 ;AR1指向xSTM #4,AR2 ;設(shè)AR2初值為4LD #0,Aloop:ADD *AR1+,A

BANZ loop,*AR2-;當(dāng)AR2不為0時轉(zhuǎn)移,AR2-1→AR2STL A,@y

本例中用AR2作為循環(huán)計數(shù)器,設(shè)初值為4,共執(zhí)行5次加法。也就是說,應(yīng)當(dāng)用迭代次數(shù)減1后加載循環(huán)計數(shù)器。(2)調(diào)用和返回指令(6條)《附錄A》例18:

CALL[D]pmad返回地址壓入棧頂(TOS)保存,無延時時返回地址為PC+2,有延時時返回地址為PC+4(延時2字);將pmad值賦給PC實現(xiàn)調(diào)用。如:CALL3333h

(3)重復(fù)指令(5條)《附錄A》

RPT(重復(fù)下條指令)、RPTZ(累加器清0并重復(fù)下條指令)RPTB(塊重復(fù)指令)。(1)重復(fù)執(zhí)行單條指令含義:RPT或RPTZ允許重復(fù)執(zhí)行緊隨其后的那一條指令。重復(fù)次數(shù):如重復(fù)執(zhí)行n次,則重復(fù)指令中計數(shù)值為n-1。說明:與BANZ指令進行循環(huán)相比,效率要高得多。特別是對于那些乘法累加和數(shù)據(jù)傳送的多周期指令(如MAC、MVDK、MVDP和MVPD等),在執(zhí)行一次之后就變成了單周期指令,大大提高了運行速度。例19:對數(shù)組進行初始化。x[5]={0,0,0,0,0}主要程序(部分)如下:.bss x,5STM #x,AR1

LD #0,ARPT #4STL A,*AR1+或者.bss x,5STM #x,AR1RPTZ A,#4STL A,*AR1+(2)塊程序重復(fù)操作RPTB含義:RPTB將重復(fù)操作的范圍擴大到任意長度的循環(huán)回路。重復(fù)次數(shù):先加載到塊重復(fù)計數(shù)器(BRC)。循環(huán)開始地址(RSA):是RPTB指令的下一行;結(jié)束地址(REA):由RPTB指令的操作數(shù)規(guī)定。特點:對任意長的程序段的循環(huán)開銷為0;其本身是一條2字4周期指令;RPT指令一旦執(zhí)行,不會停止操作,即使有中斷請求也不響應(yīng);而RPTB指令是可以響應(yīng)中斷的。例20:RPTB[D]pmad;塊循環(huán)指令。循環(huán)次數(shù)必須在指令執(zhí)行前裝入BRC。執(zhí)行命令時,塊循環(huán)起始寄存器RSA裝入PC+2(若有D后綴時為PC+4),塊循環(huán)尾地址寄存器REA中裝入pmad。

ST#99,BRC;循環(huán)計數(shù)器賦值RPTBend_block-1;end_block為循環(huán)塊的底部例21:對數(shù)組x[5]中的每個元素加1。.bss x,5begin:LD #1,16,BSTM #4,BRC;BRC賦值為4STM #x,AR4RPTB next-1 ;next-1為循環(huán)結(jié)束地址ADD *AR4,16,B,ASTH A,*AR4+next:LD #0,B…用next-1作為結(jié)束地址是恰當(dāng)?shù)?。如果用循環(huán)回路中最后一條指令(STH指令)的標(biāo)號作為結(jié)束地址,若最后一條指令是單字指令也可以,若是雙字指令,就不對了。(4)中斷指令(2條)《附錄A》例22:

INTR3;(即K=3)?將PC值壓入棧頂;?由K確定的中斷向量賦給PC,執(zhí)行該中斷服務(wù)子程序。?中斷標(biāo)志寄存器(IFR)對應(yīng)位清零且INTM=1(禁止可屏蔽中斷)。(5)堆棧操作指令(5條)《附錄A》堆棧:

16位堆棧指針(SP)尋址的軟件堆棧。堆棧是一個特殊的存儲區(qū)域,遵循先進后出的原則,當(dāng)向堆棧中壓入數(shù)據(jù)時,堆棧從高地址向低地址增長,堆棧指針SP始終指向棧頂。堆棧用法:壓入操作:SP先減1,然后再將數(shù)據(jù)壓入棧頂。彈出操作:數(shù)據(jù)彈出后,再將SP加1。堆棧設(shè)置:size .set 100stack .usect “STK”,size

;自定義一個名為STK的保留空間,共100個單元

STM #stack+size,SP

;將這個保留空間的高地址(#stack+size)賦給SP,作為棧底,(6)其他程序控制指令(7條)《附錄A》?保持空閑狀態(tài)直到有中斷產(chǎn)生?修改輔助寄存器?無任何操作?軟件復(fù)位?狀態(tài)寄存器復(fù)位?狀態(tài)寄存器置位?條件執(zhí)行4.存儲和裝入指令(8小類)(1)存儲指令(ST);(14條)〈表3-20〉注:R→M(2)條件存儲指令(CMPS);(4條)〈表3-22〉注:比較/選擇/存儲或滿足條件存儲

(3)裝入指令(LD);(21條)〈表3-21〉注:M→R/助記符‘LD’

(4)并行指令(9條)〈表3-23〉

?并行裝入和存儲指令(LD||ST);

(2條)?并行裝入和乘法指令(LD||MAC);

(2條)?并行存儲和加減指令(ST||ADD,ST||SUB);

(2條)?并行存儲和乘法指令(ST||MAC);

(3條)(5)其他裝入和存儲指令(MVDD,PORTW,READA)(12條)〈表3-24〉//數(shù)據(jù)塊傳送程序共有4種類型(10條指令):(1)程序存儲器←→數(shù)據(jù)存儲器(MVPD,MVDP)。(2)數(shù)據(jù)存儲器←→數(shù)據(jù)存儲器(MVDK,MVKD,MVDD)。(3)數(shù)據(jù)存儲器←→MMR(MVMD、MVDM,MVMM)(4)程序存儲器(由ACC尋址)←→數(shù)據(jù)存儲器(READA,WRITA)這些指令的特點如下:傳送速度比加載和存儲指令要快;傳送數(shù)據(jù)不需要通過累加器;可以尋址程序存儲器;與RPT相結(jié)合時,都變成單周期指令,可以實現(xiàn)數(shù)據(jù)塊傳送。

例23:編寫一段程序,首先對數(shù)組x[20]賦值,再將數(shù)據(jù)存儲器中的數(shù)組x[20]復(fù)制到數(shù)組y[20]。 .title “exp15.asm” .mmregsSTACK.usect“STACK”,30h .bss x,20 .bss y,20 .datatable: .word 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 .def start .textStart: STM #x,AR1 RPT #19

MVPDtable,*AR1+ ;程序存儲器傳送到數(shù)據(jù)存儲器 STM #x,AR2 STM #y,AR3 RPT #19

MVDD*AR2+,*AR3+ ;數(shù)據(jù)存儲器傳送到數(shù)據(jù)存儲器end: B end .end/exp15.cmd*/鏈接命令vectors.objexp15.obj-oexp15.out-mexp15.map-estartMEMORY{PAGE0: EPROM: org=0E000h len=01F80h VECS: org=0FF80h len=00080hPAGE1: SPRAM: org=00060h len=00030h DARAM: org=00090h len=01380h}SECTIONS{ .vectors:> VECS PAGE0 .text:> EPROM PAGE0 .data:> EPROM PAGE0 .bss:> SPRAM PAGE1 .STACK:> DARAM PAGE1}

實現(xiàn)20個數(shù)據(jù)先從EPROM的0E000Hh~0E013h傳送到數(shù)據(jù)存儲器SPRAM的0060h~0073h單元,實現(xiàn)數(shù)據(jù)的初始化,再從0060h~0073h單元傳送到0074h~0087h單元,實現(xiàn)數(shù)據(jù)搬移,其示意圖如圖4.7所示。注意,實際看到的是十六進制數(shù)。

單字運算程序例24:試編一程序,計算的值,并找出4項乘積(i=1,2,3,4)中的最大值,放入累加器A中。 .title “exp16.asm” .mmregsSTACK.usect“STACK”,10h ;堆棧的設(shè)置 .bss a,4 ;為變量分配10個字的存儲空間 .bss x,4 .bss y1,1 .bss y2,1 .def start .datatable: .word 1,5,3,4 .word 8,6,7,2 .textstart: STM #0,SWWSR ;插入0個等待狀態(tài) STM #STACK+10h,SP ;設(shè)置堆棧指針 STM #a,AR1 RPT #7 MVPD table,*AR1+ CALL SUM;調(diào)用乘累加子程序 CALL MAX;調(diào)用求最大值子程序End: B endSUM:STM #a,AR3 STM #x,AR4 RPTZ A,#3 MAC *AR3+,*AR4+,A STL A,@y1 ;變量y1存放乘累加的值 RETMAX:STM #a,AR1 STM #x,AR2 STM #2,AR3 LD *AR1+,T MPY *AR2+,A;第一個乘積在累加器A中Loop:LD *AR1+,T MPY *AR2+,B;其他乘積在累加器B中 MAX A;累加器A和B比較,選大的存在A中 BANZ loop,*AR3-;此循環(huán)中共進行3次乘法和比較 STL A,@y2 ;變量y2存放的最大值 RET .end假設(shè).bss為變量a、x和y分配的10個字的存儲空間,以數(shù)據(jù)存儲器的0060H為起始地址,結(jié)果y1=67(43h),最大值y2=30(1Eh)。練習(xí):已知(30H)=50H,AR2=40H,AR3=60H,AR4=80H.

MVKD30H,*AR2MVDD*AR2,*AR3MVDM*AR3,AR4運行以上程序后,(30H)(40H)AR3和AR4的值分別等于多少呢?【例25】試編一程序,計算的值,放入累加器A中。

.title “exp16.asm” .mmregsSTACK.usect“STACK”,10h ;堆棧的設(shè)置 .bss a,4;為變量分配10個字的存儲空間 .bss x,4 .bss y1,1 .bss y2,1 .def start .datatable: .word 1,5,3,4 .word 8,6,7,2 .textstart: STM #0,SWWSR ;插入0個等待狀態(tài) STM #STACK+10h,SP ;設(shè)置堆棧指針 STM #a,AR1 RPT #7 MVPD table,*AR1+ CALL SUM;調(diào)用乘累加子程序 End: B endSUM:STM #a,AR3 STM #x,AR4 RPTZ A,#3 MAC *AR3+,*AR4+,A STL A,@y1 ;變量y1存放乘累加的值 RET【例26】

*計算z=x+y-w*.title"example4.asm".mmregsSTACK.usect"STACK",10H;堆棧的設(shè)置.bssx,1;為變量分配4個字的存儲空間.bssy,1.bssw,1.bssz,1.defstart.datatable.word10,26,23;x,y,w

.textstart:STM#0,SWWSR;插入0個等待狀態(tài)STM#STACK+10H,SP;設(shè)置堆棧指針STM#x,AR1;AR1指向xRPT#2MVPDtable,*AR1+;把程序存儲器中的數(shù)據(jù)移動到數(shù)據(jù)存儲器CALLSUMBend:BendSUMB:LD*(x),AADD*(y),ASUB*(w),ASTLA,*(z)RET.end.title"fir5.asm".mmregs.def_c_int00 .datafir_table.word-6,28,46,27,-35,-100,-93,26,191,240,52,-291.word-497,-278,337,888,773,-210,-1486,-1895,-442,2870.word6793,9445,9445,6793,2870,-442,-1895,-1486,-210,773.word888,337,-278,-497,-291,52,240,191,26,-93.word-100,-35,27,46,28,-6.datainput.word0x7FDE,0x04CF,0xF7FD,0xE2D4,0xE6F3,0x1AE5,0x9A5F,0xED44,0x0D2C,0x42A1.word0x48C3,0xCEF2,0x2889,0xFD21,0xFD3E,0xC78E,0x988E,0x30AC,0x0FBB,0x3216.word0x0000,0x058B,0x5BAF,0xDBB1,0xDD85,0xA6EE,0xEFE8,0x347D,0xD778,0x21D4.word0x0C7C,0x5688,0x2784,0xAC72,0xEE91,0xCC24,0x190E,0xDC23,0xD14A,0x4D7E.word0x2A9F,0x4D7E,0xD14A,0xDC23,0x190E,0xCC24,0xEE91,0xAC72,0x2783,0x5688.word0x0C7C,0x21D4,0xD778,0x347D,0xEFE8,0xA6EE,0xDD85,0xDBB1,0x5BAF,0x058C.word0x0000,0x3216,0x0FBB,0x30AC,0x988F,0xC78E,0xFD3E,0xFD21,0x2889,0xCEF2.word0x48C3,0x42A1,0x0D2C,0xED44,0x9A5F,0x1AE5,0xE6F4,0xE2D3,0xF7FD,0x04CF.word0x7FDE,0x04CF,0xF7FD,0xE2D4,0xE6F3,0x1AE5,0x9A5F,0xED44,0x0D2C,0x42A1.word0x48C3,0xCEF2,0x2889,0xFD21,0xFD3E,0xC78E,0x988E,0x30AB,0x0FBB,0x3216.word0x0000,0x058B,0x5BAF,0xDBB1

溫馨提示

  • 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

提交評論