第四章_TMS320C54x的软件开发_3.ppt_第1页
第四章_TMS320C54x的软件开发_3.ppt_第2页
第四章_TMS320C54x的软件开发_3.ppt_第3页
第四章_TMS320C54x的软件开发_3.ppt_第4页
第四章_TMS320C54x的软件开发_3.ppt_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第4章 TMS320C54x的软件开发,4.1 TMS320C54x软件开发过程 4.2 汇编语言程序的编写方法 4.3 汇编伪指令和宏指令 4.4 公共目标文件格式COFF 4.5 汇编源程序的编辑、汇编和链接 4.6 汇编语言程序设计,4.6 汇编语言程序设计 基本程序设计分为3大类: (1) 程序的控制与转移。 (2) 数据块传送程序。 (3) 算术运算类程序。,4.6.1 程序的控制与转移 包括:分支转移 子程序操作(调用与返回程序) 循环控制(重复操作) 这些指令都将影响程序计数器(PC),会造成把一个不是顺序增加的地址加载到PC。表43P111,条件:有一些指令只有当一个条件或多个

2、条件得到满足时才能执行。如条件分支转移或条件调用、条件返回指令。表4-4P112。 多重条件 :BC pmad, cond,cond,cond,当这条指令的所有条件得到满足时,程序才能转移到pmad。不是所有条件都能构成多重条件,某些条件的组合如表4-5所示。 -P113,1. 分支转移 根据条件判断改写PC值,使程序发生分支转移。 两种形式:有条件分支转移和无条件转移。 常用指令: BD、BACCD ;BCD、BANZD BACC: Branch to Location Specified by Accumulator BANZ: Branch on Auxiliary Register N

3、ot Zero 合理地设计延迟转移指令,可以提高程序的效率。应当注意,紧跟在延迟指令后面的两个字,不能是造成PC不连续的指令(如分支转移、调用、返回或软件中断指令)。,【例4.11】 条件分支转移指令BC举例。 BC new, AGT, AOV ; 若累加器A0且溢出,则转至new,否则往下执行 单条指令中的多个条件是“与”的关系。 如果需要两个条件相“或”,只能写成两条指令。如上一条指令改为“若累加器A大于0或溢出,则转移至new”,可以写成如下两条指令 BC new, AGT BC new, AOV,【例4.12】 计算 .bss x, 5 ;为变量分配6个字的存储空间 .bss y, 1

4、 STM #x, AR1 ;AR1指向x STM #4, AR2 ;设AR2初值为4 LD #0, A loop: ADD *AR1+, A BANZ loop, *AR2- ;当AR2不为0时转移,AR2-1AR2 STL A, y 本例中用AR2作为循环计数器,设初值为4 AR2取值为4,3,2,1,0,2. 调用与返回指令 当调用子程序或函数时,DSP就会中断原先的程序,转移到程序存储器的其他地址继续运行。调用时,下条指令的地址被压入堆栈,以便返回时将这个地址弹出至PC,使中断的程序继续执行。 两种形式: 无条件调用与返回,有条件调用与返回。 常用指令: CALLD、CALAD、CCD、

5、 RETD、 RCD CALA:Call to accumulator address CC:Conditional call RC:Conditional return,例如(堆栈设置后) CALL pmad ;(SP)-1SP,(PC)+2TOS, pmadPC RET ;(TOS)PC, (SP)+1SP 堆栈: 16位堆栈指针(SP)寻址的软件堆栈。 堆栈是一个特殊的存储区域,遵循先进后出的原则,当向堆栈中压入数据时,堆栈从高地址向低地址增长,堆栈指针SP始终指向栈顶。 堆栈用法: 压入操作:SP先减1,然后再将数据压入栈顶。 弹出操作:数据弹出后,再将SP加1。,堆栈设置: size

6、.set100 stack.usect“STK”, size ;自定义一个名为STK的保留空间,共100个单元 STM #stack+size, SP ;将这个保留空间的高地址+1(#stack+size)赋给SP,作为栈底。,3. 重复操作( 3条指令) RPT(重复下条指令)、 RPTZ(累加器清0并重复下条指令) RPTB(块重复指令)。 (1) 重复执行单条指令 含义:RPT或RPTZ允许重复执行紧随其后的那一条指令。 重复次数:如重复执行n次,则重复指令中计数值为n1。 说明:与BANZ指令进行循环相比,效率要高得多。 特别是对于那些乘法累加和数据传送的多周期指令(如MAC、MVDK

