汇编语言程序设计DSP技术与应用实例第3版课件_第1页
汇编语言程序设计DSP技术与应用实例第3版课件_第2页
汇编语言程序设计DSP技术与应用实例第3版课件_第3页
汇编语言程序设计DSP技术与应用实例第3版课件_第4页
汇编语言程序设计DSP技术与应用实例第3版课件_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第6章汇编语言程序设计6.1程序的控制与转移TMS320C54x具有丰富的程序控制与转移指令,利用这些指令可以执行分支转移、循环控制及子程序操作。基本的程序控制指令如表6-1所示。表6-1基本的程序控制指令分支转移指令执行周期子程序调用指令执行周期子程序返回指令执行周期Bnext4BACCsrc6BCnext,cond5/3CALLsub4CALAsrc6CCsub,cond5/3RET5RCcond5/31.条件算符条件分支转移指令或条件调用、条件返回指令都用条件来限制分支的转移、调用和返回操作。条件算符分成两组,每组组内还有分类。第1组:EQNEQLEQGEQLTGTOVNOV第2组:TCNTCCNCBIONBIO选用条件算符时应当注意以下3点:•第1组:组内两类条件可以进行与/或运算,但不能在组内同一类中选择两个条件算符与/或。当选择两个条件时,累加器必须是同一个。例如,可以同时选择AGT和AOV,但不能同时选择AGT和BOV。•第2组:可从组内3类算符中各选一个条件算符与/或,但不能在组内同一类中选两个条件算符与/或。例如,可以同时测试TC、C和BIO,但不能同时测试NTC和TC。•组与组之间的条件只能进行或运算。2.循环操作BANZ在程序设计时,经常需要重复执行某段程序,利用BANZ(当辅助寄存器不为0时转移)指令执行循环计数和操作是十分方便的。SUM:STM #x,AR3 STM #4,AR2loop: ADD *AR3+,A ;程序存储器 BANZ loop,*AR2- STL A,@y6.2堆栈的使用方法TMS320C54x提供一个用16位堆栈指针(SP)寻址的软件堆栈。当向堆栈中压入数据时,堆栈从高地址向低地址增长。堆栈指针是减在前、加在后,即先SP1再压入数据,先弹出数据后SP+1。如果程序中要用到堆栈,则必须先进行设置,方法如下:size .set 100stack .usect "STK",size STM #stack+size,SP上述语句在数据RAM空间开辟一个堆栈区。前两句在数据RAM中自定义一个名为STK的保留空间,共100个单元。第3句将这个保留空间的高地址(#stack+size)赋给SP,作为栈底,参见图6-1。至于自定义未初始化段STK究竟定位在数据RAM中的什么位置,应当在链接器命令文件中规定。数据存储器0

STK堆栈的设置size.set100stack.usect"STK",sizeSTM#stack+size,SP堆栈的用法压入操作:SP先减1后,再将数据压入堆栈中弹出操作:数据弹出后,再将SP加1…stack可用栈区SP→最后用的单元已用栈区65535…图6-1堆栈设置堆栈之后,就可以使用堆栈了,例如:CALLpmad ;(SP)-1→SP,(PC)+2→TOS ;pmad→PCRET ;(TOS)→PC,(SP)+l→SP堆栈区应开辟多大?这需要按照以下步骤来确定:①先开辟一个大堆栈区,且用已知数填充。②运行程序,执行所有的操作。③暂停,检查堆栈中的数值如下图。④用过的堆栈区才是实际需要的堆栈空间。2.乘法【例6-5】计算y=mx+b。

SU: LD @m,T MPY @x,A ADD @b,A STL A,@y RET .end计算结果:数据寄存器地址存储内容十进制数m 0060H 0003H3x 0061H 000FH15b 0062H 0014H20y 0063H 0041H656.4重复操作1.重复执行单条指令

重复指令RPT或RPTZ允许重复执行紧随其后的那一条指令。如果要重复执行n次,则重复指令中应规定计数值为n1。由于重复的指令只需要取指一次,与利用BANZ指令进行循环相比,效率要高得多。

【例6-9】对数组x[5]={0,0,0,0,0}进行初始化。.bss x,5或者STM #x,AR1LD #0H,ARPT #4STL A,*AR1+或者.bss x,5STM #x,AR1RPTZ #4STL A,*AR1+2.块程序重复操作

块程序重复操作RPTB将重复操作的范围扩大到任意长度的循环回路。由于块程序重复指令RPTB的操作数是循环回路的结束地址,而且,其下条指令就是重复操作的内容,因此必须先用STM指令将所规定的迭代次数加载到块重复计数器(BRC)中。RPTB指令的特点是:对任意长度的程序段的循环开销为0,其本身是一条2字4周期指令;循环开始地址(RSA)是RPTB指令的下一行,结束地址(REA)由RPTB指令的操作数规定。【例6-10】对数组x[5]中的每个元素加1。 .bss x,5start: LD #1,16,B STM #4,BRC STM #x,AR4 RPTB next-1 ADD *AR4,16,B,A STH A,*AR4+next: LD #0,B6.5数据块传送

