部分汇编语言程序设计.ppt_第1页
部分汇编语言程序设计.ppt_第2页
部分汇编语言程序设计.ppt_第3页
部分汇编语言程序设计.ppt_第4页
部分汇编语言程序设计.ppt_第5页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

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

文档简介

1,数字信号处理器 Digital Signal Processor 第六部分 汇编语言程序设计,纪震博士Dr.Ji Zhen Shenzhen Univ.-Texas Instruments DSPs Lab 2003.01,Dr. JI ZHEN,2,C54x汇编语言程序设计的基本方法 (1)程序的控制与转移 (2)堆栈的使用方法 (3)加、减法和乘法运算 (4)重复操作 (5)数据块传送 (6)双操作数乘法 (7)长字运算和并行运算 (8)小数运算 (9)除法运算 (10)浮点运算,Dr. JI ZHEN,3,1 程序的控制与转换,基本的程序控制指令,Dr. JI ZHEN,4,1 程序的控制与转换,条件算符,组间条件只能“或” 第一组两类条件可以“与”/“或”,但累加器必须是同一个 第二组三类条件可以各选一个条件“与”/“或” 同组同类条件不能选择两个,Dr. JI ZHEN,5,1 程序的控制与转换,例1,RC TC ;TC=1返回,TC=0继续 CC sub, BNEQ ;B0,调用sub,B=0继续 BC new, AGT, AOV ;A0且溢出(“与”的关系),转new,否则继续,若例1中两个条件相“或”怎么办?,分写成两条指令: BC new, AGT BC new, AOV,Dr. JI ZHEN,6,1 程序的控制与转换,计算y=xi (i=1,2,5) ,主要程序如下: .bss x, 5 .bss y, 1 STM #x, AR1 STM #4, AR2 LD #0, A loop: ADD *AR1+, A BANZ loop,*AR2- STL A, y,利用BANZ指令进行循环操作,Dr. JI ZHEN,7,1 程序的控制与转换,指定的ARn寄存器(n=17)与AR0比较,测试条件成立TC置1 STM #5, AR1 STM #10, AR0 loop: MAR *AR1+ CMPR LT, AR1 BC loop, TC,利用CMPR指令进行比较操作,Dr. JI ZHEN,8,2 堆栈的使用方法,堆栈的设置: size .set 100 stack .usect “STK“, size STM #stack+size, SP 堆栈用法: CALL PC+1(N)放入堆栈,SP-1SP RET 弹出PC,SP+1 SP 注意:在链接命令文件中要为堆栈区定位,例如 STK: DARAM PAGE 1 见EXAMPLE.ASM和EXAMPLE.CMD,Dr. JI ZHEN,9,链接命令文件 example.cmd,vectors.obj example.obj -o example.out -m example.map -e start MEMORY PAGE 0: EPROM:org=0E000h,len=100h VECS: org=0FF80h,len=80h PAGE 1: SPRAM: org=0060h,len=20h DARAM:org=0080h,len=100h ,Dr. JI ZHEN,10,链接命令文件 example.cmd(续),SECTIONS .text:EPROM PAGE 0 .bss:SPRAM PAGE 1 .data:DARAM PAGE 1 STACK:DARAM PAGE 1 Vectors:VECS PAGE 0 ,Dr. JI ZHEN,11,example.asm程序清单,* * example.asm y= a1*x1+a2*x2+a3*x3+a4*x4 * * .title “ example.asm“ STACK usect “STACK“, 10h ;allocate space for stack .bss x,4 ;allocate 9 word for variables .bss a,4 .bss y,1 .def start .data table: .word 1,2,3,4 ;data follows . .word 8,6,4,2,Dr. JI ZHEN,12,example.asm程序清单(续),.text ;code follows . start: STM #STACK+10h, SP ;set stack pointer STM #table,AR1 ;AR1 point to table STM #x,AR2 ;AR2 point to x STM #7,AR0 LD #0,A loop: LD *AR1+,A ;move 8 values STL A,*AR2+ ;from program memory BANZ loop,*AR0- ;into data memory CALL SUM ;call SUM subroutine end: B end,Dr. JI ZHEN,13,example.asm程序清单(续),.SUM: STM #a, AR3 ;The subroutine ; implement STM #x, AR4 ;multiply- ;accumulate RPTZ A, #3 MAC *AR3+, *AR4+, A STL A, y RET .end,Dr. JI ZHEN,14,3 加、减法和乘法运算,例: z=x+y-w LD x, A ADD y, A SUB w, A STL A, z 例: y=mx+b LD m, T MPY x, A ADD b, A STL A, y,Dr. JI ZHEN,15,3 加、减法和乘法运算,例: y=x1*a1+x2*a2 LD x1, T MPY a1, B LD X2, T MAC a2, B STL B, y STH B, y+1,Dr. JI ZHEN,16,3 加、减法和乘法运算,例: 例8 在表31的4项乘积 aixi (i=1,2,3,4) 中 找出最大值,并放在累加器A中 STM #a, AR1 STM #x, AR2 STM #2, AR3 LD *AR1+, T MPY *AR2+, A ;第一个乘积在累加器A中 loop1:LD *AR1+, T MPY *AR2+, B ;其它乘积在累加器B中 MAX A ;累加器A和B比较,选大的存在A中 BANZ loop1, *AR3- ;此循环中进行3次乘法和比较,Dr. JI ZHEN,17,4 重复操作,C54x有3条重复操作指令: RPT(重复下一条指令) RPTZ(累加器清0并执行下一条指令) RPTB(程序块重复指令) 利用这些指令进行循环,比BANZ指令快,Dr. JI ZHEN,18,4.1 重复执行单条指令,例: 对一个数组进行初始化: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+,Dr. JI ZHEN,19,4.1 关于重复单条指令,重复指令只需取指一次,进行循环比BANZ效率高 重复执行n次,指令中计数值设为n-1 重复操作使多周期指令(MAC、MVDK和MVPD等)变成单周期指令 重复操作期间,CPU不响应中断(RS除外),Dr. JI ZHEN,20,4.2 程序块重复操作,程序块重复操作指令RPTB将重复操作的范围扩大到任意长度的循环路,循环开销为0 循环起始地址为下一行的地址 块重复操作前,必须先将迭代次数加载到BRC(块重复计数器) RPTB指令可以响应中断,Dr. JI ZHEN,21,4.2 程序块重复操作举例,例: .bss x, 5 begin: LD #1, 16, B STM #4, BRC ; BRC 4 RPTB next-1 ; next-1为循环结束地址 ADD *AR4, 16, B, A STH A, *AR4+ Next: LD #0, B ,Dr. JI ZHEN,22,4.2 三重循环嵌套结构举例,Dr. JI ZHEN,23,4.2 三重循环的开销,Dr. JI ZHEN,24,5 数据块传送,C54x有10条数据传送指令(见下页中的表), 这些指令的特点如下: 传送速度比加载和存储指令要快; 传送数据不需要通过累加器; 可以寻址程序存储器; 与RPT指令相结合(重复时,这些指令都变成单周期指令),可以实现数据块传送。,Dr. JI ZHEN,25,5.1 数据传送指令,Dr. JI ZHEN,26,5.2 程序存储器数据存储器,例: 数组x5=1,2,3,4,5初始化。 程序存储器 .data TBL: .word 1,2,3,4,5 .sect “.vectors” B START .bss x,5 .text START: STM #x,AR5 RPT #4 MVPD TBL,*AR5+ ,data PM bss DM,Dr. JI ZHEN,27,5.2 数据存储器数据存储器,例:编写一段程序将数据存储器中的数组x20复制到数组y20 .bss x,20 .bss y,20 .text LD #x,AR2 LD #y,AR3 RPT #19 MVDD *AR2+, *AR3+ ,Dr. JI ZHEN,28,6 双操作数乘法,单周期内通过C总线和D总线寻址两个数据 用间接寻址方式获得操作数,且只能用AR2AR5 占用的程序空间小 运行的速度快,Dr. JI ZHEN,29,6.1 MAC型双操作数指令,Dr. JI ZHEN,30,6.2 单、双操作数乘法的区别,如果要求y=mx+b,单操作数方法和双操作数方法分别为:,如用双操作数指令编程的特点为: 用间接寻址方式获得操作数,且只能用AR2AR5; 占用的程序空间小; 运行的速度快。,Dr. JI ZHEN,31,6.3 双操作数乘法(例),编制求乘法累加和的程序段,Dr. JI ZHEN,32,6.3 双操作数乘法(例),Dr. JI ZHEN,33,7.长字运算,c54x可以利用长操作数(32位)进行长字运算。长字指令如: DLD Lmem,dst ;dst= Lmem DST src,Lmem ;Lmem = src DADD Lmem ,src,dst ;dst= src+Lmem DSUB Lmem ,src,dst ;dst= src-Lmem DRSUB Lmem ,src,dst ;dst= Lmem -src,Dr. JI ZHEN,34,7.长字运算,长操作数在存储器的排列方法 偶地址排列法 奇地址排列法 长操作数地址排列法 指令中给出的地址为偶地址 存储器中低地址存放高16位 存储器中高地址存放底16位,Dr. JI ZHEN,35,偶地址排列法举例 DLD *AR3+, A 执行前: 执行后: A=00 0000 0000 A=00 6CAC BD90 AR3=0100 AR3=0102 (0100h)=6CAC(高字)(0100h)=6CAC (0101h)=BD90(低字)(0101h)=BD90,7.1 长操作数在存储器的排列方法,奇地址排列法举例 DLD *AR3+, A 执行前: 执行后: A=00 0000 0000 A=00 BD90 6CAC AR3=0101 AR3=0103 (0100h)=6CAC(低字)(0100h)=6CAC (0101h)=BD90(高字)(0101h)=BD90,Dr. JI ZHEN,36,7.2 长字运算(例),例: 计算 Z32=X32+Y32 标准运算 长字运算 LD xhi, 16, A DLD xhi, A ADDS xlo, A DADD yhi, A ADD yhi, 16, A DST A, zhi ADDS ylo, A (3个字,3个T) STH A, zhi STL A, zlo (6个字,6个T),符号位不扩展的加法,Dr. JI ZHEN,37,8. 并行运算(例),同时利用D总线和E总线 4种并行运算指令: 并行加载和乘法指令 并行加载和存储指令 并行存储和乘法指令 并行存储和加/减法指令,Dr. JI ZHEN,38,8.1 并行运算(例),例: 编写计算 z=x+y 和 f=e+d 程序段 .bss x, 3 .bss d, 3 STM #x, AR5 STM #d, AR2 LD #0, ASM LD *AR5+, 16, A ADD *AR5+, 16, A ST A, *AR5 |LD *AR2+, B ADD *AR2+, 16, B STH B, *AR2,Dr. JI ZHEN,39,8.2 64位加/减法运算,例:编写计算 Z64=W64+X64-Y64 的程序段 W, X, Y和结果Z都是64位数,它们都是由两个32位的长字组成。利用长字指令可以完成64位数的加/减法。 DLD w1, A ;A=w1w0 DADD x1, A ;A=w1w0+x1x0, 产生进位C DLD w3, B ;B=w3w2 ADDC x2, B ;B=w3w2+x2+C ADD x3, 16, B ;B=w3w2+16x3 DSUB y1, A ;A=w1w0+x1x0-y1y0, 产生借位C DST A, z1 ;z1z0=w1w0+x1x0-y1y0 SUBB y2, B ;B=w3w2+x3x2+C-y2-C SUB y3, 16, B ;B=w3w2+x3x2+C-y3y2-C DST B, z3 ;z3z2=w3w2+x3x2+C-y3y2-C 由于没有长字带进(借)位加/减法指令,上述程序中只能用16位带进(借)位指令ADDC和SUBB。,Dr. JI ZHEN,40,8.3 32位乘法运算,Dr. JI ZHEN,41,8.3 32位乘法运算,例:编写计算 W32=X32*Y32 的程序段 W, X, Y和结果Z都是64位数,它们都是由两个32位的长字组成。利用长字指令可以完成64位数的加/减法。 STM #x0, AR2 STM #y0, AR3 LD *AR2, T ;T=x0 MPYU *AR3+, A ;A=u(x0)*u(y0) STL A, w0 ;w0=u(x0)*u(y0) LD A, -16, A ;A=A16 MACSU *AR2+, *AR3-, A ;A+=s(y1)*u(x0) MACSU *AR3+, *AR2, A ;A+=s(x1)*u(y0) STL A, w1 ;w1=A LD A, -16, A ;A=A16 MAC *AR2, *AR3, A ;A+=s(x1)*s(y1) STL A, w2 ;w2=A的底16位 STH A, w3 ;w3=A的高16位,Dr. JI ZHEN,42,8.3 32位乘法运算(续),程序中利用的两条乘法指令 MACSU Xmem, Ymem, src ;带符号数与无符号数相乘并累加 ;src= S(Xmem)*U(Ymem)+src MAC Xmem, Ymem, src ;带符号数与带符号数相乘并累加 ;src=S(Xmem)*S(Ymem)+src MPYU Smem, dst ;无符号数相乘 ;dst=U(T)*U(Smem),Dr. JI ZHEN,43,8 小数运算,整数相乘,“向左增长”的缺陷 开销2个机器周期 占用2个字的程序和RAM单元 难以递推运算,小数相乘,“向右增长” 保存高16位乘积,占用较少资源 便于递推运算,Dr. JI ZHEN,44,8.1 小数的表示方法,C54x采用2的补码小数 高位为符号位 数值范围从-1到+1(1-2-15=0.999969482421875) 16位2的补码小数(Q15格式)每个的权值为: MSB LSB -1(0). 1/2 1/4 1/8 2-15,Dr. JI ZHEN,45,8.2 十进制小数十六进制小数,1-2-15 7FFFh 0.5 正数:乘以32768 4000h 0 0000h -0.5 负数:其正数部分 乘以32768, 再取反加1 C000h -1 8000h,Dr. JI ZHEN,46,8.3 汇编语言程序中小数的写法,不能直接写入十进制小数。 举例:定义一个系数0.707 .word 32768*707/1000,Dr. JI ZHEN,47,8.4 小数乘法与冗余符号位,Dr. JI ZHEN,48,8.4 小数乘法与冗余符号位(续),T位乘积送累加器时,符号位扩展,得到 11110100 (-0.09375) 结果错误,原因是出现了冗余符号位。,解决冗余符号位办法 将ST1中FRCT(小数方式)位置1(乘积传送累加器时自动地左移一位),Dr. JI ZHEN,49,8.5 小数乘法编程,SSBX FRCT MPY *AR2, *AR3, A STH A, z,Dr. JI ZHEN,50,8.5 小数乘法编程,编写计算的程序段。其中数据均为小数 a1=0.1 a2=0.2 a3=-0.3 a4=0.4 x1=0.8 x2=0.5 x3=-0.4 x4=-0.2 .bss x,4 .bss a,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 5*32768/10 .word -4*32768/10 .word -2*32768/10,Dr. JI ZHEN,51,8.5 小数乘法编程(续),.text start: SSBX FRCT STM #x, AR1 RPT #7 MVPD table, *AR1+ STM #x, AR2 STM #a, AR3 RPTZ A, #3 MAC *AR2+, *AR3+, A STH A, *(y) done: B done,Dr. JI ZHEN,52,9 除法运算,一般DSP芯片中,没有除法硬件 C54x有一条SUBC指令支持16位除法 SUBC Smem, src ;(src)-(Smem)15ALU输出端 ;如果ALU输出端0,则(ALU输出端) ;1+1src,否则(src)1+0 src SUBC指令加上重复指令,实现无符号除法运算,Dr. JI ZHEN,53,0.4/(-0.8) 3333h/999Ah 0.4/0.8 3333h/6666h 3333h 16ACC,9.1 长除数法,Dr. JI ZHEN,54,编写0.4/(-0.8)的程序段 .bss num(分子、被除数), 1 .bss den (分母、除数), 1 .bss quot(商), 1 table: .word 4*32768/10 ;0.4 .word 8*32768/10 ;-0.8 .text start: STM #num, AR1 RPT #1 MVPD table, *AR1+ ;传送2个数据至分子,分母单元 LD den, 16, A ;将分母移到累加器A(31-16),9.1.1 |被除数|除数|,商为小数,Dr. JI ZHEN,55,9.1.1 |被除数|除数|,商为小数(续),.bss num(分子、被除数), 1 MPY A num ;(num)*(A(31-16)B, ;获取商的符号(在累加器B中) ABS A ;分母取绝对值 STH A, den ;分母绝对值存回原处 LD num, 16,A ;分子A(31-16) ABS A ;分子取绝对值 RPT #14 ;15次减法循环,完成除法 SUBC den, A XC 1, BLT ;如果B0(商是负数), ;则需要变号 NEG A STL A, quot ;保留商,Dr. JI ZHEN,56,9.1.1 除数结果,被除数 4*32768/(0.4) -128 除数 -8*32768/10(-0.8) 1024 商(十六进制) 0xc000 0xf000 商(十进制) -0.5 -0.125,Dr. JI ZHEN,57,9.1.2 |被除数|除数|,商为整数,例:编写16384/512的程序段。 本程序段可在上个程序段的基础上修改。除输入数据外,仅有两处改动: LD num, 16, A 改成 LD num,A RPT #14 改成 RPT #15 其它不变。 本程序运行结果如下: 被除数 除数 商(十六进制) 商(十进制) 16384 512 0x0020 32 66*32768/100(0.66) 33*32768/100(-0.33) 0xfffe -2,Dr. JI ZHEN,58,9.1.3 关于除法操作的说明,SUBC指令仅对无符号数进行操作 除法运算必须对被除数和除数取绝对值 利用乘法操作,获取商的符号,最后通过条件执行给商加上适当的符号,Dr. JI ZHEN,59,10 浮点运算,浮点运算可以扩大数据的动态范围和运算精度 C54x定点DSP支持浮点运算 C54x中浮点数的表示方法 定点数=尾数*2 指数 例如:定点数 0x2000 (0.25) 浮点数 尾数 0x4000 (0.25) 指数 1 浮点数的尾数可正可负。表示数的符号 浮点数的指数范围:(831),指数表示定点数规格化的左移(负指数为右移)的位数。,Dr. JI ZHEN,60,10.1 定点浮点数,54x通过3条指令就可以将一个定点数 (假设定点数已在累加器A中) 1. EXP A。这是一条提取指数的指令,指数保存在T寄存器中。如果(累加器A)=0,0T;否则,累加器A的冗余符号位数8T。累加器A中的内容不变。指数的数值范围:831。,Dr. JI ZHEN,61,10.1 定点浮点数(例),例: EXP A 执行前 执行后 A=FF FFFF FFCB A=FF FFFF FFCB T= 0000 T= 0019(25),例: EXP B 执行前 执行后 B=07 8543 2105 B=07 8543 2105 T= 0007 T= FFFC(-4),Dr. JI ZHEN,62,10.1 定点浮点数,2.ST T, EXPONENT;这条紧接在EXP后的指令是将保存在T寄存器中的指数存放到数据存储器的指定单元中。 3.NORM A;这是一条按T寄存器中的内容对累加器A进行规格化处理(左移或右移),即(累加器A)TSA。,Dr. JI ZHEN,63,例: NORM A 执行前 执行后 A=FF FFFF F001 A=FF 8008 0000 T= 0013 T= 0013,例: NORM B, A ;A=NORM(B,TS) 执行前 执行后 A=FF FFFF F001 A=00 4214 1414 B=21 0A0A 0A0A B=21 0A0A 0A0A T= 0FFF9 T= 0FFF9,10.1 定点浮点数(例),Dr. JI ZHEN,64,10.2 规格化注意事项,NORM指令不能紧跟EXP指令; 因为NORM指令需要T的值时,EXP指令还没有取得T的值;若紧随其后执行只能按原来的T值移位。,Dr. JI ZHEN,65,10.3 浮点数定点数,浮点数的指令是规格化时左移(负指数时右移)的位数 浮点数定点数,只要按指数数值将尾数右移(负指数是左移)就行了,例:编写浮点乘法程序,完成x1*x2=0.3*(-0.8)运算。 程序中保留10个数据存储单元: x1(被乘数) m2(乘数的尾数) x2(乘数) ep(乘积的指数) e1(被乘数的指数) mp(乘积的尾数) m1(被乘数的尾数) product(乘积) e2(乘数的指数

温馨提示

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

评论

0/150

提交评论