7、、MVDP和MVPD等),在执行一次之后就变成了单周期指令,大大提高了运行速度。,【例4.13】 对数组进行初始化。x5=0,0,0,0,0 主要程序(部分)如下: .bss 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+,(2) 块程序重复操作RPTB 含义:RPTB将重复操作的范围扩大到任意长度的循环回路。 重复次数:先加载到块重复计数器(BRC)。 循环开始地址(RSA):是RPTB指令的下一行; 结束地址(REA):由RPTB指令的操作数规定。

8、特点: 对任意长的程序段的循环开销为0; 其本身是一条2字4周期指令; RPT指令一旦执行,不会停止操作,即使有中断请求也不响应;而RPTB指令是可以响应中断的。,【例4.14】 对数组x5中的每个元素加1。 .bss x, 5 begin: LD #1, 16, B STM #4,BRC ;BRC赋值为4 STM #x,AR4 RPTB next-1 ;next-1为循环结束地址 ADD *AR4,16,B,A STH A,*AR4+ next: LD #0, B 用next1作为结束地址是恰当的。如果用循环回路中最后一条指令(STH指令)的标号作为结束地址,若最后一条指令是单字指令也可以,

9、若是双字指令,就不对了。,(3) 循环的嵌套(三重循环嵌套、开销-p116),问题:外层循环为何不采用RPTB实现?,1st:,1,4.6.2 数据块传送程序 共有4种类型(10条指令): (1) 程序存储器数据存储器(MVPD,MVDP)。 (2) 数据存储器数据存储器(MVDK,MVKD,MVDD)。 (3) 数据存储器MMR(MVMD、MVDM,MVMM) (4) 程序存储器(由ACC寻址)数据存储器(READA,WRITA) MVDP Smem, pmad MVMD MMR, dmad MVDD Xmem, Ymem MVMM MMRx, MMRy MVDK Smem, dmad RE

10、ADA Smem,这些指令的特点如下: 传送速度比加载和存储指令要快; 传送数据不需要通过累加器; 可以寻址程序存储器; 与RPT相结合时,都变成单周期指令,可以实现数据块传送。,【例4.15】 编写一段程序,首先对数组x20赋值,再将数据存储器中的数组x20复制到数组y20。 .title“exp15.asm” .mmregs STACK .usect “STACK”, 30h .bss x, 20 .bss y, 20 .data table: .word 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 .defstart .text,

11、Start: STM #x, AR1 RPT#19 MVPD table, *AR1+; 从程序存储器传送到数据存储器 ; 程序存储器指针自动下移 STM #x, AR2 STM #y, AR3 RPT #19 MVDD *AR2+, *AR3+ ; 从数据存储器传送到数据存储器 end: B end .end,MVDD Xmem, Ymem 注意:双操作数指令只能用辅助寄存器AR2AR5进行间接寻址获得操作数,/ exp15.cmd*/链接命令 vectors.obj exp15.obj -o exp15.out -m exp15.map -e start MEMORY PAGE 0: EP

12、ROM:org=0E000hlen=01F80h VECS:org=0FF80hlen=00080h PAGE 1: SPRAM:org=00060hlen=00030h DARAM:org=00090hlen=01380h ,SECTIONS .vectors:VECSPAGE 0 .data: EPROMPAGE 0 .text: EPROMPAGE 0 .bss: SPRAMPAGE 1 .STACK: DARAMPAGE 1 实现20个数据先从EPROM的0E000Hh0E013h传送到数据存储器SPRAM的0060h0073h单元,实现数据的初始化,再从0060h0073h单元传送到

13、0074h0087h单元,实现数据搬移,其示意图如图4.7所示。注意,实际看到的是十六进制数。,4.6.3 算术运算类程序 单字运算(16位) 长字运算(32位) 小数运算 浮点运算 双操作数乘法 DSP表示整数时,分为有符号数和无符号数两种格式。 DSP表示小数时,其符号和上面整数的表示一样,但是必须注意如何安排小数点的位置。,单字运算 【例4.16】 试编一程序,计算 的值,并找出4项乘积 (i=1,2,3,4)中的最大值,放入累加器A中。 .title“exp16.asm” .mmregs STACK .usect “STACK”, 10h ;堆栈的设置 .bss a, 4 ;为变量分配

