![第6章汇编语言程序设计[DSP技术与应用实例(第3版)]_第1页](http://file1.renrendoc.com/fileroot_temp2/2020-3/30/a461747b-9057-4486-91df-e9b9292eef29/a461747b-9057-4486-91df-e9b9292eef291.gif)
![第6章汇编语言程序设计[DSP技术与应用实例(第3版)]_第2页](http://file1.renrendoc.com/fileroot_temp2/2020-3/30/a461747b-9057-4486-91df-e9b9292eef29/a461747b-9057-4486-91df-e9b9292eef292.gif)
![第6章汇编语言程序设计[DSP技术与应用实例(第3版)]_第3页](http://file1.renrendoc.com/fileroot_temp2/2020-3/30/a461747b-9057-4486-91df-e9b9292eef29/a461747b-9057-4486-91df-e9b9292eef293.gif)
![第6章汇编语言程序设计[DSP技术与应用实例(第3版)]_第4页](http://file1.renrendoc.com/fileroot_temp2/2020-3/30/a461747b-9057-4486-91df-e9b9292eef29/a461747b-9057-4486-91df-e9b9292eef294.gif)
![第6章汇编语言程序设计[DSP技术与应用实例(第3版)]_第5页](http://file1.renrendoc.com/fileroot_temp2/2020-3/30/a461747b-9057-4486-91df-e9b9292eef29/a461747b-9057-4486-91df-e9b9292eef295.gif)
已阅读5页,还剩30页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章汇编语言程序设计,6.1程序的控制与转移,TMS320C54x具有丰富的程序控制与转移指令,利用这些指令可以执行分支转移、循环控制及子程序操作。基本的程序控制指令如表6-1所示。,表6-1基本的程序控制指令,1条件算符,条件分支转移指令或条件调用、条件返回指令都用条件来限制分支的转移、调用和返回操作。条件算符分成两组,每组组内还有分类。,选用条件算符时应当注意以下3点:,第1组:组内两类条件可以进行与/或运算,但不能在组内同一类中选择两个条件算符与/或。当选择两个条件时,累加器必须是同一个。例如,可以同时选择AGT和AOV,但不能同时选择AGT和BOV。第2组:可从组内3类算符中各选一个条件算符与/或,但不能在组内同一类中选两个条件算符与/或。例如,可以同时测试TC、C和BIO,但不能同时测试NTC和TC。组与组之间的条件只能进行或运算。,2循环操作BANZ,在程序设计时,经常需要重复执行某段程序,利用BANZ(当辅助寄存器不为0时转移)指令执行循环计数和操作是十分方便的。,SUM:STM#x,AR3STM#4,AR2loop:ADD*AR3+,A;程序存储器BANZloop,*AR2-STLA,y,3比较操作CMPR,编程时,经常需要数据与数据进行比较,这时利用比较指令CMPR是很合适的。CMPR指令测试所规定的AR寄存器(AR1AR7)与AR0的比较结果。如果所给定的测试条件成立,则TC位置1,然后,条件分支转移指令就可根据TC位的状态进行分支转移了。注意,所有比较的数据都是无符号操作数。,STM#5,AR1STM#10,AR0loop:.*AR1+.CMPRLT,AR1BCloop,TC,6.2堆栈的使用方法,TMS320C54x提供一个用16位堆栈指针(SP)寻址的软件堆栈。当向堆栈中压入数据时,堆栈从高地址向低地址增长。堆栈指针是减在前、加在后,即先SP1再压入数据,先弹出数据后SP+1。,如果程序中要用到堆栈,则必须先进行设置,方法如下:size.set100stack.usectSTK,sizeSTM#stack+size,SP,上述语句在数据RAM空间开辟一个堆栈区。前两句在数据RAM中自定义一个名为STK的保留空间,共100个单元。第3句将这个保留空间的高地址(#stack+size)赋给SP,作为栈底,参见图6-1。至于自定义未初始化段STK究竟定位在数据RAM中的什么位置,应当在链接器命令文件中规定。,图6-1堆栈,设置堆栈之后,就可以使用堆栈了,例如:,CALLpmad;(SP)-1SP,(PC)+2TOS;pmadPCRET;(TOS)PC,(SP)+lSP,堆栈区应开辟多大?这需要按照以下步骤来确定:,先开辟一个大堆栈区,且用已知数填充。运行程序,执行所有的操作。暂停,检查堆栈中的数值如下图。用过的堆栈区才是实际需要的堆栈空间。,1.加减法,【例6-4】计算z=x+yw。SUMB:LDx,AADDy,ASUBw,ASTLA,zRET.end计算结果:数据寄存器地址存储内容十进制数x0060H000AH10y0061H001AH26w0062H0017H23z0063H000DH13,6.3加减法运算和乘法运算,2.乘法,【例6-5】计算y=mx+b。SU:LDm,TMPYx,AADDb,ASTLA,yRET.end计算结果:数据寄存器地址存储内容十进制数m0060H0003H3x0061H000FH15b0062H0014H20y0063H0041H65,6.4重复操作,1重复执行单条指令,重复指令RPT或RPTZ允许重复执行紧随其后的那一条指令。如果要重复执行n次,则重复指令中应规定计数值为n1。由于重复的指令只需要取指一次,与利用BANZ指令进行循环相比,效率要高得多。,【例6-9】对数组x50,0,0,0,0进行初始化。.bssx,5或者STM#x,AR1LD#0H,ARPT#4STLA,*AR1+或者.bssx,5STM#x,AR1RPTZ#4STLA,*AR1+,2块程序重复操作,块程序重复操作RPTB将重复操作的范围扩大到任意长度的循环回路。由于块程序重复指令RPTB的操作数是循环回路的结束地址,而且,其下条指令就是重复操作的内容,因此必须先用STM指令将所规定的迭代次数加载到块重复计数器(BRC)中。RPTB指令的特点是:对任意长度的程序段的循环开销为0,其本身是一条2字4周期指令;循环开始地址(RSA)是RPTB指令的下一行,结束地址(REA)由RPTB指令的操作数规定。,【例6-10】对数组x5中的每个元素加1。.bssx,5start:LD#1,16,BSTM#4,BRCSTM#x,AR4RPTBnext-1ADD*AR4,16,B,ASTHA,*AR4+next:LD#0,B,3循环的嵌套,执行RPT指令时要用到RPTC寄存器(重复计数器),执行RPTB指令时要用到BRC、RSA和RSE寄存器。由于两者用了不同的寄存器,因此RPT指令可以嵌套在RPTB指令中,实现循环的嵌套。当然,只要保存好有关的寄存器,RPTB指令也可以嵌套在另一条RPTB指令中,但效率并不高。,下图是一个三重循环嵌套结构,内层、中层和外层三重循环分别采用RPT、RPTB和BANZ指令,重复执行N、M和L次。,6.5数据块传送,这些指令的特点如下:(1)传送速度比加载和存储指令的速度要快;(2)传送数据不需要通过累加;(3)可以寻址程序存储器;(4)与RPT指令相结合,可以实现数据块传送。,1程序存储器数据存储器,【例6-11】初始化数组x5=1,2,3,4,5。.titlezh9.asm.mmregsSTACK.usectSTACK,10H.bssx,5.datatable:.word1,2,3,4,5.defstart.textstart:STM#x,AR1RPT#4MVPDtable,*AR1+end:Bend.end,2数据存储器数据存储器,【例6-12】编写一段程序,将数据存储器中数组x20中的数据复制到数组y20中。.titlezh10.asm.mmregsSTACK.usectSTACK,30H.bssx,20.bssy,20.datatable:.word1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20.defstart.textstart:STM#x,AR1RPT#19MVPDtable,*AR1+;从程序存储器传送到数据存储器中STM#x,AR2STM#y,AR3RPT#19MVDD*AR2+,*AR3+;从数据存储器传送到数据存储器中end:Bend.end,20个数据从0060H0073H传送到0074H0087H,结果如图所示:,6.6双操作数乘法,TMS320C54x片内的多总线结构,允许在一个机器周期内通过两条16位数据总线(C总线和D总线)寻址两个数据和系数,如图6-6所示。,如果求y=mx+b,则单操作数和双操作数实现方法比较如表6-4所示:,表6-4单/双操作数编程比较,用双操作数指令编程的特点为:(1)用间接寻址方式获得操作数,且辅助寄存器只能用AR2AR5;(2)占用的程序空间小;(3)运行的速度快。,双操作数MAC型的指令有4种,如表6-5所示:,表6-5MAC型双操作数指令,对于Xmem和Ymem,只能用以下辅助寄存器及寻址方式:辅助寄存器AR2寻址方式*ARnAR3*ARn+AR4*ARnAR5*ARn+0%,6.7长字运算和并行运算,1长字指令,DLDLmem,dst;dst=LmemDSTsrc,Lmem;Lmem=srcDADDLmem,src,dst;dst=src+LmemDSUBLmem,src,dst;dst=src-LmemDRSUBLmem,src,dst;dst=Lmem-src,(1)偶地址排列法,(2)奇地址排列法,【例6-15】计算Z32=X32+Y32。,标准运算.titlezh16.asm.mmregsSTACK.usectSTACK,10H.bssxhi,1.bssxlo,1.bssyhi,1.bssylo,1.bsszhi,1.bsszlo,1.defstart.datatable:.word1678H,2345H.word1020H,0D34AH.textstart:STM#0,SWWSRSTM#STACK+10H,SPSTM#xhi,AR1RPT#3MVPDtable,*AR1+LDxhi,16,AADDSxlo,AADDyhi,16,AADDSylo,ASTHA,zhiSTLA,zloend:Bend.end(6个字,6个T),长字运算.titlezh17.asm.mmregsSTACK.usectSTACK,10H.bssxhi,2,1,1.bssyhi,2,1,1.bsszhi,2,1,1.defstart.datatable:.long16782345H,1020D34AH.textstart:STM#0,SWWSRSTM#STACK+10H,SPSTM#xhi,AR1RPT#3MVPDtable,*AR1+DLDxhi,ADADDyhi,ADSTA,zhiend:Bend.end(3个字,3个T),2并行运算,并行运算指令举例,【例6-16】用并行运算指令编写计算z=x+y和f=e+d的程序。,.mmregsSTACK.usectSTACK,10H.bssx,3.bssd,3.defstart.datatable:.word0123H,1027H,0,1020H,0345H,0.textstart:STM#0,SWWSRSTM#STACK+10H,SPSTM#x,AR1RPT#5MVPDtable,*AR1+STM#x,AR5STM#d,AR2LD#0,ASMLD*AR5+,16,AADD*AR5+,16,ASTA,*AR5;并行指令|LD*AR2+,BADD*AR2+,16,BSTHB,*AR2end:Bend.end,364位加法和减法运算,64位数的加法和减法算式如下:,例6-17编写计算Z64=W64+X64-Y64的程序。W、X、Y和结果Z都是64位数,它们都由两个32位的长字组成。利用长字指令可以完成64位数的加减法。,DLDw1,A;A=w1w0DADDx1,A;A=w1w0+x1x0,产生进位CDLDw3,B;B=w3w2ADDCx2,B;B=w3w2+x2+CADDx3,16,B;B=w3w2+x3x2+CDSUBy1,A;A=w1w0+x1x0-y1y0,产生借位CDSTA,z1;z1z0=w1w0+x1x0-y1y0SUBBy2,B;B=w3w2+x3x2+C-y2-CSUBy3,16,B;B=w3w2+x3x2+C-y3y2-CDSTB,z3;z3z2=w3w2+x3x2+C-y3y2-C,数据计算结果,432位乘法运算,32位乘法算式如下:,其中,S带符号数,U无符号数。由上算式可见,在32位乘法运算中,实际上包括三种乘法运算:UU,SU及SS。一般的乘法运算指令都是两个带符号数相乘,即SS。所以,在编程时,还要用到以下两条乘法指令:MACSUXmem,Ymem,src;无符号数与带符号数相乘并累加;src=U(Xmem)S(Ymem)+srcMPYUSmem,dst;无符号数相乘;dst=U(T)U(Smem),例6-18编写计算W64=X32Y32的程序。32位乘法实现的64位乘积的程序如下:STM#x,AR2STM#y,AR3LD*AR2,T;T=x0MPYU*AR3+,A;A=ux0uy0STLA,w0;w0=ux0uy0LDA,-16,A;A=A16MACSU*AR2+,*AR3-,A;A+=y1ux0MACSU*AR3+,*AR2,A;A+=x1uy0STLA,w1;w1=ALDA,-16,A;A=A16MAC*AR3,*AR2,A;A+=x1y1STLA,w2;w2=A的低16位STHA,w3;w3=A的高16位,6.8小数运算,1小数的表示方法,TMS320C54x采用2的补码表示小数,其最高位为符号位,数值范围为1+1。一个16位的2的补码小数(Q15格式)的每一位的权值为:MSBLSB-12-12-22-32-15一个十进制小数乘以32768之后,再将其十进制整数部分转换成十六进制数,就能得到这个十进制小数的2的补码表示,例如:17FFFH0.5正数:乘以327684000H00000H-0.5负数:其绝对值部分乘以32768,再取反加1C000H-18000H在汇编语言程序中,是不能直接写入十进制小数的。若要定义一个系数0.707,可以写成:.word32768*707/1000,不能写成32768*0.707。,2小数乘法与冗余符号位,一个小数乘法的例子(假设字长4位,累加器8位):,上述乘积是7位,当将其送到累加器时,为保持乘积的符号,必须进行符号位扩展,这样,累加器中的值为11110100(-0.09375),出现了冗余符号位。原因是:,即两个带符号数相乘,得到的乘积带有2个符号位,造成错误的结果。,解决冗余符号位的办法:在程序中设定状态寄存器ST1中的FRCT(小数方式)位为1,在乘法器将结果传送至累加器时就能自动地左移1位,累加器中的结果为:Szzzzzz0(Q7格式),即11101000(0.1875),自动地消去了两个带符号数相乘时产生的冗余符号位。在小数乘法编程时,应当事先设置FRCT位如下:SSBXFRCTMPY*AR2,*AR3,ASTHA,Z这样,TMS320C54x就完成了Q15Ql5=Q15的小数乘法。,6.9除法运算,1被除数的绝对值小于除数的绝对值,商为小数,在一般的DSP中都没有除法器硬件。因为除法器硬件代价很高,所以就没有专门的除法指令。同样,在TMS320C54x中也没有一条单周期的16位除法指令。但是,利用条件减法指令(SUBC指令),加上重复指令“RPT#15”,就可实现两个无符号数的除法运算。条件减法指令的功能如下:SUBCSmem,src,2被除数的绝对值大于等于除数的绝对值,商为整数,6.10浮点运算,1浮点数的表示方法,在TMS320C54x中,浮点数由尾数和指数两部分组成,它与定点数的关系如下:定点数=尾数2(指数)例如,定点数0 x2000(0.25)用浮点数表示时,尾数为0 x4000(0.5),指数为1,即0.25=0.521浮点数的尾数和指数可正可负,均用补码表示。指数的范围为831。,2定点数到浮点数的转换,TMS320C54x通过3条指令可将一个定点数转化成浮点数:,(1)EXPA(2)STT,EXPONENT(3)NORMA,3浮点数到定点数的转换,知道TMS320C54x浮点数的定义后,就不难将浮点数转换成定点数了。因为浮点数的指数就是在规格化时左移(指数为负时是右移)的位数,所以在将浮点数转换成定点数时,只要按指数值将尾数右移(指数为负时是左移)就行了。,4浮点乘法举例,【例6-26】编写浮点乘法程序,完成x1x2=0.3(0.8)运算。程序中保留10个数据存储单元:,程序清单如下:.ti
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 离婚协议书中特定子女教育支出分担及保障协议范本
- 体育赛事赞助担保合同风险规避与权益保障
- 电力施工合同签订与施工期合同履行及竣工验收规范
- 物业服务合同终止与社区环境修复及恢复协议
- 智算中心扩建项目技术方案
- 化工车间安全员考核及答案
- 博望区营销推广计划方案
- 恩施环保应急预案(3篇)
- 教育质量评估与认证体系2025年行业标准化与认证体系构建策略报告
- 2025年通信基站储能电池梯次利用技术标准与规范报告
- 肺结核患者护理课件
- 法律援助法普法活动方案
- 食管恶性肿瘤护理查房
- 发热病人的护理课件
- 2025年江苏高考地理真题(原卷版)
- 学堂在线 生活英语听说 章节测试答案
- 智能装备产业行动计划
- 新生儿湿疹护理与防治要点
- 先心病常见病介入封堵治疗讲课件
- 高效农贸市场管理与运营合作协议
- 诸暨市家政服务员(母婴护理员)职业技能大赛技术文件
评论
0/150
提交评论