这些指令的特点如下:(1)传送速度比加载和存储指令的速度要快;(2)传送数据不需要通过累加;(3)可以寻址程序存储器;(4)与RPT指令相结合,可以实现数据块传送。数据存储器←→数据存储器#W/C数据存储器←→MMR#W/CMVDKSmem,dmadMVKDdmad,SmemMVDDXmem,Ymem2/22/21/1MVDMdmad,MMRMVMDMMR,dmadMVMMmmr,mmr2/22/21/1程序存储器←→数据存储器#W/C程序存储器(Acc)←→数据存储器#W/CMVPDPmad,SmemMVDPSmem,Pmad2/32/4READASmemWRITASmem1/51/51.程序存储器→数据存储器

【例6-11】初始化数组x[5]={1,2,3,4,5}。 .title "zh9.asm" .mmregsSTACK .usect "STACK",10H .bss x,5 .datatable: .word 1,2,3,4,5 .def start .textstart: STM #x,AR1 RPT #4 MVPD table,*AR1+

end: B end .end2.数据存储器→数据存储器

【例6-12】编写一段程序,将数据存储器中数组x[20]中的数据复制到数组y[20]中。 .title "zh10.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 MVPD table,*AR1+ ;从程序存储器传送到数据存储器中 STM #x,AR2 STM #y,AR3 RPT #19 MVDD *AR2+,*AR3+

;从数据存储器传送到数据存储器中end: B end .end20个数据从0060H~0073H传送到0074H~0087H,结果如图所示:

如果求y=mx+b,则单操作数和双操作数实现方法比较如表6-4所示:表6-4单/双操作数编程比较

用双操作数指令编程的特点为:(1)用间接寻址方式获得操作数,且辅助寄存器只能用AR2~AR5;(2)占用的程序空间小;(3)运行的速度快。单操作数方法双操作数方法LD@m,TMPY@x,AADD@b,ASTLA,@yMPY*AR2,*AR3,AADD@b,ASTLA,@y双操作数MAC型的指令有4种,如表6-5所示:表6-5MAC型双操作数指令

对于Xmem和Ymem,只能用以下辅助寄存器及寻址方式:

辅助寄存器 AR2寻址方式 *ARn AR3 *ARn+ AR4 *ARn AR5 *ARn+0%指令功能MPYXmem,Ymem,dstMACXmem,Ymem,src[,dst]MASXmem,Ymem,src[,dst]MACPSmem,Pmad,src[,dst]dst=Xmem*Ymemdst=src+Xmem*Ymemdst=src-Xmem*Ymemdst=src+Smem*Pmad6.7长字运算和并行运算

1.长字指令

DLD Lmem,dst ;dst=LmemDST src,Lmem ;Lmem=srcDADD Lmem,src[,dst] ;dst=src+LmemDSUB Lmem,src[,dst] ;dst=src-LmemDRSUB Lmem,src[,dst] ;dst=Lmem-src(1)偶地址排列法

(2)奇地址排列法

数据存储器偶地址:xhi奇地址:xlo程序存储器偶地址:1234奇地址:5678

.long12345678h变量名称字长页邻接偶地址排列法

.bssxhi,2,1,1图6-8奇偶地址排列规定2.并行运算

并行运算指令举例

指令举例操作说明LD||MAC[R]LD||MAS[R]LDXmem,dst||MAC[R]Ymem[,dst2]dst=Xmem<<16dst2=dst2+T*YmemST||LDSTsrc,Ymem||LDXmem,dstYmem=src>>(16-ASM)dst=Xmem<<16ST||MPYST||MAC[R]ST||MAS[R]STsrc,Ymem||MAC[R]Xmem,dstYmem=src>>(16-ASM)dst=dst+T*XmemST||ADDST||SUBSTsrc,Ymem||ADDXmem,dstYmem=src>>(16-ASM)dst=dst+Xmem【例6-16】用并行运算指令编写计算z=x+y和f=e+d的程序。

.mmregsSTACK .usect "STACK",10H .bss x,3 .bss d,3 .def start .datatable: .word 0123H,1027H,0,1020H,0345H,0 .textstart: STM #0,SWWSR STM #STACK+10H,SP STM #x,AR1 RPT #5 MVPD table,*AR1+ STM #x,AR5 STM #d,AR2 LD #0,ASM LD *AR5+,16,A ADD *AR5+,16,A ST A,*AR5;并行指令 ||LD *AR2+,B ADD *AR2+,16,B STH B,*AR2end: B end .end3.64位加法和减法运算