14、10个字的存储空间 .bss x, 4 .bss y1, 1 .bss y2, 1 .def start .data table: .word 1, 5, 3, 4 .word 8, 6, 7, 2 .text,start: STM #0, SWWSR ;插入个等待状态 STM #STACK+10h,SP ;设置堆栈指针 STM #a, AR1 RPT #7 MVPD table, *AR1+ CALL SUM ;调用乘累加子程序 CALL MAX ;调用求最大值子程序 end: B end SUM: STM#a, AR3 STM#x, AR4 RPTZA, #3 MAC*AR3+, *AR4

15、+, A STLA, y1 ;变量y1存放乘累加的值 RET,MAX: STM #a, AR1 STM #x, AR2 STM #2,AR3 LD *AR1+, T MPY *AR2+, A ;第一个乘积在累加器A中 Loop: LD *AR1+, T MPY *AR2+, B ;其他乘积在累加器B中 MAX A ;累加器A和B比较,选大的存在A中 BANZ loop, *AR3- ;此循环中共进行3次乘法和比较 STL A, y2 ;变量y2存放的最大值 RET .end,2. 长字运算 可以利用长操作数(32位)进行长字运算。 长字指令如下: 长字运算指令DADD、DSUB、DRSUB等

16、(见表3.10P69); (2) 长字存储和装入指令DST、DLD (见表3.20、3.21P79-80)。 除DST指令(存储32位数要用E总线2次,需要2个机器周期)外,其余都是单字单周期指令,也就是在单个周期内同时利用C总线和D总线,得到32位操作数。,32位乘法运算:只能利用16位乘法指令完成。 X1 X0 S U *Y1 Y0 *S U - X0 *Y0 U * U Y1 *X0 S * U X1 *Y0 S * U Y1 *X1 S * S - W3 W2 W1 W0 S U U U 3条乘法指令: UU: MPYU Smem, dst; dst=U (T)*U(Smem) SU:

17、 MACSU Xmem, Ymem, Src; Src= U(Xmem)* S(Ymem)+Src SS: MAC Xmem, Ymem,Src ; Src=S(Xmem)*S(Ymem)+Src,【例4.18】 编写计算W64=X32Y32的程序。 .title“exp18.asm” .mmregs STACK.usect“STACK”,10H .bss x, 2 ;32位占2字空间 .bss y, 2 ;32位占2字空间 .bss w0, 1 .bss w1, 1 .bss w2, 1 .bss w3, 1 .def start .data table: .word 10h, 20h, 3

18、0h, 40h .text,start:STM #0, SWWSR STM #STACK+10H, SP STM #x, AR1 RPT #3 MVPD table, *AR1+ ;初始化x,y STM #x, AR2 STM #y, AR3 LD *AR2,T ;T=x0 MPYU *AR3+, A ;A=x0y0 (UU) STL A,w0 ;w0=(x0y0低16位),LD A, -16,A ;A右移16位,A高位A低位 MACSU *AR2+, *AR3-, A ;A+=y1x0(SU) MACSU *AR3+, *AR2, A ;A+=x1y0(SU) STL A, w1 ;w1=A

19、 LD A, -16, A ;A右移16位,A高位A低位 MAC *AR3,*AR2, A ;A+=x1y1(SS) STL A, w2 ;w2=A的低16位 STH A, w3 ;w3=A的高16位 End: B end .end,结果W1=0A00h,编写计算W64=X32Y32的程序 给程序设置新的测试数据: .word 0 x1170,0 x0001,0 xFFFD,0 xFFFF ; x=7000,y=-3 执行结果: W3=FFFF,W2=FFFF,W1=FFFC,W0=CBB0 FFFF,FFFF,FFFC,CBB0是-21000的补码表示 测试结果: 乘数:S U 、结果: S

20、 U U U规定为32bit,64bit整数的补码表示,3. 小数运算 两个16位整数相乘:乘积总是“向左增长”。这意味着多次相乘后乘积将会很快超出定点器件的数据范围。 两个小数相乘:乘积总是“向右增长”。这就意味着超出定点器件数据范围的将是不太感兴趣的部分。,1) 小数的表示方法 采用2的补码表示小数:最高位为符号位,数值范围从1+1(Q15格式)。 MSB LSB 0/1(符号位) . 2-1 2-2 2-15,如: 0100,0000,0000,0000B=4000H=0.5 0110,0000,0000,0000B=6000H=0.75,十进制小数的2的补码表示:由十进制小数乘以327

