1、第5章TMS320C54x的汇编语言程序设计第1页,共93页。知识要点:本章涉及的内容包括汇编语言源程序的格式、常数、字符串、符号和表达式的规定;堆栈的使用方法;分支、调用、返回等控制程序;加法、乘法、除法、长字和并行等算术运算程序;单指令、块重复、循环嵌套等重复操作程序;数据块传送程序;小数运算程序以及浮点运算程序等。第2页,共93页。5.1 概述 TMS320C54x汇编语言源程序由源语句组成。这些语句可以包含汇编语言指令、汇编伪指令和注释。程序的编写必须符合一定的格式,以便汇编器将源文件转换成机器语言的目标文件。下面将介绍汇编语言源程序的格式、各种常数、符号、字符串和表达式的规定。第3页
2、,共93页。5.1.1 汇编语言源程序格式 汇编语言程序以.asm为扩展名,可以用任意的编辑器编写源文件。一句程序占源程序的一行,每行字符最多200个,如果长度超过200,则汇编器截去行尾的多余字符,并发出一个警告。第4页,共93页。源文件格式 助记符指令源语句的每一行通常包含4个部分:标号区、助记符区、操作数区和注释区。助记符指令语法格式如下:label:mnemonic operand list ;comment 标号区 助记符区 操作数区 注释区第5页,共93页。例 助记符指令源语句举例。NANHUA .set 1;符号NANHUA=1 Begin:LD#NANHUA,AR1;将1加载到
3、AR1 汇编语句书写格式应遵循一定规则。这些规则如下:所有语句必须以一个标号、空格、星号或分号开始;标号是可选项,若使用标号,则标号必须从第一列开始;包含有一个汇编伪指令的语句必须在一行完全指定;每个区必须用一个或多个空格分开,Tab字符与空格等效。程序中注释是可选项。在第一列用*号或;号,其它列用;号。若源程序很长,需要书写若干行,可在前一行用反斜杠()结束,余下接着在下一行继续书写。第6页,共93页。标号区 所有汇编指令和大多数汇编伪指令前面都可以选择语句标号。使用语句标号时,必须从源语句第一列开始。标号最多为32个字符,由(AZ,az,09,_和$)等组成。标号分大小写,第一个字符不能用
4、数字。标号后面带冒号:在使用标号时,标号的值是段程序计数器(SPC)的当前值。第7页,共93页。例5.1.2 标号格式举例。标号Start的值为40h:9 000000 ;假设汇编了某个其他代码10 000040 000A Start:.word 0Ah,3,7 000041 0003 000042 0007第8页,共93页。在一行中的标号本身是一个有效的语句。标号将段程序计数器(SPC)的当前值赋给标号,等效于下列伪指令语句:label .set$;$提供SPC当前值 如果标号单独占一行时,它将指到下一行的指令(SPC不增加):3 000043 Here:4 000043 0003 .wor
5、d 3 第9页,共93页。助记符指令区 在助记符汇编语言中,紧接在标号区后面的是助记符区和操作数区。助记符区 助记符区跟在标号区的后面。助记符指令可以是汇编语言指令、汇编伪指令、宏伪指令。助记符区不能从第一列开始。助记符区可以包含如下操作码。机器指令助记符,一般用大写;汇编伪指令、宏伪指令。以英文句号“.”开头,且为小写;宏调用。第10页,共93页。操作数区 操作数区是跟在助记符区后面的一系列操作数,由一个和多个空格分开。操作数可以是符号、常数或是符号与常数组合的表达式。操作数之间一定用逗号“,”分开。对操作数前缀的规定。汇编器允许将常数、符号或表达式作为地址、立即数或间接地址。指令操作数遵循
6、以下规定:前缀“#”后面的操作数是一个立即数。前缀“*”后面的操作数是一个间接地址。第11页,共93页。注释区 注释是任选项。注释可以由ASC码和空格组成。第12页,共93页。5.1.2 汇编语言中的常数与字符串 汇编器支持以下几种类型的常数(常量)。二进制整数 二进制整数常量最多由16位二进制数字(0或1)组成,后缀为B(或b)。如果数字小于16位,汇编器将其右边对其,并在前面补零。例如:10001000B 136(十进制)0111100b 60(十进制)10b 2(十进制)10001111B 143(十进制)第13页,共93页。八进制整数 八进制整数型常量最多由6位八进制数字(07)组成,
7、后缀为Q(或q)或前缀为0 例如:100011Q 32777(十进制)124q 84(十进制)对八进制常数也可使用C语言的记号,即加前缀0。0100011 32777(十进制)0124 84(十进制)第14页,共93页。十进制整数 十进制整数型常量由十进制数字串组成,无后缀。取值范围为:-3276832767或065535。例如:2118 2118(十进制)65535 65535(十进制)-32768 -32768(十进制)第15页,共93页。十六进制整数 十六进制整数常量最多由4位十六进制数字组成,带后缀H(或h)。例如:0DH 14(十进制)12BCH 4796(十进制)对十六进制常数也可
8、使用C语言的记号,即加前缀0 x:0 x0D 14(十进制)0 x12BC 4796(十进制)第16页,共93页。浮点数 浮点整型常量由一串十进制数字组成,可以带小数点、分数和指数部分。浮点数的表示方法为 n.nE|e n n代表一串十进制数,小数点必须指定。例如99.e9是有效数,但99e9非法。汇编时间常数 在程序中使用.set伪指令给一个符号赋值,该符号就成为一个汇编时间常数,等效于一个常数。赋给符号的必须是绝对值。例如将常数值18赋给符号nan_hua,即 nan_hua .set 18 LD#nan_hua,A第17页,共93页。也可以用.set伪指令将符号常数赋给寄存器名。此时,该
9、符号变成了寄存器替代名。例如:AuxR1 .set AR1 MVMM AuxR1,SP 字符常数 字符常数是包括单引号内的字符串。若单引号之间没有字符,则值为0。每个字符在内部表示为8位ASC码。例如:a 内部表示为61h B 内部表示为42h第18页,共93页。字符串 字符串是由双引号括起来的一串字符。字符串的最大长度是可以变化的,由要求字符串的伪指令来设置。字符在内部用8位ASC码来表示。例如:“example”定义了一个长度为7的字符串:example第19页,共93页。5.1.3 汇编源程序中的符号 汇编源程序中的符号用于标号、常数和替代字符。符号名最多可长达200个字符,由字母、数字
10、以及下划线和美元符号(AZ,az,09,_和$)等组成。标号分大小写。在符号中,第一个字符不能用数字,符号中不能含空格。第20页,共93页。标号 用做标号(labels)的符号代表在程序中对应位置的符号地址。通常标号是局部变量,在一个文件中局部使用的标号必须是惟一的。标号还可以作为.global,.ref,.def或.bss等汇编伪指令的操作数。如:.global label lable1 NOP ADD label,B B label1第21页,共93页。符号常数 符号也可被设置成常数值。这样可以用有意义的名称来代表一些重要的常数值,提高程序的可读性。例5.1.3 定义符号常数举例。N .s
11、et 512 ;定义常数 buffer .set 4*N nzg1 .set 1 nzg2 .set 2 nzg3 .set 3 item .struct ;item结构定义 .int nzg1 ;常数偏移nzg1=1 .int nzg2 ;常数偏移nzg2=2 .int nzg3 ;常数偏移nzg2=3 tang_ning .endstruct array .tag item ;声明数组 .bss array,tang_ning*N 第22页,共93页。定义符号常数(-d选项)使用-d选项可以将常数值与一个符号等同起来。定义以后,在汇编源文件中可用符号代替和它等同的值。-d选项的格式如下:a
12、sm500 -d name=value 在汇编源程序中,可以用下表所列的伪指令来检测符号:检测类型 使用的伪指令 存在 不存在 与值相等 与值不相等.if$isdefed(“name”).if$isdefed(“name”)=0.if name=value.if name!=value注意,内部函数$isdefed中的变量必须在双引号内。第23页,共93页。预先定义的符号常数 汇编器有若干预先定义的符号,包括:$,美元符号,代表段程序指针的当前值;寄存器符号包括AR0AR7;_large_model指定存储器模式。默认值为0,由-mk选项可以设置为1。第24页,共93页。替代符号 可将字符串值
13、(变量)赋给符号,这时符号名与该变量等效,成为字符串的别名。这种用来代表变量的符号称为替代符号。当汇编器遇到替代符号时,将用字符串值代替它。可在程序中的任何地方将变量赋给替代符号。例如:.asg “high”,AR2 ;寄存器AR2用high替代第25页,共93页。局部标号 局部标号是一种特殊的标号,使用的范围和影响是临时性的。局部标号可用以下方法定义:用$n来定义,这里n是09的十进制数。用NAME?定义,其中NAME是任何一个合法的符号名。第26页,共93页。下面举例说明局部标号$n的格式。该例中假设符号ADDRA,ADDRB,ADDRC已经在前面做了定义。例5.1.4 合法、非法局部标号
14、$n举例。合法使用局部标号的代码段 Label1:LD ADDRA,A ;将ADDRA装入A SUB ADDRB,A ;A减去地址ADDRB BC$1,ALT ;结果小于0,转到$1 LD ADDRB,A ;否则将ADDRB装入A B$2 ;转移到$2$1 LD ADDRA,A ;将ADDRA装入A$2 ADD ADDRC,A ;加上ADDRC .newblock ;取消$1 的定义,使它可再 次被使用 BC$1,ALT ;若小于0,转移到$1 STL A,ADDRC ;存A低16位$1 NOP 第27页,共93页。非法使用局部标号的代码段 Label1:LD ADDRA,A SUB ADDR
15、B,A BC$1,ALT LD ADDRB,A B$2$1 LD ADDRA,A$2 ADD ADDRC,A BC$1,ALT STL A,ADDRC$1 NOP ;错误,$1 被多次 定义 第28页,共93页。例5.1.5 name?形式的局部标号的使用 ;局部标号局部标号 mylab 的第一个定义的第一个定义nopmylab?nop bmylab?mylab?nop bmylab?maymac .macromylab?nop bmylab?.sect “Secto_One”nopmylab?.word 0 nop nop bmylab?.newblockmylab?.word0 nop n
16、op bmylab?第29页,共93页。5.1.4 汇编源程序中的表达式 表达式可以是常数、符号,或者是由算术运算符分开的一系列常数和符号。有效表达式值的范围从-3276832767。影响表达式计算顺序的因素主要有以下3个:圆括号()。圆括号内的表达式最先计算。优先级。见表3.2.2。优先级高的先计算。从左到右运算。具有相同优先级的运算按从左 到右顺序计算。第30页,共93页。运算符 第3章中的表列出了可用在表达式中的运算符。TMS320C54x汇编器使用与C语言相似的优先级。条件表达式 汇编器支持关系运算符,可以用于任何表达式,这对条件汇编特别有用。有以下几种关系运算符:=等于;=等于;!=
17、不等于;=大于或等于;大于;小于 条件表达式为真是值为1,否则为0。表达式两端的 操作数类型必须相同。第31页,共93页。有效定义的表达式 某些汇编器要求有效定义的表达式作为操作数。操作数是汇编时间常数或链接时可重定位的符号。例5.1.6 有效定义表达式.dataLabel.word0.word1.word2Label.word3X.set50hgoodsym1.set100h+Xgoodsym2.set$goodsym3.setlabel1goodsym4.setlabel2-label2第32页,共93页。.global Ybadsym1.setybadsym2.set50h+Ybadsy
18、m3.set50h+zZ.set60h例5.1.7 无效的定义表达式第33页,共93页。表达式上溢和下溢 汇编时执行了算术运算以后,汇编器检查上溢和下溢的条件。无论上溢和下溢的出现,它都会发出一个值被截断了的警告。汇编器不检查乘法的溢出状态。可重新定位符号和合法表达式 表5.1.2列出了有关绝对符号、可重新定位符号,以及外部符号的有效操作。表达式不能包含可重新定位符号和外部符号的乘或除,表达式中也不能包含对其他的段可重新定位但不能被分辨的符号。第34页,共93页。表表5.1.2 带有关绝对符号和可重新定位符号的表达式带有关绝对符号和可重新定位符号的表达式第35页,共93页。以下例子说明了在表达
19、式中绝对符号和可重新定位符号的使用。.global extern_1 ;定义在外部模块中 intern_1 .word “D”;可重新定位,在现行模块中定义 LAB1:.set 2 ;LAB1=2不可重新定位(绝对符号)intern_2 ;可重新定位,在现行模块中定义第36页,共93页。例例 5.1.8LDextern_1-10,B ;合法合法LD10-extern_1,B ;不能将可重新定义符号变为负;不能将可重新定义符号变为负LDextern_1/10,B ;不能将可重新定义符号乘除;不能将可重新定义符号乘除LDintern_1+extern_1,B;无效的加操作;无效的加操作例例 5.1
20、.9LDintern_1-intern_2+extern_1,B ;合法;合法LDintern_1+intern_2+extern_1,B ;非法;非法LDintern_1+extern_1-intern_2,B ;非法;非法第37页,共93页。5.9 堆栈的使用方法 当程序调用中断服务程序或子程序时,需要将程序计数器PC值和一些重要的寄存器值进行压栈保护,以便程序返回时能从间断处继续执行。C54x提供一个用16位堆栈指正(SP)寻址的软件堆栈。当向堆栈中压入数据时,堆栈是从高地址向低地址方向填入的。第38页,共93页。如果程序中要用堆栈,必须先进行设置,方法如下:size .set 120
21、stack .usect “STACK”,size STM#stack+size,SP第39页,共93页。堆栈区的大小可以按照以下步骤来确定。先开辟一个较大的堆栈区,用已知数重填。LD#-9224,B STM#length,AR1 MVMM SP,AR4 loop:STL B,*AR4-BANZ loop,*AR1-第40页,共93页。执行以上程序后,堆栈区中的所有单元均重填0DBF8h。运行程序。检查堆栈中的数值。DBF8DBF8DBF8DBF8DBF8DBF8数据RAM图5.2.1 堆栈区大小的确定第41页,共93页。5.3 控制程序 TMS320C54x具有丰富的程序控制指令,利用这些指
22、令可以执行分支转移、子程序调用、子程序返回、条件操作以及循环操作等控制操作。第42页,共93页。5.3.1 分支操作程序 程序控制中的分支操作包括:分支转移、子程序返回和条件操作。分支转移程序 通过传送控制到程序存储器的其他位置,分支转移会中断连续的指令流。分支转移回影响在PC产生和保存的程序地址。分支转移操作分成两种形式:无条件分支转移和条件分支转移,两者都可以带延时操作和不带延时操作。如表5.3.1。P149 第43页,共93页。例5.3.1 分支转移举例 STM#88H,AR0 LD#1000H,A zhangshan:SUB AR0,A BC zhangshan,AGT,AOV第44页
23、,共93页。子程序调用程序 子程序调用会中断连续的指令流,但与分支转移不同的是,这种传送是临时的。当函数的子程序被调用时,紧跟在调用后的下一条指令的地址保存在堆栈中。这个地址用于返回到调用程序并继续执行调用前的程序。子程序调用操作分成两种形式:无条件调用和条件调用,两者都可以带延时操作和不带延时操作,如表5.3.2。P149第45页,共93页。例5.3.2 子程序调用举例 STM#123H,AR0 LD#456H,AR1 CALL new LD AR1,16,A new:MPY AR0,AR1,A RET第46页,共93页。子程序返回程序 子程序返回程序可以使程序重新再被中断的连续指令处继续执
24、行。返回指令通过弹出堆栈的值到程序计数器(PC)来实现返回功能。C54x可以执行无条件返回和条件返回,并且它们都可以带延时或不带延时,如表5.3.3。p150 第47页,共93页。条件操作程序 C54x的一些指令只有在满足一个或多个条件才被执行。表5.3.4列出了这些指令用到的条件以及对应的操作数符号。第48页,共93页。表5.3.4 条件指令所需的条件和相应的操作数第49页,共93页。在条件操作时也可以要求多个条件,只有所有条件满足时才被认为时条件满足。特别注意的是,条件的组合有一定要求和规律,只有某些组合才有意义。为此,把操作数分成两组,每组又分成三类。第50页,共93页。例 5.3.3
25、条件分支转移 BC sub,BLET CC start,AGET,AOV RC NTC第51页,共93页。5.3.2 循环操作程序 在程序设计时,经常需要重复执行某一段程序。利用BANZ指令执行循环计数和操作是十分方便的。例5.3.4 计算 ,主要程序如下:.bss x,10 .bss y,1 STM#x,AR1 STM#9,AR2 LD#0,A loop:ADD *AR1+,A BANZ loop,*AR2-STL A,y101iiyx第52页,共93页。5.4 算术运算程序 基本的算术运算程序包括:加减法运算、乘法运算、除法运算、长字和并行运算。第53页,共93页。5.4.1 加减法运算和
26、乘法运算 在数字信号处理中,加法运算和乘法运算时最常见的算术运算,下面举几个例子。例5.4.1 计算y=ax+b LD#a,T MPY#x,B ADD#b,B STL B,y第54页,共93页。例5.4.2 计算y=x1a1x2a2 LD#x1,T MPY#a1,B LD#x2,B MAC#a2,B STL B,y STH B,y+1第55页,共93页。例 5.4.3 计算 .title“example.asm”.mmregsstack.usect“STACK”,10h.bssa,4.bssx,4.bssy,1.defstart.datatable:.word1,2,3,4.word8,6,4
27、,2.textstart:STM#0,SWWSRSTM#STACK+10h,SPSTM#a,AR1RPT#7MVPDtable,*AR1+CALLSUMend:BendSUM:STM#a,AR3STM#x,AR4RPTZA,#3MAC*AR3+,*AR4+,ASTLA,yRET.end41iiiya x第56页,共93页。5.4.2 除法运算 在C54x中没有除法器硬件,也就没有专门的除法命令。但是,可以利用一条条件减法指令加上重复指令“RPT#15”就可以实现两个无符号数的除法运算。条件减法指令的功能如下:SUBC Smem,src ;(src)-(smem)15ALU输出 如果ALU输出0
28、,则(ALU输出)1+1src 否则(src)1src第57页,共93页。例5.4.4 编写16 348512的程序段。.bssnum.1.bssden.1.bssquot.1.datatable:.word66*32768/10 ;0.66.word-33*32768/10 ;-0.33.textstart:.STM#num,AR1RPT#1MVPDtable,*AR1+;传送两个数据至分子、分母单元;传送两个数据至分子、分母单元LD den,16,A ;将分母移到累加器;将分母移到累加器A(3116)MPYA num ;(;(num)*A(3116)B,获商的符号,获商的符号 ;在;在B中
29、中第58页,共93页。ABSA ;分母取绝对值;分母取绝对值STHA,den ;分母绝对值送回原处;分母绝对值送回原处LD num,A ;分子;分子A(3116)ABSA ;分子取绝对值;分子取绝对值RPT#15 ;16次减重复次减重复SUBC den,A ;XC1,BLT ;如果;如果B0(商是负数),则需变号(商是负数),则需变号NEGA STLA,quot ;保存商;保存商第59页,共93页。5.4.3 长字运算和并行运算 长字指令 C54x可以利用32位长操作数进行长字运算。进行长字运算时,需使用长字运算,需使用长字指令,如:DLD Lmem,dst DST src,Lmem DADD
30、 Lmem,src,dst DSUB Lmem,src,dst DRSUB Lmem,src,dst 长操作数指令存在高16位和低16位操作数在存储器中的排列方式问题。由于按指令中给出的地址存取的总是高16位操作数,这样,就有以下两种排列的方法。第60页,共93页。偶地址排列法:指令中给出的地址为偶地址,存储器中低地址存放高16位操作数。例5.4.5 偶地址排列法举例 .bssa,2.bssy,2.datatable:.word06CACH,0BD90H.textSTM#a,AR1RPT#1MVPDtable,*AR1+STM#a,AR3DLD*AR3+,A执行前 执行后A=00 0000 0
31、000 A=00 6CAC BD90HAR3=0100H AR3=0102H(0100H)=6CACH(高字)(0100H)=6CACH(0101H)=BD90H(低字)(0101H)=BD90H第61页,共93页。奇地址排列法:指令中给出的地址为奇地址,存储器中低地址存放低16位操作数。例5.4.6 奇地址排列法举例.bssa,2.bssy,2.datatable:.word06CACH,0BD90H.textSTM#a,AR1RPT#1MVPDtable,*AR1-STM#a,AR3DLD*AR3+,A执行前 执行后A=00 0000 0000 A=00 BD90 6CAC HAR3=01
32、01H AR3=0103H(0100H)=6CACH(低字)(0100H)=6CACH(0101H)=BD90H(高字)(0101H)=BD90H第62页,共93页。例5.4.7 计算Z32=X32+Y32 标准运算标准运算.bssxhii,1.bssxlo,1.bssyhi,1.bssylo,1.bsszhi,1.bsszlo.1LDxhi,16,AADDSxlo,AADDyhi,16,AADDSylo,ASTHA,zhiSTLA,zlo (6个字,个字,6个周期)个周期)长字运算长字运算.bssxhi,2,1,1.bssyhi,2,1,1.bsszhi,2,1,1 DLDxhi,ADADD
33、yhi,ADSTA,zhi(3个字,个字,3个周期)个周期)第63页,共93页。并行运算 并行运算就是同时利用D总线和E总线两条参与运算。D总线用来执行加载或算术运算,E总线用来存放先前的结果。并行指令有4种:并行装载和乘法指令,并行装载和存储指令,并行存储和乘法指令,以及并行存储和加/减法指令。第64页,共93页。表5.4.2列出了并行运算指令的例子 第65页,共93页。例5.4.8 编写计算z=x+y 和 f=e+d的程序段 在此程序段中用到了并行加载/存储指令,即在同一机器周期内利用D总线加载和E总线存储。.bssx,3.bssd,3STM#x,AR5STM#d,AR2LD#0,ASML
34、D#AR5+,16,AADD*AR5+,16,ASTA,*AR5|LD*AR2+,BADD*AR2+,16,BSTHB,*AR2第66页,共93页。例5.4.9 编写计算Z64=W64+X64-Y64的程序段 DLD#w1,ADADD#x1,ADLD#w3,BADDC#x2,BADD#x3,16,BDSUB#y1,ADSTA,#z1SUBB#y2,BSUB#y3,16,BDSTB,#z3 W3 W2 W1 W0 W64+X3 X2 C X1 X0 X64-Y3 Y2 C Y1 Y0 Y64 Z3 Z2 Z1 Z0 Z64 由于没有长字带进(借)位加、减法指令,所以只能用16为位带进(借)位加、
35、减法指令ADDC和SUBB。第67页,共93页。5.5 重复操作程序 TMS320C54x的重复操作是使CPU重复执行一条指令或一段指令,可以分为单指令重复和块程序重复。具体来讲,使用RPT、RPTZ能重复下一条指令;而RPTB用于重复代码块若干次。第68页,共93页。5.5.1 单指令重复操作 重复指令RPT或RPTZ允许重复执行紧随其后的那一条指令。下一条指令的重复次数由该指令的操作数决定,并且等于操作数加1。由于要重复的指令只需要取指一次,与利用BANZ指令进行相比,效率要高。第69页,共93页。例5.5.1 对一个数组进行初始化:x8=0,0,0,0,0,0,0.bssx,8STM#x
36、,AR1LD#0,ARPT#7 STLA,*AR1+第70页,共93页。5.2.2 块程序重复操作 用于块程序重复操作指令为RPTB和RPTBD,可以重复代码块N+1次,N是保存在块重复计数器(BRC)的值。循环由ST1状态寄存器的块重复标志位(BRAF)和紧跟在ST1状态寄存器后面的存储器映像寄存器控制。循环过程如下:将块重复标志位置1,激活块程序重复循环;将一个取指在065535范围里的循环次数N加载到BRC,N的取指应当比块循环次数少1;块重复指令把块重复的起始地址放在块重复开始地址寄存器中;块重复指令把块重复的末地址放在块重复结束地址寄存器中。第71页,共93页。例5.5.2 对数据组
37、x8中的每个元素加1.bssx,8beginLD#1,16,BSTM#7,BRC STM#x,AR4RPTB next-1ADD*AR4,16,B,ASTHA,*AR4+nextLD#0,B第72页,共93页。5.5.3 循环嵌套 在TMS320C54x汇编语言源程序设计中,实现循环嵌套的一种简单方法是只在最内部的循环使用RPTBD指令,在所有外部的循环用BANZD指令。第73页,共93页。下面是一个三重循环嵌套结构,内层、中层和外层三重循环分别采用RPT、RPTB和BANZ指令,重复执行N、M和L次。STM#L-1,AR7;2T 外部外部STM#L-1,BRC;2TRPTB 2nd-1 中间
38、中间 中间中间RPT#N-1 内部内部 中间中间 中间中间 外部外部 外部外部BANZ 1st,*AR7-;4T 3 2 11st:2nd:第74页,共93页。上述三重循环开销如表:循环循环指令指令 开销开销(机器周期数机器周期数)1(内层内层)RPT1 2(中层中层)RPTB 4+2(加载加载BRC)3(外层外层)BANZ 4N+2(加载加载AR)第75页,共93页。5.6 数据块传送程序 TMS320C54x的数据传送指令用于数据传送的指令有10条,分别可以实现数据存储器之间、数据存储器和MMR之间、程序存储器和数据存储器之间、程序存储器和数数据存储器之间的数据传送,见表5.6.1。第76
39、页,共93页。程序存储器 数据存储器 重复执行MVPD指令,可以实现程序存储器至数据存储器的数据传送,在系统初始化过程中很有用。例5.6.1 对数组x8=0,1,2,3,4,5,6,7进行初始化.bssx,8.dataTBL.word 0,1,2,3,4,5,6,7.textSTART:STMRPT#7 MVPDTBL,*AR5+第77页,共93页。数据存储器 数据存储器 在数字信号处理时,经常需要将数据存储器中的一批数据传送到数据存储器的另一个地址空间。例5.6.2 进行N点FFT运算时,为节约存储空间要用到原位计算,将数组x16赋到y16,计算一个蝶形后,所得的输出数据可以立即存入原输入数
40、据所占用的存储单元。.bss x,16 .bss y,16 STM#x,AR2 STM#y,AR3 RPT#15 MVDDAR2+,*AR3+第78页,共93页。程序存储器 数据存储器 例5.6.3 数据存储器到程序存储器的数据传送 WRTIE_A:STM#380h,AR1RPT#(128-1)WRITA*AR1+RET第79页,共93页。数据存储器 MMR 例5.6.4 双操作数方式实现IIR高通滤波器 table:.word0;.word0;.word653*32768/10000.word-1306*32768/10000.word653*32768/10000.word-3490*32
41、768/10000.word-600*32768/10000.textstart:SSBXFRCTSTM#x2,AR1RPT#1MVPD#table,*AR1+STM#COEF,AR1RPT#4MVPD#table+2,*AR1+STM#x2,AR3STM#COEF+4,AR4MVMMAR4,AR1STM#3,BKSTM#-1,AR0PORTR PA1,*AR3LD*AR3+0%,16,AMAC*AR3,*AR4,AMAC*AR3+0%,*AR4-,AMAC*AR3+0%,*AR4-,ASTHA,*AR3MPY*AR3+0%,*AR4-,A第80页,共93页。MAC*AR3+0%,*AR4-,
42、AMAC*AR3+0%,*AR4-,A STHA,*AR3MVMMAR1,AR4BDIIR1PORTW*AR3,PA0.end第81页,共93页。5.7 小数运算程序 两个小数相乘,乘积的结果是小数点右侧的位数增加。因此在小数乘法时,既可以存储32位乘积,也可以存储高16位乘积,从而用较少的资源保存结果,同时也利于递推运算。数的定标 数的定标通常有Q表示法,如Q0、Q1等。Q越大,可以表示的数的范围越小,但精度越高。第82页,共93页。小数的表示方法 C54x采用基于2的补码小数表示形式。每个16位数用1个符号位、15-i个小数位来表示。2的补码小数的每一位的权值为 MSB LSB-1.2-1
43、2-22-32-15第83页,共93页。小数乘法与冗余符号位 小数乘法的例子 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 0 0第84页,共93页。上述乘积结果为7位,当将其送到累加器时,为保持乘积的符号,必须进行符号位扩展,这样,累加器的值为11101000,出现了冗余符号位。原因是两个带符号位数相乘,得到的乘积带有2个符号位,造成的错误结果。第85页,共93页。解决冗余符号位的办法是:在程序中设定状态寄存器ST1中的FRCT位为1,在乘法器将结果传送至累加器时就能自动地左移1位,累加器中的结果为Szzzzzz0,即11
44、010000。第86页,共93页。例 5.7.1编制求解 程序段。其中数据均为小数。41iiiya x.bssx,4.bssa,4.bssy,1.datatable:.word3*32768/10.word2*32768/10.word-4*32768/10.word1*32768/10.word6*32768/10.word5*32768/10.word-1*32768/10.word-2*32768/10.textstart:SSBXFRCTSTM#a,AR4RPT#7MVPDtable,*AR4STM#x,AR5STM#a,AR6RPTZA,#3MAC*AR5+,*AR6+,ASTHA,
45、ydone:Bdone第87页,共93页。5.8 浮点运算程序 在数字信号处理过程中,定点运算时将数据的整数和小数部分分开,小数点在一个固定位置,其优点是硬件比较容易,但动态范围受到限制。浮点数的表示方法 在C54x中浮点数用尾数和指数两部分组成,它与定点数的关系为 点数=尾数2-(指数)第88页,共93页。定点数转换成浮点数 假设定点数已在累加器A中,C54x通过3条指令就可以将一个定点数转化成浮点数。EXP A 提取指数,并将指数保存在T寄存器中。ST T,EXPONENT 这条紧接在EXP后的指令是将保存在T寄存器中的指数存放到数据存储器的指定单元中。NORMA 按T寄存器中的内容对累加
46、器A进行规格化处理,即ATSA。第89页,共93页。浮点数转换成定点数 因为浮点数的指数就是在规格化时左移的位数,所以在将浮点数转化成定点数时,只要按指数值将尾数右移。浮点乘法运算实例 在C54x上实现浮点乘法运算时,首先将定点数规格化浮点数;然后完成浮点乘法运算;最后将浮点数转换成定点数。第90页,共93页。例5.8.1 编写浮点乘法程序,完成a1*a2=0.4(-0.9).title“floatproduct.asm”.defstartSTACK.usect“STACK”,100.bssa,2.bssb,2.bssc,2.bssep,1.bssmp,1.bssproduct,1.bsste
47、mp,1.datatable:.word4*32768/10.word-9*32768/10.textStart:STM#STACK+100,SPMVPDtable,a1MVPDtable+1,a2LDa1,16,AEXPASTT,b1NORMASTHA,c1LDa2,16,AEXPASTT,b2NORMA第91页,共93页。STHA,a2CALLMULTEND:BENDMULT:SSBXFRCTSSBXSXMLDb1,AADDb2,ASTLA,epLDc1,TMPYc2,AEXPASTT,tempNORMASTHA,mpLDtemp,AADDep,ASTLA,epNEGASTLA,tempLDtemp,TLDmp,16,ANORMASTHA,product.END第92页,共93页。程序执行结果如下:33338CCD0001666600008CCDA3D70001D1ECFFFE a1 a2 b1 c1 b2 c2 mp ep product temp第93页,共93页。