1、第五章第五章 汇编语言编程举例汇编语言编程举例 第一节汇编语言编程的基本方法第一节汇编语言编程的基本方法 第二节第二节 DSPDSP的浮点运算方法的浮点运算方法 第三节第三节 DSPDSP在信号发生器上的应用在信号发生器上的应用 第四节第四节 用用DSPDSP实现实现FIRFIR滤波器滤波器1第一节第一节 汇编语言编程的基本方法汇编语言编程的基本方法 1 1堆栈的使用堆栈的使用 1.压入数据时,堆栈从高地址向低地压入数据时,堆栈从高地址向低地址增长。址增长。2.压栈时指针先减,压栈时指针先减,SP-1,再压入数,再压入数据;据;3.出栈时,先弹出数据后,再出栈时,先弹出数据后,再SP+1。4.
2、如要用堆栈,必须先设置,后使用。如要用堆栈,必须先设置,后使用。要要点点2例例5-1 设计一存储空间为设计一存储空间为100100个单元的堆栈。个单元的堆栈。size size.set 100 .set 100 ;设置堆栈空间的;设置堆栈空间的 ;大小为;大小为100100stack .usect “STK”,size stack .usect “STK”,size;设置堆栈段的首地;设置堆栈段的首地址址 ;和堆栈空间;和堆栈空间 STM#stack+size,SP STM#stack+size,SP;将栈底地址指针送;将栈底地址指针送 ;SPSP,对其初始化,对其初始化3例例5-2 编写求解
3、加、减法的程序,计算编写求解加、减法的程序,计算z=x+y-wz=x+y-w。SUM1SUM1:LD x,A LD x,A ;将;将x x地址的内容送地址的内容送A A ADD y,AADD y,A ;将;将y y地址的内容与地址的内容与A A中中x x值相加值相加 SUB w,ASUB w,A ;将;将A A中的内容与中的内容与w w 相减,得相减,得z z STL A,z STL A,z ;将;将A A的的计算值存入的的计算值存入z z 地址中地址中例例5-3 写求解直线方程的程序,计算写求解直线方程的程序,计算y=mx+by=mx+b。SUM2SUM2:LD m,T LD m,T ;将;
4、将m m 地址的内容送地址的内容送T T MPY x,AMPY x,A ;将;将x x 地址的内容与地址的内容与T T中的中的m m相乘,相乘,;结果送;结果送A A ADD b,AADD b,A ;将;将A A中的中的mxmx与与b b 地址的内容相加,地址的内容相加,;结果送;结果送A A STL A,y STL A,y ;将;将A A的的计算结果存入的的计算结果存入y y 地址中地址中 2 2 加、减法和乘法运算加、减法和乘法运算 4传送速度比加载和存储指令要快;传送速度比加载和存储指令要快;传送数据不需要通过累加器;传送数据不需要通过累加器;可以寻址程序存储器;可以寻址程序存储器;与与
5、RPTRPT指令相结合(重复时,这些指指令相结合(重复时,这些指令都变成单周期指令),可以实现令都变成单周期指令),可以实现数据块传送。数据块传送。3 3 数据块传送数据块传送 特特点点5(1 1)数据存储器)数据存储器数据存储器数据存储器 这类指令有:这类指令有:MVDK Smem,dmad MVDK Smem,dmad 指令的字数指令的字数/执行周期执行周期 2/22/2M V K D d m a d,S m e mM V K D d m a d,S m e m ;S m e m=d m a d S m e m=d m a d 2/22/2M V D D X m e m,Y m e m M
6、 V D D X m e m,Y m e m ;Y m e m=X m e m Y m e m=X m e m 1/11/1(2 2)程序存储器)程序存储器数据存储器数据存储器 这类指令有:这类指令有:M V P D p m a d,S m e m M V P D p m a d,S m e m ;S m e m=p m a d S m e m=p m a d 2/32/3M V D P S m e m,p m a d M V D P S m e m,p m a d ;p m a d=S m e m p m a d=S m e m 2/42/4pmadpmad为为1616位立即数程序存储器地址
7、;位立即数程序存储器地址;dmaddmad为为1616位立即数数据存储器地址;位立即数数据存储器地址;SmemSmem为数据存储器地址;为数据存储器地址;XmemXmem、YmemYmem为双操作数数据存储器地址,为双操作数数据存储器地址,XmemXmem从从DBDB数据总线上读出。数据总线上读出。YmemYmem从从CBCB数据总线上读出。数据总线上读出。6(3 3)数据存储器)数据存储器MMRMMR 这类指令有:这类指令有:MVDM dmad,MMR MVDM dmad,MMR ;指令的字数;指令的字数/执行周期执行周期 2/22/2MVMD MMR,dmad MVMD MMR,dmad
8、;dmad=MMR 2/2dmad=MMR 2/2MVMM mmrx,mmry MVMM mmrx,mmry ;mmry=mmrx 1/1mmry=mmrx 1/1(4 4)程序存储器()程序存储器(AccAcc)数据存储器数据存储器 包括:包括:READA Smem READA Smem ;Smem=prog(A)1/5Smem=prog(A)1/5WRITA Smem WRITA Smem ;prog(A)=Smem 1/5prog(A)=Smem 1/5 mmrx,mmry mmrx,mmry为为AR0AR0AR7AR7或或SPSP;MMRMMR为任何一个存储器映象寄存器;为任何一个存储
9、器映象寄存器;7例例5-6 将数组将数组x5 x5 初始化为初始化为1,2,3,4,51,2,3,4,5。.data .data ;定义初始化数据段起始地址;定义初始化数据段起始地址TBL:.word 1,2,3,4,5 TBL:.word 1,2,3,4,5 ;为标号地址;为标号地址TBLTBL ;开始的;开始的5 5个单元赋初值个单元赋初值 .sect “.vectors”.sect “.vectors”;定义自定义段,并;定义自定义段,并获获 ;得该段起始地址;得该段起始地址 B STARTB START;无条件转移到标号为;无条件转移到标号为STARTSTART的地址的地址 .bss
10、x,5 .bss x,5 ;为数组;为数组x x分配分配5 5个存储单元个存储单元 .text .text ;定义代码段起始地址;定义代码段起始地址START:STM#x,AR5 START:STM#x,AR5 ;将;将x x的首地址存入的首地址存入AR5AR5 RPT#4 RPT#4 ;设置重复执行;设置重复执行5 5次下条指令次下条指令 MVPD TBL,MVPD TBL,*AR5+AR5+;将;将TBLTBL开始的开始的5 5个值传给个值传给x x(1 1)程序存储器)程序存储器数据存储器数据存储器8例例5-7 将数据存储器中的数组将数据存储器中的数组x10 x10复制到数组复制到数组y
11、10y10。.title “cjy1.asm”.title “cjy1.asm”;为汇编源程序取名;为汇编源程序取名 .mmregs .mmregs ;定义存储器映象寄存器;定义存储器映象寄存器STACK.usect “STACK”,30HSTACK.usect “STACK”,30H;设置堆栈;设置堆栈 .bss x,10 .bss x,10 ;为数组;为数组x x分配分配1010个存储单元个存储单元 .bss y,10 .bss y,10 ;为数组;为数组y y分配分配1010个存储单元个存储单元 .data.datatable:.word 1,2,3,4,5,6,7,8,9,10tabl
12、e:.word 1,2,3,4,5,6,7,8,9,10 .def start .def start ;定义标号;定义标号startstart .text .text(2 2)数据存储器)数据存储器数据存储器数据存储器9start:STM#0,SWWSR start:STM#0,SWWSR ;复位;复位SWWSRSWWSR STM#STACK+30H,SP STM#STACK+30H,SP;初始化堆指针;初始化堆指针 STM#x,AR1 STM#x,AR1;将目的地首地址赋给;将目的地首地址赋给AR1AR1 RPT#19 RPT#19 ;设定重复传送的次数为;设定重复传送的次数为2020次次
13、MVPD table,MVPD table,*AR1+AR1+;程序存储器传送到数;程序存储器传送到数 ;据存储器;据存储器 STM#x,AR2 STM#x,AR2;将;将x x的首地址存入的首地址存入AR2AR2 STM#y,AR3 STM#y,AR3;将;将y y的首地址存入的首地址存入AR3AR3 RPT#19 RPT#19 ;设置重复执行;设置重复执行2020次下条指令次下条指令 MVDD MVDD *AR2+,AR2+,*AR3+AR3+;将地址;将地址x x开始的开始的2020个值个值 ;复制到地址;复制到地址y y开始的开始的2020个单元个单元end:B endend:B en
14、d .end .end10用间接寻址方式获得操作数,且用间接寻址方式获得操作数,且辅助寄存器只用辅助寄存器只用AR2AR2AR5AR5;占用程序空间小;占用程序空间小;运行速度快。运行速度快。4 4双操作数乘法双操作数乘法 特特点点例例5-8 编制求解编制求解 的程序。的程序。利用双操作数指令可以节省机器周期。迭代次数利用双操作数指令可以节省机器周期。迭代次数越多,节省的机器周期数也越多。本例中,在每次越多,节省的机器周期数也越多。本例中,在每次循环中,双操作数指令都比单操作数指令少用一个循环中,双操作数指令都比单操作数指令少用一个周期,节省的总机器周期数周期,节省的总机器周期数=1T=1T*
15、N N(迭代次数)(迭代次数)=NT=NT。201iiixay11 单操作数指令方案单操作数指令方案 双操作数指令方案双操作数指令方案 LD#0,B LD#0,B LD#0,B LD#0,B STM#a,AR2 STM#a,AR2 STM#a,AR2 STM#a,AR2 STM#x,AR3 STM#x,AR3 STM#x,AR3 STM#x,AR3 STM#19,BRC STM#19,BRC STM#19,BRCSTM#19,BRC RPTB done-1 RPTB done-1 RPTB done-1 RPTB done-1 LDLD *AR2+,TAR2+,T;1T 1T MPY MPY
16、*AR2+,AR2+,*AR3+,AAR3+,A;1T1T MPYMPY *AR3+,AAR3+,A;1T1T ADD A,B ADD A,B;1T1T ADD A,B ADD A,B ;1T1Tdone:STH B,y done:STH B,ydone:STH B,y done:STH B,y STL B,y+1 STL B,y+1 STL B,y+1STL B,y+112在单个周期内同时利用在单个周期内同时利用C C总线和总线和D D总线,得到总线,得到3232位操作数。位操作数。5 5长字运算长字运算 特特点点使用长操作数指令时,按指令中给出的地址存取的总使用长操作数指令时,按指令中给出
17、的地址存取的总是高是高1616位操作数。这样,有两种数据排列方法:位操作数。这样,有两种数据排列方法:(1 1)偶地址排列法)偶地址排列法 指令中给出的地址为偶地址,存指令中给出的地址为偶地址,存储器中低地址存放高储器中低地址存放高1616位操作数。位操作数。如:如:DLD DLD *AR3+,AAR3+,A执行前:执行前:A=00 0000 0000 A=00 0000 0000 执行后:执行后:A=00 6CAC BD90A=00 6CAC BD90 AR3=0100 AR3=0102 AR3=0100 AR3=0102 (0100h0100h)=6CAC=6CAC(高字)(高字)(010
18、0h0100h)=6CAC=6CAC (0101h0101h)=BD90=BD90(低字)(低字)(0101h0101h)=BD90=BD9013(2 2)奇地址排列法)奇地址排列法 指令中给出的地址为奇地址,存储器中低指令中给出的地址为奇地址,存储器中低地址存放低地址存放低1616位操作数。位操作数。如:如:DLD DLD *AR3+,AAR3+,A执行前:执行前:A=00 0000 0000 A=00 0000 0000 执行后:执行后:A=00 BD90 6CACA=00 BD90 6CAC AR3=0101 AR3=0103 AR3=0101 AR3=0103 (0100h0100h)
19、=6CAC=6CAC(低字)(低字)(0100h0100h)=6CAC=6CAC (0101h0101h)=BD90=BD90(高字)(高字)(0101h0101h)=BD90=BD90推荐采用偶地址排列法,将高推荐采用偶地址排列法,将高1616位操作数放在偶地址存储单元位操作数放在偶地址存储单元中。如:中。如:程序存储器程序存储器 .long 12345678 h .long 12345678 h ;偶地址:;偶地址:12341234 ;奇地址:;奇地址:56785678 数据存储器数据存储器 .bss xhi,2,1,1 .bss xhi,2,1,1 ;偶地址:;偶地址:xhi xhi ;
20、奇地址:;奇地址:xloxlo 变量名称变量名称 字长字长 页邻接页邻接 偶地址排列法偶地址排列法 14例例5-9 计算计算Z Z3232=X=X3232+Y+Y3232。标准运算标准运算 长字运算长字运算 LD xhi,16,A DLD xhi,ALD xhi,16,A DLD xhi,A ADDS xlo,AADDS xlo,A DADD yhi,ADADD yhi,A ADD yhi,16,AADD yhi,16,A DST A,zhi DST A,zhi ADDS ylo,AADDS ylo,A (3 3个字,个字,3 3个个T T)STH A,Zhi STH A,Zhi STL A,
21、Zlo STL A,Zlo(6 6个字,个字,6 6个个T T)15(1)(1)并行运算指同时利用并行运算指同时利用D D总线和总线和E E总线。总线。其中,其中,D D总线用来执行加载或算术运算,总线用来执行加载或算术运算,E E总总线用来存放先前的结果。线用来存放先前的结果。(2)(2)并行指令都是单字单周期指令。并行指令都是单字单周期指令。(3)(3)并行运算时所存储的是前面的运算结并行运算时所存储的是前面的运算结果,存储之后再进行加载或算术运算。果,存储之后再进行加载或算术运算。(4)(4)并行指令都工作在累加器的高位。并行指令都工作在累加器的高位。(5)(5)大多数并行运算指令都受累
22、加器移位大多数并行运算指令都受累加器移位方式方式ASMASM位影响。位影响。6 6并行运算并行运算 特特点点16表表5-1 5-1 并行指令举例并行指令举例指指 令令指指 令令举举 例例操作说明操作说明并行加载和乘法指令并行加载和乘法指令LDMACRLDMACRLDMASRLDMASRLD Xmem,dstLD Xmem,dstMACR Ymem,dstMACR Ymem,dstdst=Xmem16dst=XmemYmem=src(16-ASM16-ASM)dst=Xmem16dst=XmemYmem=src(16-ASM16-ASM)dst=dst+Tdst=dst+T*XmemXmem并行
23、存储和加并行存储和加/减法减法指令指令STADDSTADDSTSUBSTSUBST src,YmemST src,YmemADD Xmem,dstADD Xmem,dstYmem=srcYmem=src(16-ASM16-ASM)dst=dst+Xmemdst=dst+Xmem17例例5-10 编写计算编写计算z=x+yz=x+y和和f=d+ef=d+e的程序段。的程序段。在此程序段中用到了并行存储在此程序段中用到了并行存储/加载指令,即在同一机器周期加载指令,即在同一机器周期内利用内利用E E总线存储和总线存储和D D总线加载。总线加载。数据存储器分配如图数据存储器分配如图5-45-4所示。
24、所示。.title “cjy3.asm”.title “cjy3.asm”.mmregs .mmregsSTACK .usect“STACK”,10HSTACK .usect“STACK”,10H .bss x,3 .bss x,3 ;为第一组变量;为第一组变量 ;分配;分配3 3个存储单元个存储单元 .bss d,3 .bss d,3 ;为第二组变量;为第二组变量 ;分配;分配3 3个存储单元个存储单元 .def start.def start .data .datatable:.word 0123H,1027H,0,1020H,0345H,0table:.word 0123H,1027H,
25、0,1020H,0345H,018 .text .text start:STM#0,SWWSR start:STM#0,SWWSR STM#STACK+10H,SP STM#STACK+10H,SP STM#x,AR1 STM#x,AR1 RPT#5 RPT#5 MVPD table,MVPD table,*AR1+AR1+STM#x,AR5 STM#x,AR5 ;将第一组变量的首地址传给;将第一组变量的首地址传给AR5 AR5 STM#d,AR2 STM#d,AR2 ;将第二组变量的首地址传给;将第二组变量的首地址传给AR2AR2 LD#0,ASM LD#0,ASM ;设置;设置ASM=0
26、ASM=0 LD LD *AR5+,16,A AR5+,16,A;将;将x x的值左移的值左移1616位放入位放入A A的高端字的高端字 ADD ADD *AR5+,16,A AR5+,16,A;将;将y y值左移值左移1616位与位与A A的高端字的高端字x x相加相加 ST A,ST A,*AR5AR5 ;将;将A A中的和值右移中的和值右移1616位存入位存入z z中中 LD LD *AR2+,BAR2+,B ;将;将d d的值左移的值左移1616位放入位放入B B的高端字的高端字 ADD ADD *AR2+,16,B AR2+,16,B;将;将e e值左移值左移1616位与位与B B的
27、高端字的高端字d d相加相加 STH B,STH B,*AR2 AR2 ;将;将B B的高端字中的和值存入的高端字中的和值存入f f中中end:B endend:B end .end .end19 7 76464位加法和减法运算位加法和减法运算 例例5-11 编写计算编写计算Z Z6464=W=W6464+X+X6464-Y-Y6464的程序段。的程序段。这里的这里的W W、X X、Y Y和结果和结果Z Z都是都是6464位数,它们都由两个位数,它们都由两个3232位的位的长字组成。利用长字指令可以完成长字组成。利用长字指令可以完成6464位数的加位数的加/减法。减法。w w3 3 w w2
28、2 w w1 1 w w0 0 (W W6464)+x+x3 3 x x2 2 C x C x1 1 x x0 0 (X X6464)低低3232位相加产生进位位相加产生进位C C-y-y3 3 y y2 2 C yC y1 1 y y0 0 (Y Y6464)低低3232位相减产生借位位相减产生借位CC_ z z3 3 z z2 2 z z1 1 z z0 0 (Z Z6464)20DLD w1,A DLD w1,A ;A=wA=w1 1w w0 0DADD x1,A DADD x1,A ;A=wA=w1 1w w0 0+x+x1 1x x0 0,产生进位产生进位C CDLD w3,B DL
29、D w3,B ;B=wB=w3 3w w2 2ADDC x2,B ADDC x2,B ;B=wB=w3 3w w2 2+x+x2 2+C+CADD x3,16,B ADD x3,16,B ;B=wB=w3 3w w2 2+x+x3 3x x2 2+C+CDSUB y1,A DSUB y1,A ;A=wA=w1 1w w0 0+x+x1 1x x0 0-y-y1 1y y0 0,产生借位产生借位CCDST A,z1 DST A,z1 ;z z1 1z z0 0=w=w1 1w w0 0+x+x1 1x x0 0-y-y1 1y y0 0SUBB y2,B SUBB y2,B ;B=wB=w3 3
30、w w2 2+x+x3 3x x2 2+C-y+C-y2 2-C-CSUB y3,16,B SUB y3,16,B ;B=wB=w3 3w w2 2+x+x3 3x x2 2+C-y+C-y3 3y y2 2-C-CDST B,z3 DST B,z3 ;z z3 3z z2 2=w=w3 3w w2 2+x+x3 3x x2 2+C-y+C-y3 3y y2 2-C-C由于没有长字带进(借)位加由于没有长字带进(借)位加/减法指令,所以上述程序减法指令,所以上述程序中只能用中只能用1616位带进(借)位指令位带进(借)位指令ADDCADDC和和SUBBSUBB。21 8.32 8.32位乘法运
31、算位乘法运算 x1 x0 S U x1 x0 S U y1 y0 S U y1 y0 S U_ _ _ x0 x0*y0 U y0 U*U U y1 y1*x0 S x0 S*U U x1 x1*y0 S y0 S*U Uy1 y1*x1 S x1 S*S S_ _ _w3 w2 w1 w0 S U U Uw3 w2 w1 w0 S U U U例例5-12 编写计算编写计算W W6464=X=X3232*Y Y3232的程序段。的程序段。3232位乘法算式如下:位乘法算式如下:图图5-55-522 其中,其中,S S为带符号数,为带符号数,U U为无符号数。数据存储器分配如为无符号数。数据存储
32、器分配如图图5-55-5所示。在所示。在3232位乘法运算中,实际上包括了三种乘法运算:位乘法运算中,实际上包括了三种乘法运算:U U*U U、S S*U U和和S S*S S。一般的乘法运算指令都是两个带符号数相乘,。一般的乘法运算指令都是两个带符号数相乘,即即S S*S S。所以,在编程时,要用到以下三条乘法指令:所以,在编程时,要用到以下三条乘法指令:MACSU Xmem,Ymem,src MACSU Xmem,Ymem,src;无符号数与带符号数相乘并累;无符号数与带符号数相乘并累加加 ;src=Usrc=U(XmemXmem)*S S(YmemYmem)+src+src MPYU S
33、mem,dst MPYU Smem,dst ;无符号数相乘;无符号数相乘 ;dst=Udst=U()()*U U(SmemSmem)MAC Xmem,Ymem,src MAC Xmem,Ymem,src;两个符号数数相乘并累加;两个符号数数相乘并累加 ;src=Ssrc=S(XmemXmem)*S S(YmemYmem)+src+src3232位乘法的程序段如下:位乘法的程序段如下:23 STM#x0,AR2 STM#x0,AR2 ;将;将x x的首地址放入的首地址放入AR2 AR2 STM#y0,AR3 STM#y0,AR3 ;将;将y y的首地址存入的首地址存入AR3AR3 LD LD *
34、AR2,T AR2,T ;T=x0T=x0 MPYU MPYU *AR3+,AAR3+,A ;A=ux0A=ux0*uy0uy0 STL A,w0 STL A,w0 ;w0=ux0w0=ux0*uy0uy0 LD A,-16,A LD A,-16,A ;A=A16A=A16 MACSU MACSU *AR2+,AR2+,*AR3-,AAR3-,A ;A+=y1A+=y1*ux0ux0 MACSU MACSU *AR3+,AR3+,*AR2,AAR2,A ;A+=x1A+=x1*uy0uy0 STL A,w1 STL A,w1 ;w1=Aw1=A LD A,-16,A LD A,-16,A ;A
35、=A16A=A16 MAC MAC *AR2,AR2,*AR3,AAR3,A ;A+=x1A+=x1*y1y1 STL A,w2 STL A,w2 ;w2=Aw2=A的低的低1616位位 STH A,W3 STH A,W3 ;w3=Aw3=A的高的高1616位位24 9 9小数运算小数运算 整数运算的问题整数运算的问题(1 1)两个)两个1616位整数相乘,乘积总是位整数相乘,乘积总是“向左增向左增长长”。这意味着多次相乘后,乘积将会很快超出。这意味着多次相乘后,乘积将会很快超出定点器件的数据范围。定点器件的数据范围。(2 2)保存)保存3232位乘积到存储器,要开销位乘积到存储器,要开销2
36、2个机个机器周期以及器周期以及2 2个字的存储器单元。个字的存储器单元。(3 3)由于乘法器都是)由于乘法器都是1616位相乘,因此很难在位相乘,因此很难在后续的递推运算中,将后续的递推运算中,将3232位乘积作为乘法器的输位乘积作为乘法器的输入。入。小数运算的优点小数运算的优点(1 1)乘积总是)乘积总是“向右增长向右增长”。这就味着超出。这就味着超出定点器件数据范围的将是不太感兴趣的部分。定点器件数据范围的将是不太感兴趣的部分。(2 2)既可以存储)既可以存储3232位乘积,也可以存储高位乘积,也可以存储高1616位乘积,这就允许用较少的资源保存结果。位乘积,这就允许用较少的资源保存结果。
37、(3 3)可以用于递推运算。)可以用于递推运算。小数小数运算运算与整与整数运数运算的算的比较比较25C54xC54x采用采用2 2的补码表示小数,其最高位为符号位,数值范围的补码表示小数,其最高位为符号位,数值范围从从-1-11 1。一个。一个1616位位2 2的补码小数(的补码小数(Q15Q15格式)的每一位的权值格式)的每一位的权值为:为:MSBMSB(最高位)(最高位)LSB LSB(最低位)(最低位)-1.1/2 1/4 1/8 -1.1/2 1/4 1/8 2 2-15-15一个十进制小数乘以一个十进制小数乘以3276832768之后再将其十进制整数部分转换之后再将其十进制整数部分转
38、换成十六进制数,就能得到这个十进制小数的成十六进制数,就能得到这个十进制小数的2 2的补码表示了。的补码表示了。11 7FFFh7FFFh0.50.5正数:乘以正数:乘以32768 32768 4000h4000h0 0 0000h0000h-0.5-0.5 负数:其绝对值部分乘以负数:其绝对值部分乘以3276832768,再取反加,再取反加1 C000h1 C000h-1-1 8000h8000h(1 1)小数的表示方法)小数的表示方法26在汇编语言中,是不能直接写入十进制在汇编语言中,是不能直接写入十进制小数的,可写为整数运算式。小数的,可写为整数运算式。如果要定义一个系数如果要定义一个系
39、数0.7070.707,可以写成:,可以写成:.word 32768.word 32768*707/1000707/1000不能写成不能写成3276832768*0.7070.707。注意注意Q Q格式表示法格式表示法 在在Q Q格式中,格式中,Q Q之后的数字(如之后的数字(如Q15Q15格式中的格式中的1515)决)决定小数点右边有多少位二进制位,故定小数点右边有多少位二进制位,故Q15Q15表示在小数表示在小数点后有点后有1515位小数。当用一个位小数。当用一个1616位的字来表示位的字来表示Q15Q15格式格式时,在时,在MSBMSB(最高位)的右边有一个小数点,而(最高位)的右边有一
40、个小数点,而MSBMSB表表示符号位。所以示符号位。所以Q15Q15的表示数字可表示范围从的表示数字可表示范围从+1+1(以(以+0.999997+0.999997表示)到表示)到-1-1的值。的值。27通过合适的通过合适的Q Q格式,可以把数值根据所需的精确度做格式,可以把数值根据所需的精确度做适当地转换,以便定点数的适当地转换,以便定点数的DSPDSP也可以处理高精度的也可以处理高精度的浮点数。下面以浮点数。下面以Q15Q15为例,说明转换的过程。为例,说明转换的过程。1 1)先确定准备转换的十进制数值先确定准备转换的十进制数值N N,是在,是在Q15Q15格式格式的数值范围之间,即的数值
41、范围之间,即-1.000000N+0.999997-1.000000N+0.999997。2 2)数值)数值N N乘以乘以2 21515,即,即N=NN=N2 21515=N=N32768327683 3)把步骤)把步骤2 2)的结果加)的结果加2 21616,即,即N=N+2N=N+21616=N+65536=N+65536。4 4)步骤)步骤3 3)的结果转换成十六进制,并把第)的结果转换成十六进制,并把第1717位舍位舍弃掉,得到的结果就是弃掉,得到的结果就是N N的的Q15Q15转换值。转换值。28下面通过把下面通过把-0.2345-0.2345及及+0.2345+0.2345转换成转
42、换成Q15Q15格式来说格式来说明转换方法。明转换方法。-0.2345-0.2345的转换为:的转换为:-0.2345-0.234532768=-7684.1-768432768=-7684.1-7684-7684+65536=57852-7684+65536=578525785257852转换成十六进制数值为转换成十六进制数值为0E1FCh0E1FCh,所以结果为,所以结果为E1FChE1FCh。+0.2345+0.2345的转换为:的转换为:0.23450.234532768=7684.1768432768=7684.176847684+65536=733207684+65536=7332
43、07332073320转换成十六进制数值为转换成十六进制数值为11E04h11E04h,并把第,并把第1717位位舍弃掉,结果为舍弃掉,结果为1E04h1E04h。29以字长为以字长为4 4位和位和8 8位累加器为例,先看一个小数乘法的例子。位累加器为例,先看一个小数乘法的例子。0 1 0 00 1 0 0(0.520.523 30.5=0.5=(4 4)1010=(01000100)2 2)1 1 0 1 1 1 0 1(-0.3752-0.37523 3(-0.375-0.375)=(-3-3)1010 0 1 0 00 1 0 0 =(11011101)补补)0 0 0 00 0 0 0
44、 0 1 0 0 0 1 0 01 1 0 0 1 1 0 0 (-0100-0100)1 1 1 0 1 0 0 1 1 1 0 1 0 0(-0.1875=-12/2-0.1875=-12/26 6-12=-12=(11101001110100)补补)(2 2)小数乘法与冗余符号位)小数乘法与冗余符号位30上述乘积是上述乘积是7 7位,当将其送到位,当将其送到8 8位累加器时,为保位累加器时,为保持乘积的符号,必须进行符号位扩展,这样,累加持乘积的符号,必须进行符号位扩展,这样,累加器中的值为器中的值为1111010011110100(-0.09375=-12/2-0.09375=-12/
45、27 7),出现了),出现了冗余符号位。原因是:冗余符号位。原因是:S x x x S x x x (Q3Q3)S y y y S y y y (Q3Q3)S S z z z z z z S S z z z z z z (Q6Q6格式)格式)即两个带符号数相乘,得到的乘积带有即两个带符号数相乘,得到的乘积带有2 2个符号位个符号位,造成错误的结果。,造成错误的结果。同样,对于两个十六位数相乘,乘积只有同样,对于两个十六位数相乘,乘积只有3030位,位,在最高的两位也是符号位,同样会造成错误的结果在最高的两位也是符号位,同样会造成错误的结果。31解决冗余符号的办法是:在程序中设定状态寄存器解决冗
46、余符号的办法是:在程序中设定状态寄存器ST1ST1中的中的FRCTFRCT(小数方式)位(小数方式)位1 1,在乘法器将结果传送,在乘法器将结果传送至累加器时就能自动地左移至累加器时就能自动地左移1 1位,累加器中的结果为:位,累加器中的结果为:zzzzzz0zzzzzz0(Q7Q7格式),即格式),即1110100011101000(-0.1875=-0.1875=-24/224/27 7-24=-24=(1110100011101000)补补),自动地消去了两个带),自动地消去了两个带符号数相乘时产生的冗余符号位。所以在小数乘法编符号数相乘时产生的冗余符号位。所以在小数乘法编程时,应当事先
47、设置程时,应当事先设置FRCTFRCT位:位:SSBX FRCTSSBX FRCT MPY MPY *AR2,AR2,*AR3,AAR3,ASTH A,ZSTH A,Z这样,这样,C54xC54x就完成了就完成了Q15Q15*Q15=Q15Q15=Q15的小数乘法。的小数乘法。32例例5-13 编制计算编制计算 的程序段,其中数据均为的程序段,其中数据均为小数:小数:a a1 1=0.1,a=0.1,a2 2=0.2,a=0.2,a3 3=-0.3,a=-0.3,a4 4=0.4,x=0.4,x1 1=0.8,=0.8,x x2 2=0.6,x=0.6,x3 3=-0.4,x=-0.4,x4
48、4=-0.2=-0.2。.title “cjy4.asm”.title “cjy4.asm”.mmregs .mmregsSTACK.usect “STACK”,10HSTACK.usect “STACK”,10H .bss a,4 .bss a,4 ;为;为a a分配分配4 4个存储单元个存储单元 .bss x,4 .bss x,4 ;为;为x x分配分配4 4个存储单元个存储单元 .bss y,1 .bss y,1 ;为结果;为结果y y分配分配1 1个存储单元个存储单元 .def start.def start .data .data ;定义数据代码段;定义数据代码段41iiixay33
49、table:.word 1table:.word 1*32768/10 32768/10;在;在tabletable开始的开始的8 8个个.word 2.word 2*32768/10 32768/10;地址放数据;地址放数据 .word -3.word -3*32768/1032768/10 .word 4.word 4*32768/1032768/10 .word 8.word 8*32768/1032768/10 .word 6.word 6*32768/1032768/10 .word -4.word -4*32768/1032768/10 .word -2.word -2*32768
50、/1032768/1034.text .text ;定义可执行程序代码段;定义可执行程序代码段start:SSBX FRCTstart:SSBX FRCT ;设置;设置FRCTFRCT位,表示进行小数乘位,表示进行小数乘 STM#x,AR1 STM#x,AR1 ;将;将x x的首地址传给的首地址传给AR1AR1 RPT#7 RPT#7 ;重复;重复8 8次下条指令次下条指令 MVPD table,MVPD table,*AR1+AR1+;将程序空间;将程序空间8 8个数传给数据存储器个数传给数据存储器 STM#x,AR2 STM#x,AR2;将数据存储器第一个数;将数据存储器第一个数x x1
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。