《数字信号处理技术第五章汇编语言程序设计课件.ppt》由会员分享,可在线阅读,更多相关《数字信号处理技术第五章汇编语言程序设计课件.ppt(34页珍藏版)》请在三一办公上搜索。
1、第5章 汇编语言程序设计举例:5.1 数据块传送例1:将数组X5=1,2,3,4,5初始化.dataTAL:.word 1,2,3,4,5.sect“.vectors”B START.bss x,5.textSTART:STM#x,AR5 RPT#4 MVPD TAB,*AR5+,例2:编写一段程序将数据存储器中的数组X20复制到 数组Y20中。.bss x,20.bss y,20 STM#x,AR2 STM#y,AR3 RPT#19 MVDD AR2+,AR3+,5.2 加减法和乘法运算例3:编写完成 Z=X+Y-W的功能LD x,A;直接寻址ADD y,ASUB w,A;A=A-wSTL
2、A,z例4:编程实现 y=mx+b 的功能 LD m,TMPY x,AADD b,ASTL A,y,例5:编写实现 y=x1a1+x2 a2的功能LD x1,TMPY a1,BLD x2,TMAC a2,BSTL B,ySTH B,y+1,例6:找出y=aixi(i=1,2,3,4)中乘机项aixi的最大值,并存入累加器A中。STM#a,AR1 STM#x,AR2 STM#2,AR3 LD*AR1+,T MPY*AR2+,ALoop1:LD*AR1+,T MPY*AR2+,B MAX A BANZ loop1,*AR3-,5.3 重复操作例7:对一个数组初始化:X5=0,0,0,0,0.bss
3、 x,5 STM#x,AR1 LD#0,A RPT#4 STL A,*AR1+或采用如下方法:.bss x,5 STM#x,AR1 RPTZ A,#4 STL A,*AR1+注意:执行重复操作时不响应任何中断,例8:对数组X5中的每个元素加1.bss x,5Begin:LD#1,16,B STM#4,BRC STM#X,AR4 RPTB next-1 ADD*AR4,16,B,A STH A,*AR4+Next:LD#0,B,5.4 程序的控制与转移例9:RC TC CC sub,BNEQ BC new,AGT,AOV例10:计算 y=xi(i=15).bss x,5.bss y,1 STM#
4、x,AR1 STM#4,AR2 LD#0,ALoop:ADD*AR1+,A BANZ loop,*AR2-STL A,y,例11:STM#5,AR1 STM#10,AR0Loop:*AR1+CMPR LT,AR1;若(AR1)(AR0),则TC=1 BC loop,TC;若TC=1,则转LOOP,5.5 堆栈的使用方法在数据RAM空间开辟一个堆栈区,设置如下:Size.set100Stack.usect”STK”,size STM#stack+size,SP,例12:编写实现方程y=mx+b的程序,单操作数法:LD m,T MPY x,A ADD b,A STL A,y,双操作数法:MPY*A
5、R2,*AR3,A ADD b,A STL A,y,5.6 双操作数乘法,例13:编写完成 y=aixi(i=120),采用单操作数方法:LD#0,B STM,#a,AR2 STM#x,AR3 STM#19,BRC RPTB done-1 LD*AR2+,T3T MPY*AR3+,A ADD A,BDone:STH B,y STL B,y+1,采用双操作数的方法:LD#0,B STM,#a,AR2 STM#x,AR3 STM#19,BRC RPTB done-12T MPY*AR2+,AR3+,A ADD A,BDone:STH B,y STL B,y+1,例14:进一步优化例13的程序:ST
6、M#x,AR2STM#a,AR3RPTZ A,#19MAC*AR2+,*AR3+,ASTH A,ySTL A,y+1,例15 计算Z32=X32+Y32,标准运算LD xhi,16,AADDS xho,AADD yhi,16,AADDS yho,ASTH A,zhiSTL A,zho(6个字,6个T),长字运算DLD xhi,ADADD yhi,ADSTA,zhi(3个字,3个T),除DST指令(存储32位数要用E总线2次,需2个机器周期)外,都是单周期指令,也是在单个周期内同时利用C总线和D总线,得到32位操作数。,5.7 长字运算和并行运算,并行运算指令有4种:并行加载和乘法指令,并行加载
7、和存储指令,并行存储和乘法指令,并行存储和加/减法指令。,例16:编写计算和的程序段.bss x,3.bss d,3 STM#x,AR5 STM#d,AR2 LD#0,ASM ADD*AR5+,16,A ST*AR5+,16,A|LD*AR2+,B ADD*AR2+,16,B STH B,*AR2,x,y,z,e,d,f,AR5,AR2,例编写计算Z64=W64+X64-Y64 的程序段W、X、Y和结果Z都是64位,它们都由两个32位的长字组成。利用长字指令完成位数的加减法,W3 w2 w1 w0(W64)x3 x2 C x1 x0(X64)y3 y2 C y1 y0(Y64)z3 z2 z1
8、 z0(Z64),低32 位相加产生进位C低32位相减产生借位C,程序段:DLD w1,A;A=w1w2 DADD x1,A;A=w1w0+x1x0,产生进位C DLD w3,B;B=w3w2 ADDC x2,B;B=w3w2+x2+C ADD x3,16,B;B=w3w2+x3x2+C DSUB y1,A;A=w1w0+x1x0-y1y0,产生借位C DST A,z1;z1z0=w1w0+x1x0-y1y0 SUBBy2,B;B=w3w2+x3x2+C-y2-C SUB y3,16,B;B=w3w2+x3x2+C-y3y2-C DST B,z3;z3z2=w3w2+x3x2+C-y3y2-C
9、,32位乘法运算 乘法算式如下:x1 x0 S U y1 y0 S U x0y0 UU y1x0 SU x1y0 SU Y1x1 SS w3 w2 w1 w0 S U U U 其中,S-带符号数,U-无符号数,例18:编写计算W64=X32*Y32 的程序段STM#x0,AR2STM#y0,AR3LD*AR2,T;T=x0MPYU AR3+,A;A=uy0*ux0STL A w0;w0=ux0*uy0LD A,-16,A;A=A16MACSU*AR2+,*AR3-,A;A+=y1*ux0MACSU*AR3+,*AR2,A;A+=x1*uy0STL A,w1;w1=ALD A,-16,A;A=A
10、16MAC*AR2,*AR3,A;A+=x1*y1STL A,w2;w2=A的低16位STL A,w3;w3=A的高16位,5.8 小数运算,1.小数的表示方法 C54X采用2的补码小数,其最高位为符号位数值范围从-11,一个16位2的补码小数的每一位权值为:一个十进制小数乘以32768之后,将十进制整数部分转换成十六进制数,就得到了这个十进制小数的2的补码表示了。注意:汇编语言程序中,不能直接写入十进制小数。要定义 一个系数0.707,可以写成:word 32768707/1000不能写成327680.707.,-1 1/2 1/4 1/8 2-15,2.小数乘法与冗余符号位出现冗余符号位是
11、两个带符号数相乘,得到的乘积带2个符号位,造成错误的结果。解决冗余符号位的方法:在程序中设定状态寄存器ST1中的FRAT(小数方式)位为1,在乘法器将结果送至累加器时就能自动的左移一位,自动地消去了两个带符号数相乘时产生的冗余符号位。注意:小数乘法编程时,应事先设置FRCT位:SSBX FRCT MPY AR2,*AR3,A STH A,Z,例19 编写计算 y=ai*xi(i=14)的程序其中数据均为小数:a1=0.1 a2=0.2 a3=-0.3 a4=0.4 x1=0.8 x2=0.6 a3=-0.4 x4=-0.2.bss x,4.bss a,4.bss y,1.data Table:
12、.word 1*32768/10.word 2*32768/10.word-3*32768/10.word 4*32768/10.word 8*32768/10.word 6*32768/10.word-4*32768/10.word-2*32768/10.text,Start:SSBX FRCT STM#x,AR1 RPT#7 MVPD table,*AR1 STM#x,AR2 STM#a,AR3 RPTZ A,#3 MAC AR2+,AR3,A STH A,yDone:B done,5.9 除法运算,C54X中没有单周期的16位除法指令,利用一条条减法指令(SUBC),加上重复指令RPT#
13、15就可实现两个无符号的除法运算。SUBC Smem,src;(src)-(Smem)15ALU输出端;如果ALU输出端0,则(ALU输出 端)1+1src;否则(src)1src除法运算有两种情况:,1.|被除数|除数|,商为小数 例20:编写0.4(0.8)的程序段.bss num,1.bss den,1.bss quot,1.dataTable:.word 4*32768/10;0.4.word-8*32768/10;-0.8.textStart:STM#num,AR1 RPT#1 MVPD table,*AR1;传送2个数据至分子、分母单元 LD den,16,A;将分母移到累加器A(
14、3116)MPYA num;(num)*(A(3216)B,获取商的符号(在累加器B中)ABS A;分母取绝对值,STH A,den;分母绝对值存放原处LD num,16,A;分子A(3216)ABS A;分子取绝对值RPT#14;15次减法循环,完成除法SUBC den,A;如果B0(商是负数),则需要变号XC 1,BLTNEG ASTL A,quot;保存商,注意:SUBC指令仅对无符号数进行操作,因此事先必须对除数和被除数取绝对值。利用乘法操作,获得商的符号,最后通过条件执行指令给商加上适当的符号。,2.|被除数|除数|,商为整数 与例 20,除输入数据外,仅有下列改动LD num,16
15、,A 改成 LD num,ARPT#14 改成 RPT#15,5.10 浮点运算,为了扩大数据的范围和精度,往往需要采用浮点运算。C54X虽然是个定点DSP器件,但它支持浮点运算。1.浮点数的表示方法 浮点数用 尾数和指数组成,定点数=尾数2-指数 浮点数的尾数和指数可正可负,均用补码表示。指数范围-831。2.定点数浮点数 通过3条指令实现(假设定点数已在累加器A中)1)EXP A 例22 EXP A 执行前 执行后 A=FF FFFF FFCB A=FF FFFF FFCB T=0000 T=0019(25),例23 EXP B 执行前 执行后 A=07 8543 2105 A=FF 85
16、43 0000 T=0007 T=FFFC(-4)2)ST T,EXPONENT 这条紧接在XEP后的指令是将保存在T寄存器中的指数存放到数据寄存器的指数单元。3)NORM A 例24:NORM A 执行前 执行后 A=FF FFFF F001 A=FF 8008 0000 T=0013 T=0013(19),例25:NORM B,A 执行前 执行后 A=FF FFFF F001 A=FF 4214 1414 B=21 0A0A 0A0A B=FF 4214 1414 T=FFF9 T=FFF9(-7)注意:NORM指令不能紧跟在EXP指令的后面。3.浮点数定点数 将浮点数转化为定点数时,只要按指数值将其右移(指数为负数时左移)就行了。4.浮点数乘法举例 见书P229页例26,【例5.26】编写浮点乘法程序,完成x1x20.3(0.8)运算程序中保留10个数据存储单元:,