21、68后,再将其整数部分转换成十六进制。 如: -0.5:|-0.5|32768 再求反+1 |-0.5|32768 =0100,0000,0000,0000 1011,1111,1111,1111 + 1 - 1100,0000,0000,0000,汇编语言程序中,十进制小数的表示: 小数0.123.Word 32768*123/1000,例:0.5*-0.375 0.5=0100B -0.375=(0011B)+1=1100+1=1101B 0100 1101 - 0100 0000 0100 1100 - 1110100 (-0.1875的补码),-0.1875 =(00011B+1) =

22、11100+1 =11101,这个结果送入累加器前,必须进行符号位扩展,结果为: 11110100,2) 小数乘法中的冗余符号位 问题:两个带符号小数相乘,将出现得到的积带有两位符号位。 解决冗余符号位的办法:在程序中设定状态寄存器ST1中的FRCT(小数方式)位为1,在乘法器将结果传送至累加器时就能自动地左移1位,消去了两个带符号数相乘时产生的冗余符号位。 小数乘法编程时:应当先设置FRCT位: SSBX FRCT MPY *AR2,*AR3,A STH A, Z,【例4.19】 编制计算 的程序段,其中数据均为小数。 .title“exp19.asm” .mmregs STACK .use

23、ct “STACK”,10H .bss a, 4 .bss x, 4 .bss y, 1 .data table: .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,start: SSBX FRCT;小数方式位FRCT1, 结果自动左移1位 STM #a, AR1 RPT #7 MVPD table, *AR1+ ;初始化ai,xi STM #x, AR2 STM #a

24、, AR3 RPTZ A, #3 MAC *AR2+, *AR3+, A STH A, y ;乘积向右增长,丢弃低16位乘积结果 end: B end .end 计算结果为y=1eb7h=0.24。,4. 双操作数乘法 含义:允许在一个机器周期内通过两个16位数据总线(C总线和D总线)寻址两个数据和系数,图4.9。 特点: 用间接寻址方式获得操作数,且辅助寄存器只能用AR2AR5 寻址方式:*ARn、*ARn+、*ARn-、*ARn+0%。 比较p57,62指令码格式 (2) 占用的程序空间小。 (3) 运行的速度快。 双操作数MAC形式的指令有4种,表4-7p126。,【例4.21】 求解

25、的程序段p127。 程序(部分)如下: STM#a, AR2 STM#x, AR3 RPTZ A,#19;1个机器周期 MAC *AR2+, *AR3+,A;1个机器周期 STH A,y STL A,y+1 效果:单操作数需3NT+1 (例4.20) 双操作数需2NT+4+1(例4.20) 使用MAC 的双操作数只需要(N+1)T(例4.21 ),5. 浮点运算 1) 浮点数的表示方法 浮点数由尾数和指数两部分组成. 定点数=尾数2(指数) 浮点数的尾数和指数可正可负,均用补码表示。 指数的范围从831。 例如,定点数0 x2000(0.25)用浮点数表示时, 尾数为0 x4000(0.5),

26、指数为1, 即 0.25=0.521,2) 定点数转换为浮点数(3条指令) EXP src 功能:提取指数。计算src的指数值并存放于T寄存器中。 指数值通过计算src的冗余符号位数并减8得到,冗余符号位数等于去掉40位src中除符号位以外的有效位所需左移的位数。累加器src中的内容不变。指数的数值范围是831。 例如: EXP A,0CH=1100B,所以累加器A中左端有8*4+2=34位为1,去除1位符号位,冗余符号位=33,指数=33-8=25=0019H, ST T,EXPONENT 将保存在T寄存器中的指数存放到数据存储器的指定单元中。 NORM src ,dst 将src中有符号数左移TS位,结果存放在dst中得到尾数。 该指令常与EXP指令结合使用,完成归一化处理。 例如: NORM A,3) 浮点数转换为定点数: 按指数值将尾数右移(指数为负时是左移),【例4.22】 编写浮点乘法程序,完成x1x20.3(0.8)的运算。要求包括将定点数转换成浮点数、浮点乘法,最后再将浮点数转换成定点数。 程序中保留10个数据存储单元: x1(被乘数) el(被乘数的指数) m1(被乘数的尾数) x2(乘数) e2(乘数的指数) m2(乘数的尾数) product(乘积) ep(乘积的指数) mp(乘积的尾数) temp(暂存单

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论