版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第5章TMS320C54x的汇编语言程序设计 知识要点:本章涉及的内容包括汇编语言源程序的格式、常数、字符串、符号和表达式的规定;堆栈的使用方法;分支、调用、返回等控制程序;加法、乘法、除法、长字和并行等算术运算程序;单指令、块重复、循环嵌套等重复操作程序;数据块传送程序;小数运算程序以及浮点运算程序等。5.1 概述 TMS320C54x汇编语言源程序由源语句组成。这些语句可以包含汇编语言指令、汇编伪指令和注释。程序的编写必须符合一定的格式,以便汇编器将源文件转换成机器语言的目标文件。下面将介绍汇编语言源程序的格式、各种常数、符号、字符串和表达式的规定。5.1.1 汇编语言源程序格式 汇编语言
2、程序以.asm为扩展名,可以用任意的编辑器编写源文件。 一句程序占源程序的一行,每行字符最多200个,如果长度超过200,则汇编器截去行尾的多余字符,并发出一个警告。 源文件格式 助记符指令源语句的每一行通常包含4个部分:标号区、助记符区、操作数区和注释区。 助记符指令语法格式如下: label: mnemonic operand list ;comment 标号区 助记符区 操作数区 注释区 例 助记符指令源语句举例。 NANHUA .set 1;符号NANHUA=1 Begin: LD #NANHUA,AR1; 将1加载到AR1 汇编语句书写格式应遵循一定规则。这些规则如下: 所有语句必须
3、以一个标号、空格、星号或分号开始; 标号是可选项,若使用标号,则标号必须从第一列开始; 包含有一个汇编伪指令的语句必须在一行完全指定; 每个区必须用一个或多个空格分开,Tab字符与空格等效。 程序中注释是可选项。在第一列用*号或;号,其它列用;号。 若源程序很长,需要书写若干行,可在前一行用反斜杠()结束,余下接着在下一行继续书写。 标号区 所有汇编指令和大多数汇编伪指令前面都可以选择语句标号。使用语句标号时,必须从源语句第一列开始。 标号最多为32个字符,由(AZ, az, 09, _和$)等组成。标号分大小写,第一个字符不能用数字。标号后面带冒号: 在使用标号时,标号的值是段程序计数器(S
4、PC)的当前值。 例5.1.2 标号格式举例。 标号Start的值为40h: 9 000000 ;假设汇编了某个其他代码10 000040 000A Start: .word 0Ah ,3 ,7 000041 0003 000042 0007 在一行中的标号本身是一个有效的语句。 标号将段程序计数器(SPC)的当前值赋给标号,等效于下列伪指令语句: label .set $; $提供SPC当前值 如果标号单独占一行时,它将指到下一行的指令(SPC不增加): 3 000043 Here: 4 000043 0003 .word 3 助记符指令区 在助记符汇编语言中,紧接在标号区后面的是助记符区和
5、操作数区。 助记符区 助记符区跟在标号区的后面。 助记符指令可以是汇编语言指令、汇编伪指令、宏伪指令。助记符区不能从第一列开始。 助记符区可以包含如下操作码。 机器指令助记符,一般用大写; 汇编伪指令、宏伪指令。以英文句号“.”开头,且为小写; 宏调用。 操作数区 操作数区是跟在助记符区后面的一系列操作数,由一个和多个空格分开。 操作数可以是符号、常数或是符号与常数组合的表达式。操作数之间一定用逗号“,”分开。 对操作数前缀的规定。汇编器允许将常数、符号或表达式作为地址、立即数或间接地址。指令操作数遵循以下规定: 前缀“#”后面的操作数是一个立即数。 前缀“*”后面的操作数是一个间接地址。 注
6、释区 注释是任选项。 注释可以由ASC码和空格组成。5.1.2 汇编语言中的常数与字符串 汇编器支持以下几种类型的常数(常量)。 二进制整数 二进制整数常量最多由16位二进制数字(0或1)组成,后缀为B(或b)。如果数字小于16位,汇编器将其右边对其,并在前面补零。例如: 10001000B 136(十进制) 0111100b 60(十进制) 10b 2 (十进制) 10001111B 143(十进制) 八进制整数 八进制整数型常量最多由6位八进制数字(07)组成,后缀为Q(或q)或前缀为0 例如: 100011Q 32777(十进制) 124q 84(十进制) 对八进制常数也可使用C语言的记
7、号,即加前缀0。 0100011 32777(十进制) 0124 84(十进制) 十进制整数 十进制整数型常量由十进制数字串组成,无后缀。取值范围为:-3276832767或065535。例如: 2118 2118(十进制) 65535 65535(十进制) -32768 -32768(十进制) 十六进制整数 十六进制整数常量最多由4位十六进制数字组成,带后缀H(或h)。例如: 0DH 14(十进制) 12BCH 4796(十进制) 对十六进制常数也可使用C语言的记号,即加前缀0 x: 0 x0D 14(十进制) 0 x12BC 4796(十进制) 浮点数 浮点整型常量由一串十进制数字组成,可
8、以带小数点、分数和指数部分。浮点数的表示方法为 n. nE|e n n代表一串十进制数,小数点必须指定。例如99.e9是有效数,但99e9非法。 汇编时间常数 在程序中使用.set伪指令给一个符号赋值,该符号就成为一个汇编时间常数,等效于一个常数。赋给符号的必须是绝对值。例如将常数值18赋给符号nan_hua,即 nan_hua .set 18 LD # nan_hua,A 也可以用.set伪指令将符号常数赋给寄存器名。此时,该符号变成了寄存器替代名。例如: AuxR1 .set AR1 MVMM AuxR1,SP 字符常数 字符常数是包括单引号内的字符串。若单引号之间没有字符,则值为0。每个
9、字符在内部表示为8位ASC码。例如: a 内部表示为61h B 内部表示为42h 字符串 字符串是由双引号括起来的一串字符。字符串的最大长度是可以变化的,由要求字符串的伪指令来设置。字符在内部用8位ASC码来表示。例如: “example” 定义了一个长度为7的字符串: example5.1.3 汇编源程序中的符号 汇编源程序中的符号用于标号、常数和替代字符。符号名最多可长达200个字符,由字母、数字以及下划线和美元符号(AZ,az,09,_和$)等组成。 标号分大小写。在符号中,第一个字符不能用数字,符号中不能含空格。 标号 用做标号(labels)的符号代表在程序中对应位置的符号地址。通常
10、标号是局部变量,在一个文件中局部使用的标号必须是惟一的。 标号还可以作为.global, .ref, .def或.bss等汇编伪指令的操作数。如: .global label lable1 NOP ADD label, B B label1 符号常数 符号也可被设置成常数值。这样可以用有意义的名称来代表一些重要的常数值,提高程序的可读性。 例5.1.3 定义符号常数举例。 N .set 512 ;定义常数 buffer .set 4*N nzg1 .set 1 nzg2 .set 2 nzg3 .set 3 item .struct ;item结构定义 .int nzg1 ;常数偏移nzg1=
11、1 .int nzg2 ;常数偏移nzg2=2 .int nzg3 ;常数偏移nzg2=3 tang_ning .endstruct array .tag item ;声明数组 .bss array, tang_ning*N 定义符号常数(-d选项) 使用-d选项可以将常数值与一个符号等同起来。定义以后,在汇编源文件中可用符号代替和它等同的值。-d选项的格式如下: asm500 -d name=value 在汇编源程序中,可以用下表所列的伪指令来检测符号: 检测类型 使用的伪指令 存在 不存在 与值相等 与值不相等.if $isdefed(“name”).if $isdefed(“name”)
12、=0.if name=value.if name!=value注意,内部函数$isdefed中的变量必须在双引号内。 预先定义的符号常数 汇编器有若干预先定义的符号,包括: $,美元符号,代表段程序指针的当前值; 寄存器符号包括AR0AR7; _large_model指定存储器模式。默认值为0,由-mk选项可以设置为1。 替代符号 可将字符串值(变量)赋给符号,这时符号名与该变量等效,成为字符串的别名。这种用来代表变量的符号称为替代符号。当汇编器遇到替代符号时,将用字符串值代替它。 可在程序中的任何地方将变量赋给替代符号。例如: .asg “high”,AR2 ;寄存器AR2用high替代 局
13、部标号 局部标号是一种特殊的标号,使用的范围和影响是临时性的。局部标号可用以下方法定义: 用$n来定义,这里n是09的十进制数。 用NAME?定义,其中NAME是任何一个合法的符号名。 下面举例说明局部标号$n的格式。该例中假设符号ADDRA, ADDRB, ADDRC已经在前面做了定义。 例5.1.4 合法、非法局部标号$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
14、LD ADDRA, A ;将ADDRA装入A $2 ADD ADDRC, A ;加上ADDRC .newblock ;取消$1 的定义,使它可再 次被使用 BC $1, ALT ;若小于0,转移到$1 STL A, ADDRC ;存A低16位 $1 NOP 非法使用局部标号的代码段 Label1: LD ADDRA, A SUB ADDRB,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 被多次 定义 例5.1.5 name?形式的局部标号的使用
15、; 局部标号局部标号 mylab 的第一个定义的第一个定义nopmylab? nop bmylab?mylab? nop bmylab?maymac .macromylab? nop bmylab? .sect “Secto_One” nopmylab? .word 0 nop nop bmylab? .newblockmylab? .word0 nop nop bmylab?5.1.4 汇编源程序中的表达式 表达式可以是常数、符号,或者是由算术运算符分开的一系列常数和符号。有效表达式值的范围从-3276832767。影响表达式计算顺序的因素主要有以下3个: 圆括号()。圆括号内的表达式最先计
16、算。 优先级。见表3.2.2。优先级高的先计算。 从左到右运算。具有相同优先级的运算按从左 到右顺序计算。 运算符 第3章中的表列出了可用在表达式中的运算符。TMS320C54x汇编器使用与C语言相似的优先级。 条件表达式 汇编器支持关系运算符,可以用于任何表达式,这对条件汇编特别有用。有以下几种关系运算符: = 等于; = 等于; !=不等于; =大于或等于; 大于;小于 条件表达式为真是值为1,否则为0。表达式两端的 操作数类型必须相同。 有效定义的表达式 某些汇编器要求有效定义的表达式作为操作数。操作数是汇编时间常数或链接时可重定位的符号。 例5.1.6 有效定义表达式. .dataLa
17、bel.word0.word1.word2Label.word3X.set50hgoodsym1.set100h+Xgoodsym2.set$goodsym3.setlabel1goodsym4.setlabel2-label2 .global Ybadsym1.setybadsym2.set50h+Ybadsym3.set50h+zZ.set60h例5.1.7 无效的定义表达式 表达式上溢和下溢 汇编时执行了算术运算以后,汇编器检查上溢和下溢的条件。无论上溢和下溢的出现,它都会发出一个值被截断了的警告。汇编器不检查乘法的溢出状态。 可重新定位符号和合法表达式 表5.1.2列出了有关绝对符号、
18、可重新定位符号,以及外部符号的有效操作。表达式不能包含可重新定位符号和外部符号的乘或除,表达式中也不能包含对其他的段可重新定位但不能被分辨的符号。表表5.1.2 带有关绝对符号和可重新定位符号的表达式带有关绝对符号和可重新定位符号的表达式 以下例子说明了在表达式中绝对符号和可重新定位符号的使用。 .global extern_1 ; 定义在外部模块中 intern_1 .word “D” ; 可重新定位,在现行模块中定义 LAB1: .set 2 ; LAB1=2不可重新定位(绝对符号) intern_2 ; 可重新定位,在现行模块中定义例例 5.1.8LDextern_1-10, B ;合法
19、合法LD10-extern_1, B ;不能将可重新定义符号变为负;不能将可重新定义符号变为负LDextern_1/10, B ;不能将可重新定义符号乘除;不能将可重新定义符号乘除LDintern_1+extern_1, B;无效的加操作;无效的加操作例例 5.1.9LDintern_1-intern_2+extern_1, B ;合法;合法LDintern_1+intern_2+extern_1,B ;非法;非法LDintern_1+extern_1-intern_2, B ;非法;非法5.9 堆栈的使用方法 当程序调用中断服务程序或子程序时,需要将程序计数器PC值和一些重要的寄存器值进行压
20、栈保护,以便程序返回时能从间断处继续执行。 C54x提供一个用16位堆栈指正(SP)寻址的软件堆栈。 当向堆栈中压入数据时,堆栈是从高地址向低地址方向填入的。 如果程序中要用堆栈,必须先进行设置,方法如下: size .set 120 stack .usect “STACK”, size STM #stack+size, SP 堆栈区的大小可以按照以下步骤来确定。 先开辟一个较大的堆栈区,用已知数重填。 LD # -9224, B STM #length, AR1 MVMM SP, AR4 loop: STL B, *AR4- BANZ loop, *AR1- 执行以上程序后,堆栈区中的所有单
21、元均重填0DBF8h。 运行程序。 检查堆栈中的数值。 DBF8DBF8DBF8DBF8DBF8DBF8数据RAM图5.2.1 堆栈区大小的确定5.3 控制程序 TMS320C54x具有丰富的程序控制指令,利用这些指令可以执行分支转移、子程序调用、子程序返回、条件操作以及循环操作等控制操作。5.3.1 分支操作程序 程序控制中的分支操作包括:分支转移、子程序返回和条件操作。 分支转移程序 通过传送控制到程序存储器的其他位置,分支转移会中断连续的指令流。分支转移回影响在PC产生和保存的程序地址。 分支转移操作分成两种形式:无条件分支转移和条件分支转移,两者都可以带延时操作和不带延时操作。如表5.
22、3.1。P149 例5.3.1 分支转移举例 STM #88H, AR0 LD #1000H, A zhangshan: SUB AR0, A BC zhangshan, AGT, AOV 子程序调用程序 子程序调用会中断连续的指令流,但与分支转移不同的是,这种传送是临时的。 当函数的子程序被调用时,紧跟在调用后的下一条指令的地址保存在堆栈中。这个地址用于返回到调用程序并继续执行调用前的程序。 子程序调用操作分成两种形式:无条件调用和条件调用,两者都可以带延时操作和不带延时操作,如表5.3.2。P149 例5.3.2 子程序调用举例 STM #123H, AR0 LD #456H, AR1 C
23、ALL new LD AR1, 16, A new: MPY AR0, AR1, A RET 子程序返回程序 子程序返回程序可以使程序重新再被中断的连续指令处继续执行。返回指令通过弹出堆栈的值到程序计数器(PC)来实现返回功能。 C54x可以执行无条件返回和条件返回,并且它们都可以带延时或不带延时,如表5.3.3。p150 条件操作程序 C54x的一些指令只有在满足一个或多个条件才被执行。 表5.3.4列出了这些指令用到的条件以及对应的操作数符号。 表5.3.4 条件指令所需的条件和相应的操作数 在条件操作时也可以要求多个条件,只有所有条件满足时才被认为时条件满足。特别注意的是,条件的组合有一
24、定要求和规律,只有某些组合才有意义。为此,把操作数分成两组,每组又分成三类。 例 5.3.3 条件分支转移 BC sub, BLET CC start, AGET, AOV RC NTC5.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, y101iiyx5.4 算术运算程序 基本的算术运算程序包括:加
25、减法运算、乘法运算、除法运算、长字和并行运算。5.4.1 加减法运算和乘法运算 在数字信号处理中,加法运算和乘法运算时最常见的算术运算,下面举几个例子。 例5.4.1 计算y=ax+b LD # a, T MPY # x, B ADD #b, B STL B, y 例5.4.2 计算y=x1a1x2a2 LD #x1, T MPY #a1, B LD #x2, B MAC #a2, B STL B, y STH B, y+1 例 5.4.3 计算 .title“example.asm”.mmregsstack.usect“STACK”,10h.bssa,4.bssx,4.bssy,1.defs
26、tart.datatable:.word1,2,3,4.word8,6,4,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 x5.4.2 除法运算 在C54x中没有除法器硬件,也就没有专门的除法命令。 但是,可以利用一条条件减法指令加上重复指令“RPT #15”就可以实现两个无符号数的除法运算。 条件减法指令的功能如下: SUBC Smem,
27、src ; (src)-(smem) 15ALU输出 如果ALU输出0,则(ALU输出) 1+1src 否则(src) 1src 例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 ;(;(
28、num )* A(3116)B,获商的符号,获商的符号 ;在;在B中中ABSA ;分母取绝对值;分母取绝对值STHA, den ;分母绝对值送回原处;分母绝对值送回原处LD num, A ;分子;分子A (3116)ABSA ;分子取绝对值;分子取绝对值RPT#15 ;16次减重复次减重复SUBC den, A ;XC1,BLT ;如果;如果B0(商是负数),则需变号(商是负数),则需变号NEGA STLA, quot ;保存商;保存商5.4.3 长字运算和并行运算 长字指令 C54x可以利用32位长操作数进行长字运算。进行长字运算时,需使用长字运算,需使用长字指令,如: DLD Lmem,
29、dst DST src, Lmem DADD Lmem, src, dst DSUB Lmem, src, dst DRSUB Lmem, src, dst 长操作数指令存在高16位和低16位操作数在存储器中的排列方式问题。由于按指令中给出的地址存取的总是高16位操作数,这样,就有以下两种排列的方法。 偶地址排列法:指令中给出的地址为偶地址,存储器中低地址存放高16位操作数。 例5.4.5 偶地址排列法举例 .bssa,2.bssy,2.datatable:.word06CACH, 0BD90H.textSTM#a, AR1RPT#1MVPDtable, *AR1+STM#a, AR3DLD*
30、AR3+, A执行前 执行后A=00 0000 0000 A=00 6CAC BD90HAR3=0100H AR3=0102H(0100H)= 6CACH (高字) (0100H)= 6CACH(0101H)= BD90H (低字) (0101H)= BD90H 奇地址排列法:指令中给出的地址为奇地址,存储器中低地址存放低16位操作数。 例5.4.6 奇地址排列法举例 .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 BD90 6CAC HAR3=0101H AR3=0103H(0100H)= 6CACH(低字) (0100H)= 6CACH(0101H)= BD90H (高字) (0101H)= BD90H 例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
32、,1.bsszhi,2,1,1 DLDxhi, ADADD yhi, ADSTA, zhi(3个字,个字,3个周期)个周期) 并行运算 并行运算就是同时利用D总线和E总线两条参与运算。D总线用来执行加载或算术运算,E总线用来存放先前的结果。 并行指令有4种:并行装载和乘法指令,并行装载和存储指令,并行存储和乘法指令,以及并行存储和加/减法指令。 表5.4.2列出了并行运算指令的例子 例5.4.8 编写计算z=x+y 和 f=e+d的程序段 在此程序段中用到了并行加载/存储指令,即在同一机器周期内利用D总线加载和E总线存储。 .bss x, 3.bss d, 3STM #x, AR5STM #d
33、, AR2LD#0, ASMLD#AR5+, 16, AADD *AR5+, 16, ASTA, *AR5| LD *AR2+, BADD *AR2+,16,BSTH B, *AR2 例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 由于没
34、有长字带进(借)位加、减法指令,所以只能用16为位带进(借)位加、减法指令ADDC和SUBB。5.5 重复操作程序 TMS320C54x的重复操作是使CPU重复执行一条指令或一段指令,可以分为单指令重复和块程序重复。具体来讲,使用RPT、RPTZ能重复下一条指令;而RPTB用于重复代码块若干次。5.5.1 单指令重复操作 重复指令RPT或RPTZ允许重复执行紧随其后的那一条指令。下一条指令的重复次数由该指令的操作数决定,并且等于操作数加1。 由于要重复的指令只需要取指一次,与利用BANZ指令进行相比,效率要高。 例5.5.1 对一个数组进行初始化: x8=0,0,0,0,0,0,0.bssx,
35、 8STM#x, AR1LD#0, ARPT#7 STLA, *AR1+5.2.2 块程序重复操作 用于块程序重复操作指令为RPTB和RPTBD,可以重复代码块N+1次,N是保存在块重复计数器(BRC)的值。 循环由ST1状态寄存器的块重复标志位(BRAF)和紧跟在ST1状态寄存器后面的存储器映像寄存器控制。循环过程如下: 将块重复标志位置1,激活块程序重复循环; 将一个取指在065535范围里的循环次数N加载到BRC,N的取指应当比块循环次数少1; 块重复指令把块重复的起始地址放在块重复开始地址寄存器中; 块重复指令把块重复的末地址放在块重复结束地址寄存器中。 例5.5.2 对数据组x8中的
36、每个元素加1. .bssx, 8beginLD#1, 16, BSTM#7, BRC STM#x, AR4RPTBnext-1ADD*AR4, 16, B, ASTHA, *AR4+nextLD#0, B5.5.3 循环嵌套 在TMS320C54x汇编语言源程序设计中,实现循环嵌套的一种简单方法是只在最内部的循环使用RPTBD指令,在所有外部的循环用BANZD指令。 下面是一个三重循环嵌套结构,内层、中层和外层三重循环分别采用RPT、RPTB和BANZ指令,重复执行N、M和L次。 STM #L-1,AR7;2T 外部外部STM #L-1,BRC;2TRPTB 2nd-1 中间中间 中间中间RP
37、T #N-1 内部内部 中间中间 中间中间 外部外部 外部外部BANZ 1st,*AR7-;4T 3 2 11st:2nd: 上述三重循环开销如表: 循环循环指令指令 开销开销(机器周期数机器周期数) 1(内层内层)RPT1 2(中层中层)RPTB 4+2(加载加载BRC) 3(外层外层)BANZ 4N+2(加载加载AR)5.6 数据块传送程序 TMS320C54x的数据传送指令用于数据传送的指令有10条,分别可以实现数据存储器之间、数据存储器和MMR之间、程序存储器和数据存储器之间、程序存储器和数数据存储器之间的数据传送,见表5.6.1。 程序存储器 数据存储器 重复执行MVPD指令,可以实
38、现程序存储器至数据存储器的数据传送,在系统初始化过程中很有用。 例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+ 数据存储器 数据存储器 在数字信号处理时,经常需要将数据存储器中的一批数据传送到数据存储器的另一个地址空间。 例5.6.2 进行N点FFT运算时,为节约存储空间要用到原位计算,将数组x16赋到y16,计算一个蝶形后,所得的输出数据可以立即存入原输入数据所占用的存储单元。 .bssx, 16 .bssy, 16 STM#x,A
39、R2 STM#y,AR3 RPT#15 MVDDAR2+, *AR3+ 程序存储器 数据存储器 例5.6.3 数据存储器到程序存储器的数据传送 WRTIE_A: STM#380h,AR1RPT#(128-1)WRITA*AR1+RET 数据存储器 MMR 例5.6.4 双操作数方式实现IIR高通滤波器 table:.word0;.word0;.word653*32768/10000.word-1306*32768/10000.word653*32768/10000.word-3490*32768/10000.word-600*32768/10000.textstart:SSBXFRCTSTM#
40、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-,AMAC*AR3+0%,*AR4-,AMAC*AR3+0%,*AR4-,A STHA,*AR3MVMMAR1,AR4BDIIR1PORTW*AR3,PA0.end
41、5.7 小数运算程序 两个小数相乘,乘积的结果是小数点右侧的位数增加。因此在小数乘法时,既可以存储32位乘积,也可以存储高16位乘积,从而用较少的资源保存结果,同时也利于递推运算。 数的定标 数的定标通常有Q表示法,如Q0、Q1等。Q越大,可以表示的数的范围越小,但精度越高。 小数的表示方法 C54x采用基于2的补码小数表示形式。每个16位数用1个符号位、15-i个小数位来表示。2的补码小数的每一位的权值为 MSB LSB-1. 2-12-22-32-15 小数乘法与冗余符号位 小数乘法的例子 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 上述乘积结果为7位,当将其送到累加器时,为保持乘积的符号,必须进行符号位扩展,这样,累加器的值为11101000,出现了冗余符号位。原因是两个带符号位数相乘,得到的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 购销合同贷款申请技巧分享
- 二年级品德与生活上册 爱护我们的生活环境教案3 北师大版
- 八年级历史上册 第六单元 中华民族的抗日战争第18课 从九一八事变到西安事变教案 新人教版
- 2024-2025学年高中物理 第一章 机械振动 2 单摆教案 教科版选修3-4
- 2023四年级数学上册 1 大数的认识第5课时 将整万数改写成用“万”作单位的数教案 新人教版
- 北京中南红星足球学校九年级化学上册 第三单元 课题1 分子和原子教学设计 (新版)新人教版
- 坐班合同协议书范本(2篇)
- 租的民房租房合同(2篇)
- 装修管理费合同(2篇)
- 浮选 课件 演示
- 数值实验报告-实验三
- 管理学原理:控制习题与答案
- 金属挤压共(有色挤压工)中级复习资料练习卷含答案
- 江苏省启东市长江中学2023-2024学年七年级上学期12月月考道德与法治试题
- 护患沟通情景实例
- 往复式压缩机常见故障与排除
- 高速铁道工程职业生涯规划书
- 护理查房-膝痹病课件
- 圆球幕墙施工方案
- 歌剧《洪湖水浪打浪-》课件
- 手术后气胸的护理课件
评论
0/150
提交评论