




已阅读5页,还剩147页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2020年5月22日,DSP原理及应用,1,第5章汇编语言程序设计,内容提要汇编语言程序设计是应用软件设计的基础,主要任务是利用汇编指令和伪指令编写源程序以完成指定的功能。本章将结合例子介绍TMS320C54x汇编语言源程序设计的基本方法,涉及的内容包括:汇编语言源程序的格式常数、字符串、符号和表达式的规定堆栈的使用方法分支、调用、返回控制程序加法、乘法、除法、长字和并行运算程序单指令、块重复、循环嵌套等重复操作程序数据块传送程序小数运算程序和浮点运算程序,2020年5月22日,DSP原理及应用,2,第5章汇编语言程序设计,5.1概述5.2堆栈的使用方法5.3控制程序5.4算术运算程序5.5重复操作程序5.6数据块传送程序5.7小数运算程序5.8浮点运算程序,2020年5月22日,DSP原理及应用,3,第5章TMS320C54x汇编语言程序设计,5.1概述,TMS320C54x汇编语言源程序由源语句组成。这些语句可以包含汇编语言指令、汇编伪指令和注释。程序的编写必须符合一定的格式,以便汇编器将源文件转换成机器语言的目标文件。本节将介绍汇编语言源程序的格式、各种常数、符号、字符串和表达式的规定。,2020年5月22日,DSP原理及应用,4,第5章TMS320C54x汇编语言程序设计,5.1概述,汇编语言程序以.asm为扩展名,可以用任意的编辑器编写源文件。一条语句占源程序的一行,长度可以是源文件编辑器格式允许的长度,但汇编器每行最多读200个字符。因此,语句的执行部分必须限制在200个字符以内。,5.1.1汇编语言源程序格式,2020年5月22日,DSP原理及应用,5,第5章TMS320C54x汇编语言程序设计,1.源文件格式,5.1.1汇编语言源程序格式,助记符指令源语句的每一行通常包含4个部分:标号区、助记符区、操作数区和注释区。,标号:助记符操作数;注释,助记符指令语法格式:,【例5.1.1】助记符指令源语句举例。NANHUA.set1;符号NANHUA1Begin:LD#NANHUA,AR1;将1加载到AR1,标号,助记符,操作数,注释,2020年5月22日,DSP原理及应用,6,第5章TMS320C54x汇编语言程序设计,1.源文件格式,语句的书写规则:,所有语句必须以标号、空格、星号或分号(*或;)开始;标号是可选项,若使用标号,则标号必须从第一列开始;所有包含有汇编伪指令的语句必须在一行完成指定;各部分之间必须用空格分开,Tab字符与空格等效;,2020年5月22日,DSP原理及应用,7,第5章TMS320C54x汇编语言程序设计,1.源文件格式,语句的书写规则:,程序中注释是可选项。如果注释在第一列开始时,前面必须标上星号或分号,在其他列开始的注释前面必须以分号开头;如果源程序很长,需要书写若干行,可以在前一行用反斜杠字符()结束,余下部分接着在下一行继续书写。,2020年5月22日,DSP原理及应用,8,第5章TMS320C54x汇编语言程序设计,2.标号,所有汇编指令和大多数汇编伪指令都可以选用标号,供本程序或其它程序调用。,标号必须从语句的第1列写起,其后的冒号“:”可任选;标号为任选项,若不使用标号,则语句的第一列必须是空格、星号或分号;标号是由字母、数字以及下划线和美元符号等组成,最多可达32个字符;标号分大小写,且第一个字符不能是数字。,2020年5月22日,DSP原理及应用,9,第5章TMS320C54x汇编语言程序设计,2.标号,在使用标号时,标号的值是段程序计数器SPC的当前值。例如,若使用.word伪指令初始化几个字,则标号将指到第一个字。,【例5.1.2】标号格式举例。900000010000040000AStart:.word0Ah,3,700004100030000420007,;假设汇编了某个其他代码,标号,值为40h,2020年5月22日,DSP原理及应用,10,第5章TMS320C54x汇编语言程序设计,3.助记符,助记符用来表示指令所完成的操作,可以是汇编语言指令、汇编伪指令、宏伪指令。,助记符指令:一般用大写,不能从第一列开始;,汇编伪指令:用来为程序提供数据和控制汇编进程。以句号“.”开始,且用小写;,宏伪指令:用来定义一段程序,以便宏调用来调用这段程序。以句号“.”开始,且用小写;,宏调用:用来调用由宏伪指令定义的程序段。,2020年5月22日,DSP原理及应用,11,第5章TMS320C54x汇编语言程序设计,4.操作数,操作数是指指令中参与操作的数值或汇编伪指令定义的内容,紧跟在助记符的后面,由一个或多个空格分开。,操作数之间必须用逗号“,”分隔;操作数可以是常数、符号或表达式;操作数中的常数、符号或表达式可用来作为地址、立即数或间接地址;,2020年5月22日,DSP原理及应用,12,第5章TMS320C54x汇编语言程序设计,4.操作数,(1)指令的操作数前缀,使用“#”符号作为操作数的前缀;使用“*”符号作为操作数的前缀;使用“”符号作为操作数的前缀。,汇编器允许指定的常数、符号或表达式作为地址、立即数或间接地址。作为操作数的前缀有三种情况:,2020年5月22日,DSP原理及应用,13,第5章TMS320C54x汇编语言程序设计,(1)指令的操作数前缀,用“#”作前缀,例如:Label:ADD#99,B,使用“#”号作为前缀,汇编器将操作数作为立即数处理。即使操作数是寄存器或地址,也将作为立即数。如果操作数是地址,汇编器将把地址处理为一个数值,而不使用地址的内容。,操作数#99是一个立即数。,2020年5月22日,DSP原理及应用,14,第5章TMS320C54x汇编语言程序设计,(1)指令的操作数前缀,用“*”作前缀,例如:Label:LD*AR3,B,使用“*”符号作为前缀,汇编器将操作数作为间接地址,即把操作数的内容作为地址。,操作数*AR3指定一个间接地址。该指令将引导汇编器找到寄存器AR3的内容作为地址,然后将该地址中的内容装入指定的累加器B中。,2020年5月22日,DSP原理及应用,15,第5章TMS320C54x汇编语言程序设计,(1)指令的操作数前缀,用“”作前缀,例如:Label:LDx,A,使用“”符号作为前缀,汇编器将操作数作为直接地址,即操作数由直接地址码赋值。,2020年5月22日,DSP原理及应用,16,第5章TMS320C54x汇编语言程序设计,4.操作数,(2)伪指令的立即数,例如:SUB#18,B;操作数#18为立即数,将“#”加在数值之前而构成的立即数方式,主要用在指令中。,通常,立即数在伪指令中用的较少,但在某些情况下,立即数也可以作为伪指令的操作数。,例如:.byte18,立即数方式没有使用,但汇编器认为操作数是一个数值18(即立即数),用18数值初始化一个字节。,2020年5月22日,DSP原理及应用,17,第5章TMS320C54x汇编语言程序设计,5.注释,用来说明指令功能的文字,便于用户阅读。,注释可位于句首或句尾,位于句首时,以“*”或“;”开始,位于句尾时,以分号“;”开始。,注释可单独一行或数行;注释是任选项。,1100000.bsssym,;保留空间于.bss*改变段,允许第五个mylab定义*,例如:,2020年5月22日,DSP原理及应用,18,第5章TMS320C54x汇编语言程序设计,5.1.2汇编语言中的常数与字符串,汇编器可支持7种类型的常数(常量)。,2020年5月22日,DSP原理及应用,19,第5章TMS320C54x汇编语言程序设计,5.1.2汇编语言中的常数与字符串,二进制整型常量最多由16位二进制数字(0或1)组成,后缀为B(或b)。如果数字小于16位,汇编器将其右边对齐,并在前面补零。,1.二进制整数,例如:10001000B136(十进制)或88(十六进制)0111100b60(十进制)或3C(十六进制)10b2(十进制)或2(十六进制)10001111B143(十进制)或8F(十六进制),2020年5月22日,DSP原理及应用,20,第5章TMS320C54x汇编语言程序设计,5.1.2汇编语言中的常数与字符串,八进制整型常量最多由6位的八进制数字(0到7)组成,后缀为Q(或q)或前缀为0(零)。,2.八进制整数,例如:100011Q32777(十进制)或8009(十六进制)124q84(十进制)或54(十六进制),八进制常数也可使用C语言的记号,即加前缀0。010001132777(十进制)或8009(十六进制)012484(十进制)或54(十六进制),2020年5月22日,DSP原理及应用,21,第5章TMS320C54x汇编语言程序设计,5.1.2汇编语言中的常数与字符串,十进制整型常量由十进制数字串组成,无后缀。取值范围为:3276832767或065535。,3.十进制整数,例如:21182118(十进制)或846(十六进制)6553565535(十进制)或0FFFF(十六进制)3276832768(十进制)或8000(十六进制),2020年5月22日,DSP原理及应用,22,第5章TMS320C54x汇编语言程序设计,5.1.2汇编语言中的常数与字符串,十六进制整型常量最多由4位十六进制数字组成,带后缀H(或h)。它必须以数字(09)开始,也可以加前缀0 x。,4.十六进制整数,例如:0DH14(十进制)或000D(十六进制)12BCH4796(十进制)或12BC(十六进制),十六进制常数也可用C语言记号,即加前缀0 x。0 x0D14(十进制)或000D(十六进制)0 x12BC4796(十进制)或12BC(十六进制),2020年5月22日,DSP原理及应用,23,第5章TMS320C54x汇编语言程序设计,5.1.2汇编语言中的常数与字符串,浮点整型常量由一串十进制数字组成,可以带小数点、分数和指数部分。,5.浮点数,浮点数的表示方法:nnE|en,n为一串十进制数,浮点数前可带加减号(或),且小数点必须指定。,例如:99.e9有效的数;99e9非法。合法:.314,3.14,-.314e-19。,2020年5月22日,DSP原理及应用,24,第5章TMS320C54x汇编语言程序设计,5.1.2汇编语言中的常数与字符串,在程序中使用.set伪指令给一个符号赋值,该符号就成为一个汇编时间常数,等效于一个常数。为了使用表达式中的常数,赋给符号的必须是绝对值。,6.汇编时间常数,例如:将常数值18赋给符号bei_hua。bei_hua.set18LD#bei_hua,A,2020年5月22日,DSP原理及应用,25,第5章TMS320C54x汇编语言程序设计,6.汇编时间常数,例如:AuxRl.setARlMVMMAuxRl,SP,也可以用.set伪指令将符号常数赋给寄存器名。此时,该符号变成了寄存器的替代名。,注意:常量不能进行符号扩展。如:0ACH等于十六进制的00AC或十进制172,不等于84。,2020年5月22日,DSP原理及应用,26,第5章TMS320C54x汇编语言程序设计,5.1.2汇编语言中的常数与字符串,字符常数是包括在单引号内的字符串。若单引号之间没有字符,则值为0。每个字符在内部表示为8位ASCII码。,7.字符常数,例如:a内部表示为61hB内部表示为42h,2020年5月22日,DSP原理及应用,27,第5章TMS320C54x汇编语言程序设计,5.1.2汇编语言中的常数与字符串,字符串是由双引号括起来的一串字符,最大长度是可以变化的,由要求字符串的伪指令来设置。字符在内部用8位ASCII码来表示。,8.字符串,例如:“example”定义了一个长度为7的字符串:example,2020年5月22日,DSP原理及应用,28,第5章TMS320C54x汇编语言程序设计,字符串可用于下列伪指令中:.copy作为复制伪指令中的文件名.sect作为命名段伪指令中的段名.setsect作为该伪指令中的段地址.byte作为数据初始化伪指令中的变量名.string作为该伪指令的操作数,8.字符串,注意:字符常数与字符串的差别。字符常数代表单个整数值。字符串只是一串字符。,2020年5月22日,DSP原理及应用,29,第5章TMS320C54x汇编语言程序设计,5.1.3汇编源程序中的符号,汇编程序中的符号用于标号、常数和替代字符。,由字母、数字以及下划线和美元符号(AZ,az,09,_和$)等组成;符号名最多可长达200个字符;在符号中,第1位不能是数字,并且符号中不能含空格。,2020年5月22日,DSP原理及应用,30,第5章TMS320C54x汇编语言程序设计,5.1.3汇编源程序中的符号,1.标号,作为标号的符号代表在程序中对应位置的符号地址。通常,标号是局部变量,在一个文件中局部使用的标号必须是唯一的。标号分大小写。,例如:ABC,Abc,abc是3个不同的符号。,在调用汇编器时使用-c选项,可以不分大小写。,2020年5月22日,DSP原理及应用,31,第5章TMS320C54x汇编语言程序设计,1.标号,标号还可以作为.global,.ref,.def或.bss等汇编伪指令的操作数。,如:.globallabellable1NOPADDlabel,BBlabel1,2020年5月22日,DSP原理及应用,32,第5章TMS320C54x汇编语言程序设计,2.符号常数,符号也可被设置成常数值。为了提高程序的可读性,可以用有意义的名称来代表一些重要的常数值。伪指令.set和.struct.tag.endstruct可以用来将常数赋给符号名。注意:符号常数不能被重新定义。,5.1.3汇编源程序中的符号,2020年5月22日,DSP原理及应用,33,第5章TMS320C54x汇编语言程序设计,2.符号常数,【例5.1.3】定义符号常数举例。,N.set512buffer.set4*Nnzg3tang.endstructarray.tagitem.bssarray,tang*N,;定义常数;item结构定义;常数偏移nzg1=1;常数偏移nzg2=2;常数偏移nzg2=3;声明数组,2020年5月22日,DSP原理及应用,34,第5章TMS320C54x汇编语言程序设计,3.定义符号常数,使用-d选项可以将常数值与一个符号等同起来。定义符号常数后,在汇编源文件中可用符号代替和它等同的值。,5.1.3汇编源程序中的符号,定义格式:,asm500-dname=value,汇编命令,汇编选项,符号名称,符号的值,若value省略,则符号的值设置为l。,2020年5月22日,DSP原理及应用,35,第5章TMS320C54x汇编语言程序设计,3.定义符号常数,注意:内部函数$isdefed中的变量必须括在双引号内。引号表明变量按字面解释而不是作为替代字符。,2020年5月22日,DSP原理及应用,36,第5章TMS320C54x汇编语言程序设计,4.预先定义的符号常数,汇编器有若干预先定义符号,包括:,5.1.3汇编源程序中的符号,美元符号$,代表段程序指针SPC的当前值;映像寄存器符号,包括AR0AR7;映像寄存器由汇编器设置为符号。用于指定存储器模式。由-mk选项设置,默认值为0。,2020年5月22日,DSP原理及应用,37,第5章TMS320C54x汇编语言程序设计,5.替代符号,可将字符串值(变量)赋给符号,使符号名与该变量等效,成为字符串的别名,这种用来代表变量的符号称为替代符号。,5.1.3汇编源程序中的符号,当汇编器遇到替代符号时,将用字符串值替代符号。和符号常数不同,替代符号可以被重新定义。可在程序中的任何地方将变量赋给替代符号。,例如:.asghigh,AR2;寄存器AR2,2020年5月22日,DSP原理及应用,38,第5章TMS320C54x汇编语言程序设计,5.局部标号,局部标号是一种特殊的标号,使用的范围和影响是临时性的。,5.1.3汇编源程序中的符号,定义方法:,注意:局部标号不能用伪指令来定义。,用$n来定义。n是09的十进制数;用NAME?定义。NAME是任何一个合法的符号名。汇编器用紧随其后一个唯一数值的句点代替问号。,2020年5月22日,DSP原理及应用,39,第5章TMS320C54x汇编语言程序设计,5.局部标号,局部标号可以被取消定义,并可以再次被定义或自动产生。,取消局部变量的方法:,使用.newblock伪指令;使用伪指令.sect,.text或.data改变段;使用伪指令.include或.copy,进入include文件;达到include文件的结尾,离开include文件。,2020年5月22日,DSP原理及应用,40,第5章TMS320C54x汇编语言程序设计,5.局部标号,【例5.1.4】合法、非法局部标号$n举例。,假设符号ADDRA,ADDRB,ADDRC已经在前面作了定义。,Label1:LDADDRA,ASUBADDRB,ABC$1,ALTLDADDRB,AB$2$1LDADDRA,A$2ADDADDRC,A.newblockBC$1,ALTSTLA,ADDRC$1NOP,;将ADDRA装入累加器A;减去地址B;如果小于0,分支转移到$1;否则将ADDRB装入累加器A;分支转移到$2;$1:将ADDRA装入累加器A;$2:加上ADDRC;取消$1的定义,使它可被再次使用;若小于0,分支转移到$1;存ACC的低16位到ADDRC,.newblock,.newblock,BC$1,ALT;若小于0,分支转移到$1STLA,ADDRC;存ACC的低16位到ADDRC$1NOP,;错误:$1被多次定义,2020年5月22日,DSP原理及应用,41,第5章TMS320C54x汇编语言程序设计,【例5.1.5】name?形式的局部标号的使用方法。,;*;局部标号mylab的第1个定义;*NOPmylab?NOPBmylab?;*.copy“a.inc”;*mylab?NOPBmylab?,;包括文件中有mylab第2次定义,;从包括文件中退出复位后,mylab的第3个定义,2020年5月22日,DSP原理及应用,42,第5章TMS320C54x汇编语言程序设计,【例5.1.5】name?形式的局部标号的使用方法。,;*;在宏中mylab的第4个定义,;为了避免冲突,宏使用不同的名称空间;*maymac.macromylab?NOPBmylab?.endm;*mymacBmylab?,;宏调用。引用mylab的第3个定义,;既不被宏调用复位,也不与定义在宏中的相同名冲突,2020年5月22日,DSP原理及应用,43,第5章TMS320C54x汇编语言程序设计,【例5.1.5】name?形式的局部标号的使用方法。,;*;改变段,允许mylab的第5个定义;*.sect“Secto_One”NOPmylab?.word0NOPNOPBmylab?,2020年5月22日,DSP原理及应用,44,第5章TMS320C54x汇编语言程序设计,【例5.1.5】name?形式的局部标号的使用方法。,;*;.newblock伪指令,允许mylab的第6个定义;*.newblockmylab?.word0NOPNOPBmylab?,2020年5月22日,DSP原理及应用,45,第5章TMS320C54x汇编语言程序设计,5.1.4汇编源程序中的表达式,表达式可以是常数、符号,或者是由算术运算符分开的一系列常数和符号。有效表达式的值:3276832767,影响表达式的主要因素:,圆括号()。圆括号内的表达式最先计算;,不能用大括号或中括号代替圆括号()。,优先级。C54x汇编器使用与C语言相似的优先级,优先级高的先计算;,从左到右运算。具有相同的优先级,按从左到右的顺序计算。,2020年5月22日,DSP原理及应用,46,第5章TMS320C54x汇编语言程序设计,5.1.4汇编源程序中的表达式,1.运算符,C54x汇编器使用与C语言相似的优先级。取正(+)、负()和乘(*)比二进制形式有较高的优先级。,2.条件表达式,汇编器支持关系运算符,可以用于任何表达式。,=等于=等于!=不等于=大于或等于大于0且溢出,;则转至zhong,否则往下执行,2020年5月22日,DSP原理及应用,64,第5章TMS320C54x汇编语言程序设计,5.3.1分支操作程序,与分支转移一样,通过传送控制到程序存储器的其他位置,子程序调用会中断连续的指令流。但是与分支转移不同的是,这种传送是临时的。当函数的子程序被调用时,紧跟在调用后的下一条指令的地址保存在堆栈中。这个地址用于返回到调用程序并继续执行调用前的程序。子程序调用操作分成两种形式:无条件调用和条件调用,两者都可以带延时操作和不带延时操作。,2.子程序调用程序,2020年5月22日,DSP原理及应用,65,第5章TMS320C54x汇编语言程序设计,2.子程序调用程序,2020年5月22日,DSP原理及应用,66,第5章TMS320C54x汇编语言程序设计,2.子程序调用程序,无条件调用是指无条件执行调用。条件调用和无条件调用操作相同,但是条件调用要在满足一个或多个条件时才执行调用。远程调用允许对扩展存储器的子程序或函数进行调用。,2020年5月22日,DSP原理及应用,67,第5章TMS320C54x汇编语言程序设计,2.子程序调用程序,【例5.3.2】子程序调用举例。,STM#123H,AR0LD#456H,AR1CALLnewLDAR1,16,Anew:MPYAR0,AR1,ARET,;将操作数#123H装入AR0;将操作数#456H装入AR1;调子程序new;将AR1的内容左移16位后装入A;AR0与AR1的内容相乘,结果放入A中;子程序返回,2020年5月22日,DSP原理及应用,68,第5章TMS320C54x汇编语言程序设计,5.3.1分支操作程序,子程序返回程序可以使程序重新在被中断的连续指令处继续执行。返回指令通过将弹出堆栈的值(包含将要执行的下一条指令的地址),送到程序计数器PC来实现返回功能。C54x可以执行无条件返回和条件返回,并且它们都可以带延时或不带延时操作。,3.子程序返回程序,2020年5月22日,DSP原理及应用,69,第5章TMS320C54x汇编语言程序设计,3.子程序返回程序,2020年5月22日,DSP原理及应用,70,第5章TMS320C54x汇编语言程序设计,3.子程序程序,无条件返回是无条件执行返回操作。条件返回可以给予被调用函数或中断服务程序(ISR)更多的返回方式,以便根据被处理的数据选择返回路径,通过使用条件返回指令来实现返回。远程返回允许从扩展存储器的子程序或函数返回。,2020年5月22日,DSP原理及应用,71,第5章TMS320C54x汇编语言程序设计,5.3.1分支操作程序,C54x的一些指令只有在满足一个或是多个条件后才被执行,如条件分支转移、条件调用和条件返回等指令。这些指令都用条件来限制分支转移、调用和返回操作。这些条件可用条件算符来表示。,4.条件操作程序,2020年5月22日,DSP原理及应用,72,第5章TMS320C54x汇编语言程序设计,4.条件操作程序,2020年5月22日,DSP原理及应用,73,第5章TMS320C54x汇编语言程序设计,4.条件操作程序,在条件操作时也可以要求有多个条件,只有所有条件满足时才被认为是满足条件。这种多个条件的组合就构成了指令的多重条件。,2020年5月22日,DSP原理及应用,74,第5章TMS320C54x汇编语言程序设计,4.条件操作程序,选用多重条件时应当注意以下几点:,第1组:分为两类,最多可选择两个条件,组内两类条件可以与/或构成多重条件,但不能用组内同类条件构成与/或多重条件。,组与组之间可用或构成多重条件。,当选择两个条件时,累加器必须是同一个。例如,可以同时选择AGT和AOV,但不能同时选择AGT和BOV。,第2组:分为三类,最多可选三个条件,可以在每类中各选一个条件进行与/或构成多重条件,但不能在同类选两个以上条件。,例如,可以同时测试TC、C和BIO,但不能同时测试NTC、C和NC。,2020年5月22日,DSP原理及应用,75,第5章TMS320C54x汇编语言程序设计,4.条件操作程序,【例5.3.3】条件操作程序。,BCsub,BLEQ;条件分支转移若累加器B0,则转至sub,否则,往下执行CCstart,AGEQ,AOV;条件调用若累加器A0且溢出,则调用start,否则往下执行RCNTC;条件返回若TC=0,则返回,否则往下执行,2020年5月22日,DSP原理及应用,76,第5章TMS320C54x汇编语言程序设计,4.条件操作程序,注意:,若需要多个条件相与时,用单条指令表示。如:BCnew,AGT,AOV转移条件:AGT和AOV的与逻辑,若需要两个条件相或时,需用两条指令分别表示。如:若累加器A大于0或溢出,则转移至sub转移条件:AGT和AOV的或逻辑BCsub,AGTBCsub,AOV,2020年5月22日,DSP原理及应用,77,第5章TMS320C54x汇编语言程序设计,5.3.1分支操作程序,5.比较转移程序,利用比较指令CMPR可实现比较转移操作。,比较操作指令:CMPR测试条件,辅助寄存器ARx指令功能:辅助寄存器ARx与AR0进行比较,若比较结果使所给定的测试条件成立,则TC位置1。实现方法:通过CMPR的比较结果得TC值;根据TC值,由条件转移指令实现分支转移。,2020年5月22日,DSP原理及应用,78,第5章TMS320C54x汇编语言程序设计,5.比较转移程序,例如:比较操作后条件分支转移STM#5,AR1;AR1=5STM#10,AR0;AR0=10loop:*AR1+;AR1=AR1+1CMPRLT,AR1;若AR1-AR00,则TC=1,否则为0BCloop,TC;若AR1-AR00,则循环若AR1=AR0,则顺序执行,2020年5月22日,DSP原理及应用,79,第5章TMS320C54x汇编语言程序设计,5.3控制程序,5.3.2循环操作程序,在程序设计时,经常需要重复执行某一段程序。利用BANZ(当辅助寄存器不为0时转移)指令可实现循环计数和操作。,循环操作指令:BANZ转移地址,辅助寄存器指令功能:当辅助寄存器不为0时,则转至转移地址,否则顺序执行。,2020年5月22日,DSP原理及应用,80,第5章TMS320C54x汇编语言程序设计,5.3.2循环操作程序,【例5.3.4】,.bssx,10;给x保留10个空间.bssy,1;给y保留1个空间STM#x,AR1;设置数据段的首地址STM#9,AR2;设置循环计数值LD#0,A;累加器清0loop:ADD*AR1+,A;累加运算,并修改地址BANZloop,*AR2-;若计数值不为0,则循环,并计数值减1若计数值为0,则结束循环STLA,y;累加和存入y中,用AR2作为循环计数器,由BANZ实现程序的循环控制。,注意:BANZloop,*AR2-;先判断,再修正AR2=AR2-1,2020年5月22日,DSP原理及应用,81,第5章TMS320C54x汇编语言程序设计,5.4算术运算程序,基本算术运算包括:加减法和乘法运算除法运算长字和并行运算,2020年5月22日,DSP原理及应用,82,第5章TMS320C54x汇编语言程序设计,5.4算术运算程序,5.4.1加、减法和乘法运算,在数字信号处理中,加法和乘法运算是最常见的算术运算。,【例5.4.1】计算y=ax+b,程序:LDa,T;取a值,T=aMPYx,B;完成ax乘积,B=axADDb,B;完成ax+b运算,B=ax+bSTLB,y;计算结果存入y中,2020年5月22日,DSP原理及应用,83,第5章TMS320C54x汇编语言程序设计,5.4.1加、减法和乘法运算,【例5.4.2】计算y=xlal+x2a2,程序:LDx1,TMPYa1,BLDx2,TMACa2,BSTLB,ySTHB,y+1,;T=x1;B=x1a1;T=x2;乘法累加,B=x1a1+x2a2;计算结果的低字BL存入y中;计算结果的高字BH存入y+1中,2020年5月22日,DSP原理及应用,84,第5章TMS320C54x汇编语言程序设计,5.4.1加、减法和乘法运算,【例5.4.3】计算y=,程序:*example.asm*.title“example.asm”.mmregsstack.usect“STACK”,10h.bssa,4.bssx,4.bssy,1.defstart.data,;为堆栈指定空间;为变量分配9个字的空间,2020年5月22日,DSP原理及应用,85,第5章TMS320C54x汇编语言程序设计,5.4.1加、减法和乘法运算,【例5.4.3】计算y=,程序:,table:.word1,2,3,4.word8,6,4,2.textstart:STM#0,SWWSRSTM#STACK+10h,SPSTM#a,AR1RPT#7MVPDtable,*AR1+CALLSUMend:Bend,;变量初始化;插入0个等待状态;设置堆栈指针;AR1指向a;移动8个数据;从程序存储器到数据存储器;调用SUM子程序,2020年5月22日,DSP原理及应用,86,第5章TMS320C54x汇编语言程序设计,5.4.1加、减法和乘法运算,【例5.4.3】计算y=,程序:,SUM:STM#a,AR3STM#x,AR4RPTZA,#3MAC*AR3+,*AR4+,ASTLA,yRET.end,;子程序执行,2020年5月22日,DSP原理及应用,87,第5章TMS320C54x汇编语言程序设计,5.4.1加、减法和乘法运算,【例5.4.4】求4项乘积aixi(i=1,2,3,4)中的最大值,并存放累加器A中。,程序:STM#a,AR1STM#x,AR2STM#2,AR3LD*AR1+,TMPY*AR2+,Aloop1:LD*AR1+,TMPY*AR2+,BMAXABANZloop1,*AR3-,;ai首地址a给AR1;xi首地址x给AR2;设置计数器AR3=2;取系数T=ai,并修改AR1;乘法运算A=aixi,并修改AR2;取系数T=ai,并修改AR1;乘法运算B=aixi,并修改AR2;求A和B中的最大值;若AR30,则循环,并修改AR3若AR3=0,则不循环,2020年5月22日,DSP原理及应用,88,第5章TMS320C54x汇编语言程序设计,5.4算术运算程序,5.4.2除法运算,在C54x中没有除法器硬件,也没有专门的除法指令。但是,利用条件减法指令(SUBC)和重复指令(RPT)可实现两个无符号数的除法运算。,条件减法指令:SUBCSmem,src功能:(src)-(Smem)15ALU输出端若ALU输出0,则(ALU输出)1+1src否则(src)1src,重复指令:RPT#K功能:RC=#K,重复执行下条指令K+1次。,2020年5月22日,DSP原理及应用,89,第5章TMS320C54x汇编语言程序设计,5.4.2除法运算,1.|被除数|除数|,例:编写0.4(-0.8)的程序,.bssnum,1,num,.bssden,1,den,.bssquot,1,quot,.data,table.word4*32768/10;0.4.word-8*32768/10;-0.8,table,.textstart:STM#num,AR1,num,RPT#1MVPDtable,*AR1+,2020年5月22日,DSP原理及应用,90,第5章TMS320C54x汇编语言程序设计,5.4.2除法运算,1.|被除数|除数|,例:编写0.4(-0.8)的程序,LDden,16,A,;分母送AH,MPYAnum,;商符号送B,(num)AHB,即分子分母B,取符号。,ABSA,;取分母绝对值,STHA,den,LDnum,16,A,;分子送AH,ABSA,;取分子绝对值,RPT#14SUBCden,A,;15次减法循环完成除法,XC1,BLT,;若B|除数|,例:编写16384512的程序,LDden,16,AMPYAnumABSASTHA,denLDnum,AABSARPT#15SUBCden,AXC1,BLTNEGASTLA,quot,;将分母移到累加器A(3116);(num)*A(3216)B,获取商的符号;分母取绝对值;分母绝对值存回原处;分子A(3216);分子取绝对值;16次减法重复操作,完成除法;如果B|除数|,例:编写16384512的程序,运行结果:,注意:SUBC指令仅对无符号数进行操作,因此先对被除数和除数取绝对值,然后利用乘法操作获取商的符号,最后通过条件操作指令给商加上适当的符号。,2020年5月22日,DSP原理及应用,95,第5章TMS320C54x汇编语言程序设计,5.4算术运算程序,5.4.3长字运算和并行运算,长字指令:DLDLmem,dstDSTsrc,LmemDADDLmem,src,dstDSUBLmem,src,dstDRSUBLmem,src,dst,1.长字运算,;dst=Lmem单周期;Lmem=src双周期;dst=src+Lmem单周期;dst=src-Lmem单周期;dst=Lmem-src单周期,C54x可以利用32位长操作数进行长字运算。,2020年5月22日,DSP原理及应用,96,第5章TMS320C54x汇编语言程序设计,1.长字运算,(1)偶地址排列,如:DLD*AR3+,A,执行前:A,AR3,高字,低字,执行后:A,AR3,6CAC,0101,BD90,0102,指令中给出的地址为偶地址,则存储器低地址存放高16位操作数。,2020年5月22日,DSP原理及应用,97,第5章TMS320C54x汇编语言程序设计,1.长字运算,(1)偶地址排列,【例5.4.5】偶地址排列法举例。,.bssa,2.bssy,2.datatable:.word06CACH,0BD90H.textSTM#a,AR1RPT#1MVPDtable,*AR1+STM#a,AR3DLD*AR3+,A,执行前:A=0000000000hAR3=0100h(0100h)=6CACh(高字)(0101h)=BD90h(低字),执行后:A=006CACBD90hAR3=0102h(0100h)=6CACh(0101h)=BD90h,2020年5月22日,DSP原理及应用,98,第5章TMS320C54x汇编语言程序设计,1.长字运算,(2)奇地址排列,如:DLD*AR3+,A,执行前:A,AR3,低字,高字,执行后:A,BD90,6CAC,AR3,0102,0103,指令中给出的地址为奇地址,则存储器低地址存放低16位操作数。,2020年5月22日,DSP原理及应用,99,第5章TMS320C54x汇编语言程序设计,1.长字运算,(2)奇地址排列,【例5.4.6】奇地址排列法举例。,.bssa,2.bssy,2.datatable:.word06CACH,0BD90H.textSTM#a,AR1RPT#1MVPDtable,*AR1-STM#a,AR3DLD*AR3+,A,执行前:A=0000000000hAR3=0101h(0100h)=6CACh(低字)(0101h)=BD90h(高字),执行后:A=00BD906CAChAR3=0103h(0100h)=6CACh(0101h)=BD90h,2020年5月22日,DSP原理及应用,100,第5章TMS320C54x汇编语言程序设计,【例5.4.7】计算Z32=X32+Y32。,标准运算,.bssxhi,1.bssxlo,1.bssyhi,1.bssylo,1.bsszhi,1.bsszlo,1,LDxhi,16,AADDSxlo,AADDyhi,16,AADDSylo,ASTHA,zhiSTLA,zlo,LDxhi,16,A,X31X160000,ADDSxlo,A,+X15X0,X31X16X15X0,ADDyhi,16,A,+Y31Y160000,Z31Z16X15X0,ADDSylo,A,+Y15Y0,Z31Z16Z15Z0,STHA,zhi,STLA,zlo,6字,6T,2020年5月22日,DSP原理及应用,101,第5章TMS320C54x汇编语言程序设计,【例5.4.7】计算Z32=X32+Y32。,标准运算,LDxhi,16,AADDSxlo,AADDyhi,16,AADDSylo,ASTHA,zhiSTLA,zlo6字,6T,长字运算,.bssxhi,2,1,1.bssyhi,2,1,1.bsszhi,2,1,1,DLDxhi,ADADDyhi,ADSTA,zhi,DLDxhi,A,X31X16X15X0,DADDyhi,A,+Y31Y16Y15Y0,Z31Z16Z15Z0,DSTA,zhi,3字,3T,2020年5月22日,DSP原理及应用,102,第5章TMS320C54x汇编语言程序设计,5.4.3长字运算和并行运算,2.并行运算,并行运算就是同时利用D总线和E总线,通过并行指令来实现数据的加载和算术运算。,D总线用来执行加载或算术运算。E总线用来存放先前的结果。,并行指令:,并行加载和乘法指令,并行加载和存储指令,并行存储和乘法指令,并行存储和加/减指令,2020年5月22日,DSP原理及应用,103,第5章TMS320C54x汇编语言程序设计,2.并行运算,LD|MACRLD|MASR例如:LDXmem,dst1|MACRYmem,dst2功能:dst1=Xmem(16-ASM);dst=Xmem(16-ASM);dst=dst+T*Xmem。,并行存储和乘法指令:,2020年5月22日,DSP原理及应用,106,第5章TMS320C54x汇编语言程序设计,2.并行运算,ST|ADDST|SUB例如:STsrc,Ymem|ADDXmem,dst功能:Ymem=src(16-ASM);dst=dst+Xmem。,并行存储和加/减指令:,2020年5月22日,DSP原理及应用,107,第5章TMS320C54x汇编语言程序设计,2.并行运算,注意并行指令均为单字单周期指令;并行指令先存储,后加载或算术运算;并行指令的操作均在累加器的高位中进行,并且大多数指令受ASM位的影响。,2020年5月22日,DSP原理及应用,108,第5章TMS320C54x汇编语言程序设计,2.并行运算,【例5.4.8】编写计算z=x+y和f=e+d的程序,bssx,3bssd,3STM#x,AR5STM#d,AR2LD#0,ASMLD*AR5+,16,AADD*AR5+,16,ASTA,*AR5|LD*AR2+,BADD*AR2+,16,BSTHB,AR2,bssx,3,bssd,3,STM#x,AR5,LD#0,ASM,LD*AR5+,16,A,ADD*AR5+,16,A,STA,*AR5,|LD*AR2+,B,ADD*AR2+,16,B,STHB,AR2,STM#d,AR2,2020年5月22日,DSP原理及应用,109,第5章TMS320C54x汇编语言程序设计,5.4.3长字运算和并行运算,3.64位加法和减法运算,可利用长字指令可完成64位数的加减运算。,【例5.4.9】编写完成Z64=W64+X64-Y64的程序。,运算过程:,W64:,X64:,w3w2w1w0,x3x2x1x0,+,s1s0,C,s3s2,S64:,S64=s3s2s1s0,s1s0=w1w0+x1x0,s3s2=w3w2+x3x2+C,Y64:,y3y2y1y0,-,z1z0,O,z3z2,Z64:,Z64=z3z2z1z0,z1z0=s1s0-y1y0,z3z2=s3s2-y3y2-O,2020年5月22日,DSP原理及应用,110,第5章TMS320C54x汇编语言程
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 质控护士竞聘课件
- 谓语非谓语课件
- 2025版材料智能家居产品采购与销售合同
- 2025产品集成与定制化技术服务合同范本下载
- 2025年度河道疏浚工程土石方清运劳务分包合同
- 2025版建筑结构设计咨询及优化服务合同
- 2025年教育贷款担保合同范本大全
- 2025草坪种植工程与配套灌溉系统安装合同
- 2025版电子商务平台摊位入驻服务合同
- 2025典当行股权收购与品牌建设一体化合同
- 加油站全员安全生产责任制制度
- 巨大儿个案护理
- 园区招聘活动方案
- 2024年成都新都投资集团有限公司招聘笔试真题
- 产科危急重症管理制度
- 【生物 安徽版】2025年普通高等学校招生选择性考试(原卷版)
- 2025年《数字孪生与虚拟调试技术应用》课程标准
- 医院价格公示管理制度
- 地产交叉检查管理制度
- T/CACEM 22.5-2023校车运营服务管理第5部分:信息化管理规范
- 新生儿竞赛试题及答案
评论
0/150
提交评论