64位数的加法和减法算式如下:

w3w2w1w0(W64)+x3x2Cx1x0(X64)低32位相加产生进位C

-y3y2C'y1y0(Y64)低32位相减产生借位C'

z3z2z1z0(Z64)〖例6-17〗编写计算Z64=W64+X64-Y64的程序。W、X、Y和结果Z都是64位数,它们都由两个32位的长字组成。利用长字指令可以完成64位数的加/减法。4.32位乘法运算

32位乘法算式如下:

x1x0SU×y1y0SUx0×y0U×Uy1×x0S×Ux1×y0S×Uy1×x1S×Sw3w2w1w0SUUU其中,S——带符号数,U——无符号数。由上算式可见,在32位乘法运算中,实际上包括三种乘法运算:U×U,S×U及S×S。一般的乘法运算指令都是两个带符号数相乘,即S×S。所以,在编程时,还要用到以下两条乘法指令:MACSUXmem,Ymem,src;无符号数与带符号数相乘并累加;src=U(Xmem)×S(Ymem)+srcMPYUSmem,dst;无符号数相乘;dst=U(T)×U(Smem)〖例6-18〗编写计算W64=X32×Y32的程序。32位乘法实现的64位乘积的程序如下:STM#x,AR2STM#y,AR3LD*AR2,T;T=x0MPYU*AR3+,A;A=ux0×uy0STLA,@w0;w0=ux0×uy0LDA,-16,A;A=A>>16MACSU*AR2+,*AR3-,A;A+=y1×ux0MACSU*AR3+,*AR2,A;A+=x1×uy0STLA,@w1;w1=ALDA,-16,A;A=A>>16MAC*AR3,*AR2,A;A+=x1×y1STLA,@w2;w2=A的低16位STHA,@w3;w3=A的高16位解决冗余符号位的办法:在程序中设定状态寄存器ST1中的FRCT(小数方式)位为1,在乘法器将结果传送至累加器时就能自动地左移1位,累加器中的结果为:Szzzzzz0(Q7格式),即11101000(0.1875),自动地消去了两个带符号数相乘时产生的冗余符号位。在小数乘法编程时,应当事先设置FRCT位如下:SSBXFRCTMPY*AR2,*AR3,ASTHA,@Z这样,TMS320C54x就完成了Q15×Ql5=Q15的小数乘法。

6.9除法运算

1.被除数的绝对值小于除数的绝对值,商为小数

在一般的DSP中都没有除法器硬件。因为除法器硬件代价很高,所以就没有专门的除法指令。同样,在TMS320C54x中也没有一条单周期的16位除法指令。但是,利用条件减法指令(SUBC指令),加上重复指令“RPT#15”,就可实现两个无符号数的除法运算。条件减法指令的功能如下:SUBCSmem,src 2.被除数的绝对值大于等于除数的绝对值,商为整数

6.10浮点运算

1.浮点数的表示方法

在TMS320C54x中,浮点数由尾数和指数两部分组成,它与定点数的关系如下:定点数=尾数×2(指数)例如,定点数0x2000(0.25)用浮点数表示时,尾数为0x4000(0.5),指数为1,即0.25=0.5×21浮点数的尾数和指数可正可负,均用补码表示。指数的范围为8~31。

2.定点数到浮点数的转换

TMS320C54x通过3条指令可将一个定点数转化成浮点数:(1)EXPA(2)STT,EXPONENT(3)NORMA3.浮点数到定点数的转换

知道TMS320C54x浮点数的定义后,就不难将浮点数转换成定点数了。因为浮点数的指数就是在规格化时左移(指数为负时是右移)的位数,所以在将浮点数转换成定点数时,只要按指数值将尾数右移(指数为负时是左移)就行了。

4.浮点乘法举例

【例6-26】编写浮点乘法程序,完成x1×x2=0.3×(0.8)运算。程序中保留10个数据存储单元:x1:被乘数m2:乘数的尾数x2:乘数ep:乘积的指数e1:被乘数的指数mp:乘积的尾数ml:被乘数的尾数product:乘积e2:乘数的指数temp:暂存单元程序清单如下:.title"zh24.asm".mmregs.defstartSTACK.usect"STACK",100;64H.bssx1,1.bssx2,1.bsse1,1.bssm1,1.bsse2,1.bssm2,1.bssep,1.bssmp,1.bssproduct,1.bsstemp,1.datatable:.word3*32768/10;0.3.word-8*32768/10;-0.8.textstart:STM#STACK+100,SP;设置堆栈指针MVPDtable,@x1;将x1和x2传送至数据存储器MVPDtable+1,@x2LD@x1,16,A;将x1规格化为浮点数EXPASTT,@e1;保存x1的指数NORMASTHA,@m1;保存x1的尾数

L

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论