




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 液壓與液力系統(tǒng)在自行車制造中的應(yīng)用考核試卷
- 煉鐵原料選擇與配比考核試卷
- 內(nèi)河港口的區(qū)域合作與發(fā)展考核試卷
- 農(nóng)用金屬工具制造過程質(zhì)量控制考核試卷
- 放射性廢物處理中的廢物減量化策略考核試卷
- 潛水裝備的水下作業(yè)安全法規(guī)考核試卷
- 發(fā)電機組在農(nóng)業(yè)灌溉中的應(yīng)用考核試卷
- 倉儲中介合同標(biāo)準(zhǔn)文本
- 加入代理賣貨合同標(biāo)準(zhǔn)文本
- 產(chǎn)品oem合同標(biāo)準(zhǔn)文本
- 龍應(yīng)臺作品之《目送》公開課實用課件
- 《村寨里的紙文明 中國少數(shù)民族剪紙藝術(shù)傳統(tǒng)調(diào)查與研究 第三卷 》讀書筆記
- 2023年副主任醫(yī)師(副高)-皮膚與性病學(xué)(副高)考試歷年真題拔高帶答案必考
- 生藥學(xué)全套課件
- 廣東省五年一貫制語文考試題目
- 土的含水率試驗酒精燃燒法(JTG34302020)
- 剛撓印制電路板濕法去鉆污及凹蝕技術(shù)三個步驟
- 實驗室生物安全和意外事件應(yīng)對
- 工程機械設(shè)計-陳海虹課件第5章-輪式工程機械轉(zhuǎn)向系
- 脊髓損傷康復(fù)臨床路徑
- UV打印機日常維護與保養(yǎng)
評論
0/150
提交評論