




已阅读5页,还剩91页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第五章 TMS320C54x汇编语言程序设计 一、概述 二、堆栈的使用方法 三、控制程序 四、算术运算程序 五、重复操作程序 六、数据块传送程序 七、小数运算程序 八、浮点运算程序 1 一、概述 汇编语言程序设计作为 DSP 应用软件设计的基 础,其主要任务是利用汇编指令和伪指令编写源程序 以完成指定的功能。 虽然C语言程序设计具有不依赖或较少依赖具体 硬件且为大家所熟悉,因而可以大大缩短软件开发和 升级DSP产品的周期。但在DSP芯片的资源和运算能 力非常紧张的情况下,采用汇编语言进行DSP应用程 序开发是最合适的。 2 汇编语言源程序的句法格式 汇编汇编 源程序以.asm为扩为扩 展名,每行由4个部分组组成 标号: 助记符 操作数 ;注释 供本程序的其它部分或其 它程序调用。标号是任选 项,标号后面可以加也可 以不加冒号“:” 3 标号: 助记符 操作数 ;注释 可以是助记符指令、 汇编伪指令、宏指令 和宏调用指令。 1.助记记符指令,一般用大写; 2.汇编伪汇编伪 命令和宏命令,以句号“.” 开始,且通常用小写。 4 1.指令中的操作数 或汇编命令中定义 的内容 2.操作数之间必须 用逗号“,”分开 。 1.从分号“;”开 始 2.可以放在指令或 汇编命令后面,也 可以放在单独的一 行或数行。 标号: 助记符 操作数 ;注释 5 汇编语言源程序的数据型式 二进制:如1110001b或1111001B; 八进制:226q或572Q; 十进制:1234或+1234或-1234(缺省型) 十六进制:0A40h或0A40H或0xA40 浮点数:1.623e-23 字符常数:D 字符串:“this is a string” 6 汇编语汇编语 言源程序要素 汇编命令 助记符指令 宏命令 汇编汇编 程序(汇编汇编 器)功能: 将源程序汇编成可重定位的目标文件(.obj文件); 如果需要,可以生成一个列表文件(.lst文件); 将程序代码分段,每段的目标代码都有一个SPC管理; 定义和引用全局符号,可在列表后附加交叉引用表; 对条件程序块进行汇编; 支持宏功能,允许定义宏命令。 7 运行汇编程序 asm500 input fileobject filelisting file-options 汇编汇编 器是名为为asm500.exe的可执执行程 序 例如 asm500 cjy.asm -l -s -x 源程序cjy.asm经汇编后将生成一个cjy. obj目 标标文件、列表文件、符号表(在目标文件中)以及 交叉引用表(在列表文件中)。 8 例 编写计算y=a1*x1+a2*x2+a3*x3+a4*x4的汇编源程序 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * example.asm y=a1*x1+a2*x2+a3*x3+a4*x4 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 1 .title “example.asm” ;为汇编源程序取名 2 .mmregs ;定义存储器映象寄存器 3 STACK .usect “STACK”,10h ;分配10个单元的堆栈空间 4 .bss a,4 ;为系数a分配4个单元的空间 5 .bss x,4 ;为变量x分配4个单元的空间 6 .bss y,1 ;为结果y 分配1个单元的空间 7 .def _c_int00 ;定义标号_c_int00 8 9 .data ;定义数据代码段 10 table: .word 1,2,3,4 ;在标号table开始的8个单元 11 .word 8,6,4,2 ;为这8个单元赋初值 9 12 .text ;定义文本代码段 13 _c_int00 :STM #0,SWWSR ;软件等待状态R置0,不设等待 14 STM #STACK+10h,SP ;设置堆栈指针初值 15 STM #a,AR1 ;AR1 指向 a的地址 16 RPT #7 ;从程序存储器向数据存储器 17 MVPD table,*AR1+ ;重复传送 8个数据 16 CALL SUM ;调用 SUM 实现乘累加和的子程序 19 end: B end ;循环等待 20 SUM: STM #a,AR3 ;将系数a的地址赋给AR3 21 STM #x,AR4 ;将变量x的地址赋给AR4 22 RPTZ A,#3 ;将A清0并重复执行下条指令4次 23 MAC *AR3+,*AR4+, A ;执行乘累加,结果放在A中 24 STL A, y ;将A的低字送结果单元y 25 RET ;结束子程序 26 .end ;结束全部程序 10 列表文件 TMS320C54x COFF Assembler Version 3.70 Tue Oct 19 12:42:59 2004 Copyright (c) 1996-2001 Texas Instruments Incorporated example.asm PAGE 1 1 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 2 * example.asm y=a1*x1+a2*x2+a3*x3+a4*x4 * 3 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 5 .mmregs ;定义存储器映象寄存器 6 000000 STACK .usect “STACK“,10h ;分配10个单元的堆栈空间 7 000000 .bss a,4 ;为系数a分配4个单元的空间 8 000004 .bss x,4 ;为变量x分配4个单元的空间 9 000008 .bss y,1 ;为结果y 分配1个单元的空间 10 .global _c_int00 ;定义标号 列表文件中包括源程序语语句和目标标代 码码 11 11 000000 .data ;定义数据代码段 12 000000 0001 table: .word 1,2,3,4 ;在标号table开始的8个单元中 000001 0002 ;为这8个单元赋初值 000002 0003 000003 0004 13 000004 0008 .word 8,6,4,2 000005 0006 000006 0004 000007 0002 14 000000 .text ;定义文本代码段 15 000000 7728 _c_int00 STM #0,SWWSR ;软件等待状态寄存器置0,不设等待 000001 0000 16 000002 7718 STM #STACK+10h,SP ;设置堆栈指针初值 000003 0010- 17 000004 7711 STM #a,AR1 ;AR1 指向 a的地址 000005 0000- 18 000006 EC07 RPT #7 ;从程序存储器向数据存储器 19 000007 7C91 MVPD table,*AR1+ ;重复传送 8个数据 000008 0000“ 源文件的每一行都会在列表文 件中生成一行。包括行号、段 程序计数器SPC的数值、汇编后 的目标代码、源程序语句。 第2字单单独列一行,列出了 SPC的数值值和目标标代码码 12 20 000009 F074 CALL SUM ;调用 SUM 实现乘法累加和的子程序 00000a 000D 21 00000b F073 end: B end ;循环等待 00000c 000B 22 00000d 7713 SUM: STM #a,AR3 ;将系数a的地址赋给AR3 00000e 0000- 23 00000f 7714 STM #x,AR4 ;将变量x的地址赋给AR3 000010 0004- 24 000011 F071 RPTZ A,#3 ;将A清0,并重复执行下条指令4次 000012 0003 25 000013 B09A MAC *AR3+,*AR4+,A ;执行乘法并累加,结果放在A中 26 000014 0008- STL A,y ;将A的低字内容送结果单元y 27 000015 FC00 RET ;结束子程序 28 .end ;结束全部程序 No Assembly Errors, No Assembly Warnings Field 1源程序语句的 行号用十进制数表示 Field 2段程序计计数器(SPC ),用十六进进制数表示 Field 4:源 程序语句 Field 3:目标代码 ! 未定义的外部引用。 .text段重新定位。 ” .data段重新定位。 + .sect段重新定位。 - .bss和.usect段重新定位 13 在运行汇编程序时,还可产生交叉引用清单,清 单包括符号、定义和引用的位置。 交叉引用列表 LABEL VALUE DEFN REF INT0 0002+ 19 1 ISR2 REF 3 21 proc REF 4 28 列出汇编时汇编时 定 义义和引用的每 个符号 列出一个赋给符号 的4位十六进制数 值,或说明符号属 性的字符或名称。 列出引用此符号的语 句的行号。如果此栏 是空格,表示此符号 还没有被引用过。 列出定义符号的 语句编号。如果 此符号未加定义 则此栏是空格 14 REF :外部引用(.globa 段的符号) UNDF:未曾定义过 :在.text段定义的符号。 ” :在.data段定义的符号。 + :在.sect段定义的符号。 - :在.bss或.usect段定义的符号。 交叉引用清单中符号的属性 15 二、堆栈的使用方法 TMS320C54xDSP支持软件堆栈,提供一个16位 堆栈指针(SP)寻址,用户可以在存储区开辟一块区 域作为堆栈存储器使用。使用堆栈时应注意: (1) 如要用堆栈,必须先设置,后使用。 (2) 堆栈从高地址向低地址增长: 压栈时,指针先减 SP-1,再压入数据; 出栈时,先弹出数据后,再SP+1; (3) 在编写链接命令文件(.cmd)中将堆栈段放入内部数 据存储区。 16 例 设计一存储空间为100个单元的堆栈。 Size:.set 100 ;设置空间为100stack stack .usect “STK”,size ;设置堆栈段的首地址 ;和堆栈空间 STM #stack+size,SP ;将栈底地址指针送 ;SP,对其初始化 17 三、控制程序 1分支转移操作 通过分支转移指令改写PC, 可以改变程序的流向。而子 程序调用指令则通过将一个 返回地址压入堆栈,执行返 回时恢复原地址。 可执执行: 分支转转移 循环环控制 子程序调调 用 功能 方法 18 条件分支转移 无条件分支转转移 远远分支转转移 BD用指令中 所给给出的地址 加载载PC BACCD用所 指定的累加器 的低16位作为为 地址加载载PC。 带带延迟迟 不带带延 迟迟 C54xDSP转移种类: BCD如果指 令中所规规定的 条件得到满满足 ,就用指令中 所给给出的地址 加载载PC; BANZD如果 当前辅辅助寄存 器不等于0, 就用指令中所 规规定的地址加 载载PC。 允许许分支 转转移到扩扩 展程序存 储储器 19 n 无延时 在分支指令到达流水线执行阶段时,紧跟在该指 令后面的2条已读入流水线的指令在流水线中被清除, 不执行。 n 带延时 在分支指令到达流水线执行阶段时,紧跟在分支 指令后面的一个2字指令或2个单字指令被执行。 n 远分支转移 远分支转移允许分支转移到扩展存储器。 20 2子程序调用和返回 转转移前,原 程序的下条指 令地址被压压 入堆栈栈,而 在返回时则时则 将该该地址弹弹 出至PC,使被 中断的原程序 能继续执继续执 行 当执执行调调用指 令进进行子程序 或函数调调用时时 ,DSP中断当前 运行的程序, 转转移到程序存 储储器其它地址 继续继续 运行。 功能 方法 无条件调调用与返回 有条件调调用与返回 远调远调 用与远远返回 带带延迟迟 不带带延迟迟 CALLd lop RET main 21 3条件指令中的条件判断 22 多重条件判断 BC pmad,cond,cond,cond相与关系 相或关系BC pmad,cond BC pmad,cond 第1组第2组 A 类B 类A 类B 类C 类 EQOVTCCBIO NEQNOVNTCNCNBIO LT LEQ GT GEQ 23 第1组组 例如 可以从A类类中选选一个条件,同时时 从B类类中选择选择 一个条件。但是不 能从同一类类中选择选择 两个条件。 另外,两种条件测试测试 的累加器必 须须是同一个。 可以同时测试时测试 AGT和AOV,但 不能同时测试时测试 AGT和BGT。 第1组组 24 第2组组 例如 可以同时时在A、B、C三类类 中各选择选择 一个条件,但不 能从同一类类中选择选择 两个条 件 可以选择选择 TC、C和BIO, 但不能同时选择时选择 NTC、C 和NC 25 特 例 如果条件分支转移出去的地方只有12字的 程序段,则可以用一条单周期条件执行指令(XC )来代替分支转移指令: XC n,cond,cond,cond 当n=1,且条件得到满足,就执行紧随此条件指 令后的个字指令。 当n=2,且条件得到满足,就执行紧随此指令后 的1个双字指令或者2条单字指令。 当条件不满足,就依n的值执行1条或2条NOP指令 。 26 1. 加法和减法运算 例 编写求解加、减法的程序,计算z=x+y-w。 SUM1:LD x,A ;将x地址的内容送A ADD y,A ;将y地址的内容与A中x值相加 SUB w,A ;将A中的内容与w 相减,得z STL A,z ;将A的计算值存入z 地址中 四、算术运算程序 27 例 编写求解直线方程的程序,计算y=mx+b。 SUM2:LD m,T ;将m 地址的内容送T MPY x,A ;将x 地址的内容与T中的m相乘, ;结果送A ADD b,A ;将A中的mx与b 地址的内容相加, ;结果送A STL A,y ;将A的计算结果存入y 地址中 28 运行速度快; 用间间接寻寻址方式获获得操作数, 且辅辅助寄存器只用了AR2AR5; 占用程序空间间小; 2双操作数乘法运算 特 点 29 例 编制求解 的程序。 利用双操作数指令可以节省机器周期。迭代次 数越多,节省的机器周期数也越多。本例中,在每 次循环中,双操作数指令都比单操作数指令少用一 个周期,节省的总机器周期数=T*N(迭代次数)。 30 单操作数指令方案 双操作数指令方案 LD #0,B LD #0,B STM #a,AR2 STM #a,AR2 STM #x,AR3 STM #x,AR3 STM #19,BRC STM #19,BRC RPTB done-1 RPTB done-1 LD *AR2+,T ;1T MPY *AR2+,*AR3+,A ;1T MPY *AR3+,A ;1T ADD A,B ;1T ADD A,B ;1T done:STH B,y done:STH B,y STL B,y+1 STL B,y+1 块重复 结束地址 块重复 计数器 31 在单单个周期内同时时利用C总线总线 和D总线总线 , 得到32位的长长字操作数。 使用长操作数指令时,按指令中给出的地 址存取的总是高16位操作数。这样就有两 种数据排列方法。 3长字运算 特 点 32 (1)偶地址排列法 指令中给出的地址为偶地址,存储器中低地址存放高16位 操作数。 如: DLD *AR3+,A ;长字加载累加器A 执行前:A=00 0000 0000 执行后:A=00 6CAC BD90 AR3=0100 AR3=0102 (0100h)=6CAC(高字) (0100h)=6CAC (0101h)=BD90(低字) (0101h)=BD90 33 (2)奇地址排列法 指令中给出的地址为奇地址,存储器中低地址存放低16 位操作数。 如: DLD *AR3+,B ;长字加载累加器B 执行前:B=00 0000 0000 执行后:B=00 BD90 6CAC AR3=0101 AR3=0103 (0100h)=6CAC(低字) (0100h)=6CAC (0101h)=BD90(高字) (0101h)=BD90 34 一般推荐采用偶地址排列法,将高16位操作数放在偶地 址存储单元中。 如:程序存储器 .long 12345678 h ;偶地址:1234 ;奇地址:5678 数据存储器 .bss xhi, 2, 1, 1 ;偶地址:xhi ;奇地址:xlo 变量名称 字长 页邻接 偶地址排列法 35 例 计算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) 36 (1)并行运算指同时时利用D总线总线 和E总线总线 。其中,D 总总 线线用来执执行加载载或算术术运算,E总线总线 用来存 放先前的结结果。 (2)并行指令都是单字单周期指令。 (3)并行运算时所存储的是前面的运算结果,存储 之后再进行加载或算术运算。 (4)并行指令都工作在累加器的高位。 (5)大多数并行运算指令都受累加器移位方式ASM位 影响。 4并行运算 特 点 37 并行指令 指 令指 令举 例操作说明 并行加载和乘法指令 LDMACR LDMASR LD Xmem,dst MACR Ymem,dst dst=Xmem(16-ASM) dst=Xmem(16-ASM) dst=dst+T*Xmem 并行存储和加/减法 指令 STADD STSUB ST src, Ymem ADD Xmem, dst Ymem=src(16-ASM) dst=dst+Xmem 38 例 编写计算z=x+y和f=d+e的程序段。 在此程序段中用到了并行存储/加载指令,即在同一机器周 期内利用E总线存储和D总线加载。数据存储器分配如图。 .title “cjy3.asm” .mmregs STACK .usect “STACK”,10H .bss x,3 ;为第一组变量 ;分配3个存储单元 .bss d,3 ;为第二组变量 ;分配3个存储单元 .def start .data table: .word 0123H,1027H,0,1020H,0345H,0 39 .text start:STM #0,SWWSR STM #STACK+10H,SP STM #x,AR1 RPT #5 MVPD table,*AR1+ STM #x,AR5 ;将第一组变量的首地址传给AR5 STM #d,AR2 ;将第二组变量的首地址传给AR2 LD #0,ASM ;设置ASM=0 LD *AR5+,16,A ;将x的值左移16位放入A的高端字 ADD *AR5+,16,A ;将y值左移16位与A的高端字x相加 ST A,*AR5 ;将A中的和值右移16位存入z中 LD *AR2+,B ;将d的值左移16位放入B的高端字 ADD *AR2+,16,B ;将e值左移16位与B的高端字d相加 STH B,*AR2 ;将B的高端字中的和值存入f中 end: B end .end 40 564位加法和减法运算 例 编写计算Z64=W64+X64-Y64的程序段。 这里的W、X、Y和结果Z都是64位数,它们都由两个32位的 长字组成。利用长字指令可以完成64位数的加/减法。 w3 w2 w1 w0 (W64) + x3 x2 C x1 x0 (X64) 低32位相加产生进位C - y3 y2 C y1 y0 (Y64) 低32位相减产生借位C _ z3 z2 z1 z0 (Z64) 41 DLD w1,A ;A=w1w0 DADD x1,A ;A=w1w0+x1x0 ;低32位加,产生进位C DLD w3,B ;B=w3w2 ADDC x2,B ;B=w3w2+x2+C ;16位带进位加法 ADD x3,16,B ;B=w3w2+x3x2+C DSUB y1,A ;A=w1w0+x1x0-y1y0 ;产生借位C DST A,z1 ;z1z0=w1w0+x1x0-y1y0 :保存低32位结果 SUBB y2,B ;B=w3w2+x3x2+C-y2-C ;16位带借位减法 SUB y3,16,B ;B=w3w2+x3x2+C-y3y2-C DST B,z3 ;z3z2=w3w2+x3x2+C-y3y2-C;保存64位结果 由于没有长字带进(借)位加/减法指令,所以上述程序中只能 用16位带进(借)位指令ADDC和SUBB。 42 6. 32位乘法运算 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 例 编写计算W64=X32*Y32的程序段。 32位乘法算式如下: 43 其中,S为带符号数,U为无符号数。数据存储器分配如图 所示。在32位乘法运算中,实际上包括了三种乘法运算: U*U、S*U和S*S。一般的乘法运算指令都是两个带符号数相 乘,即S*S。 所以,在编程时,要用到以下三条乘法指令: MACSU Xmem,Ymem,src ;无符号数与带符号数相乘并累加 ;src=U(Xmem)* S(Ymem)+src MPYU Smem,dst ;无符号数相乘 ;dst=U()* U(Smem) MAC Xmem,Ymem,src ;两个带符号数相乘并累加 ;src=S(Xmem)* S(Ymem)+src 44 STM #x0,AR2 ;将x的首地址放入AR2 STM #y0,AR3 ;将y的首地址存入AR3 LD *AR2,T ;T=x0 MPYU *AR3+,A ;A=x0*y0 STL A,w0 ;w0=x0*y0 LD A,-16,A ;A=A16 MACSU *AR2+,*AR3-,A ;A+=y1*x0 MACSU *AR3+,*AR2,A ;A+=x1*y0 STL A,w1 ;w1=A LD A,-16,A ;A=A16 MAC *AR2,*AR3,A ;A+=x1*y1 STL A,w2 ;w2=A的低16位 STH A,W3 ;w3=A的高16位 32位乘法的程序段如下: 45 特点2特点1 五、重复操作程序 1. 单指令重复操作 重复执执行(RC)+1 次。RC内容不能编编 程设设置,只能由重 复指令(RPT和 RPTZ)中的操作数 加载载。操作数n的 最大值为值为 65535, 最大重复执执行次数 为为65535+1。 一旦重复指令被 取指、译码译码 ,直 到重复循环环完成 以前,对对所有的 中断(包括 , 但不包括 )均 不响应应。 重复执执行下一条指令n+1次 46 重复过程 当RPT指令执执行时时: 首先把循环环次数装入重复计计数器(RC), 其循环环次数n由一个16位单单数据存储储器操作数 或一个8位或16位常数给给定。这样紧这样紧 接着的下 一条指令会循环执环执 行n+1次。 循环环中,RC在执执行减1操作时时不能被访问访问 。 该该循环环内不能套用循环环。 47 例 利用单条指令的重复操作对数组x5=0,0,0 ,0,0进行初始化。 .bss x,5 ;为数组x分配5个存储单元 STM #x,AR1 ;将x的首地址赋给AR1 LD #0,A ;对A清零 RPT #4 ;设置重复执行下条指令5次 STL A,*AR1+;对x5各单元清零 或者 .bss x,5 STM #x,AR1 RPTZ A,#4 ;对A清零并重复执行下条指令5次 STL A,*AR1+; 48 利用C54x块重复计数器(BRC加载值065535) 、块重复起始地址寄存器(RSA)、块重复结束地址 寄存器(REA)与块重复指令RPTB,可对RPTB后由 若干条指令构成的程序块进行n+1次重复操作。 2. 块程序重复操作 功能重复执执行程序代码块码块 n+1次 注意 RPT指令一旦执执行,不会停止操作 ,即使有中断请请求也不响应应; RPTB指令可以响应应中断; 49 例 对数据组x5中的每个元素加1。 .bss x,5 ;为数组x分配5个存储单元 begin: LD #1,16,B ;将1左移16位放入B的 ;高端字的最低位 STM #4,BRC ; 4BRC,(PC)+2 RSA STM #x,AR4 ;将x的首地址赋给AR4 RPTB next-1 ;将NEXT-1 REA ADD *AR4,16,B,A ;x地址的内容左移16位加 ; B的高端字,结果放A STH A,*AR4+ ;将A的高端字存入x单元, ;完成加1操作 next: LD #0,B ;对B清零 ;next-1为结为结 束地址 50 对寄存器的占用 3)循环的嵌套 嵌套原则参与嵌套循环的寄存器不能重复使用 执行RPT指令时要占用RC寄存器(重复计数器); 执行RPTB指令时要占用到BRC、RSA和RSE寄存器。因为 C54xDSP只有一套块重复寄存器,故块重复操作不能嵌套。 由于RPT与RPTB两者用了不同的寄存器,因此RPT指令可以 嵌套在RPTB指令中,实现循环的嵌套。 51 一个三重循环嵌套结构 52 传送速度比加载和存储指令要快; 传送数据不需要通过累加器; 可以寻址程序存储器; 与RPT指令相结合(重复时,这些指令都 变成单周期指令),可以实现数据块传 送。 六、数据块传送程序 特 点 53 (1) 数据存储器 数据存储器 指令字数/执行周期 MVDK Smem,dmad ;Smem=dmad 2/2 MVKD dmad,Smem ;Smem=dmad 2/2 MVDD Xmem,Ymem ;Ymem=Xmem 1/1 (2) 程序存储器 数据存储器 MVPD pmad,Smem ;Smem=pmad 2/3 MVDP Smem,pmad ;pmad=Smem 2/4 54 pmad为16位立即数程序存储器地址; dmad为16位立即数数据存储器地址; Smem为数据存储器地址; Xmem、Ymem为双操作数数据存储器地址,Xmem从 DB数据总线上读出。Ymem从CB数据总线上读出。 55 (3) 数据存储器 MMR MVDM dmad,MMR ;指令的字数/执行周期 2/2 MVMD MMR,dmad ;dmad=MMR 2/2 MVMM mmrx,mmry ;mmry=mmrx 1/1 (4) 程序存储器(Acc) 数据存储器 READA Smem ;Smem=prog(A) 1/5 WRITA Smem ;prog(A)=Smem 1/5 mmrx,mmry为AR0AR7或SP; MMR为任何一个存储器映象寄存器; 56 例 将数组x5 初始化为1,2,3,4,5。 .data ;定义初始化数据段起始地址 TBL: .word 1,2,3,4,5 ;为标号地址TBL ;开始的5个单元赋初值 .bss x,5 ;为数组x分配5个存储单元 .text ;定义代码段起始地址 START: STM #x,AR5 ;将x的首地址存入AR5 RPT #4 ;设置重复执行5次下条指令 MVPD TBL,*AR5+ ;将TBL开始的5个值传给x 57 例 将数据存储器中的数组x10复制到数组y10。 .title “cjy1.asm” ;为汇编源程序取名 .mmregs ;定义存储器映象寄存器 STACK .usect “STACK”,30H ;设置堆栈 .bss x,10 ;为数组x分配10个存储单元 .bss y,10 ;为数组y分配10个存储单元 .data table:.word 1,2,3,4,5,6,7,8,9,10 .def start ;定义标号start .text 58 start:STM #0,SWWSR ;复位SWWSR STM #STACK+30H,SP;初始化堆栈指针 STM #x,AR1 ;将目的地首地址赋给AR1 RPT #9 ;设定重复传送的次数为10次 MVPD table,*AR1+ ;程序存储器传送到数 ;据存储器 STM #x,AR2 ;将x的首地址存入AR2 STM #y,AR3 ;将y的首地址存入AR3 RPT #9 ;设置重复执行10次下条指令 MVDD *AR2+,*AR3+ ;将地址x开始的10个值 ;复制到地址y开始的10个单元 end: B end .end 59 七、小数运算程序 整数运算的问题: (1)两个16位整数相乘,乘积总是“向左增长”。 这意味着多次相乘后,乘积将会很快超出定点 器件的数据范围。 (2)保存32位乘积到存储器,要开销2个机器周期 以及2个字的存储器单元。 (3)由于乘法器都是16位相乘,因此很难在后续的 递推运算中,将32位乘积作为乘法器的输入。 小数 运算 与整 数运 算的 比较 60 小数运算的优点: (1)乘积总是“向右增长”。意味着运算结果 超出定点器件数据范围的将是不太感兴趣 的尾数部分。 (2)既可以存储32位乘积,也可以只存储高16 位乘积,这就允许用较少资源保存结果。 (3)适合用于递推运算。 小数 运算 与整 数运 算的 比较 61 (1)小数的表示方法 Q 格式表示法: Q之后的数字(如Q15格式中的15)决定小数点右边 二进制的位数,故Q15表示在小数点后有15位小数。 当用一个16位的字来表示Q15格式时,在MSB(最高位) 的右边为小数点,MSB表示符号位。所以Q15格式可表 示的数据范围为+1(以+0.999997表示)到-1的值。 通常用Q15格式表示小数,Q0格式表示整数。 62 一个16位2的补码小数的Q15格式的每一位权值为: MSB(最高位) LSB(最低位) 符号位 1/2 1/4 1/8 2-15 一个十进制小数乘以32768之后再将其十进制整数部分转换 成十六进制数,就能得到这个十进制小数的2的补码表示了。 +1 7FFFh 0.5 正数:乘以32768,整数部分转为16进制数 4000h 0 0000h -0.5 负数:绝对值部分乘以32768,再取反加1 C000h -1 8000h 63 在C54xDSP汇编语言中,是不能直接写入十 进制小数的,但可写为整数运算式。例如要定 义一个系数0.707,可以写成: .word 32768*707/1000 而不能写成32768*0.707。 注意: 64 通过选择合适的Q格式,可以把数值根据所需的 精确度做适当地转换,以便定点DSP也可以处理高精 度的浮点数。下面以Q15为例,说明转换的过程。 1.先确定准备转换的十进制数值N,是在Q15格式的数 值范围之间,即-1.000000N+0.999997。 2. 2. 数值N乘以215,即N215=N32768 3.步骤2)的结果转换成十六进制(负数取反加1),得 到的结果就是N的Q15转换值。 65 例 下面把-0.2345及+0.2345转换成Q15格式。 +0.2345的转换为: 0.234532768=7684.17684 7684转换成十六进制数值结果为1E04h 即+0.2345的Q格式表示为1E04H -0.2345的转换为: -0.234532768=-7684.1-7684 -7684转换成十六进制数值结果为9E04H 即-0.2345的Q格式表示为0xE1FCH 66 以数据字长为4位,8位累加器为例的小数乘法: 0.5(-0.375)= -0.1875 0 1 0 0 0.5230.5=(4)10=(0100)2 1 1 0 1 -0.37523(-0.375)=(-3)10 =(1101)2补 0 1 0 0 (Q3格式) 0 0 0 0 0 1 0 0 1 1 0 0 -0100 1 1 1 0 1 0 0 -0.1875=-12/26 -12=(1110100)补 (Q6格式) (2)小数乘法与冗余符号位 67 上述乘积是7位,当将其送到8位累加器时,为保持乘 积的符号,必须进行符号位扩展,这样,累加器中的值应 为11110100(-0.09375=-12/27),出现了冗余符号位。原因 是: S x x x (Q3) S y y y (Q3) S S z z z z z z (Q6格式) 即两个带符号数相乘,得到的乘积带有2个符号位,造 成错误的结果。 同样,对于两个十六位数相乘,乘积只有30位,在最 高的两位也是符号位,同样会造成错误的结果。 68 解决冗余符号的办法是: 在程序中将状态寄存器ST1中的FRCT(小数方式)位设为1 ,在乘法器将结果传送至累加器时就自动地左移1位,累加 器中结果为:Szzzzzz0(Q7格式),即 11101000 -0.1875=-24/27-24=(11101000)补, 自动地消去了两个带符号数相乘时产生的冗余符号位。 所以在小数乘法编程时,应当事先置位FRCT: SSBX FRCT ;FRCT=1 MPY *AR2,*AR3,A STH A,Z 这样,C54x就完成了Q15*Q15=Q15的小数乘法。 69 例 编制计算 的程序段,其中数据均为小数: a1=0.1, a2=0.2, a3=-0.3, a4=0.4, x1=0.8, x2=0.6, x3=-0.4, x4=-0.2。 .title “cjy4.asm” .mmregs STACK .usect “STACK”,10H ;定义10个堆栈空间 .bss a,4 ;为a分配4个存储单元 .bss x,4 ;为x分配4个存储单元 .bss y,1 ;为结果y分配1个存储单元 .def start ;定义符号 .data ;定义数据代码段 70 table: .word 1*32768/10 ;在table开始的8个 .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 71 .text ;定义程序代码段 start:SSBX FRCT ;设置FRCT位,表示进行小数乘 STM #x,AR1 ;将x的首地址传给AR1 RPT #7 ;重复8次下条指令 MVPD table,*AR1+ ;将程序空间8个数传给数据存储器 STM #x,AR2 ;将数据存储器第一个数x1的地址传给AR2 STM #a,AR3 ;将数据存储器第五个数a1的地址传给AR3 RPTZ A,#3 ;将A清零,重复4次下条指令 MAC *AR2+,*AR3+,A ;执行乘法累加和,结果放在A中 STH A,y ;将A的高端字存入结果y,低端字省去 end: B end ;循环等待 .end 结果为:y=0x1EB7,转换为十进制小数: y=(1163+14162+11161+7160)/32768=0.24 72 10 除法运算 条件减法指令的功能: SUBC Smem,src ;(src)-(Smem)15 ALU 输出端, ;如果ALU输出0,则 ; (ALU输出)1+1src, ;否则,(src)1src。 方法:利用条件减法指令(SUBC)加重复指令 (RPT #15)实现两个无符号数除运算 73 例 设累加器为8位,完成10/3的运算 0000100100010011:前4位余数,后4位商 00001010 -00011000 结果为负,丢弃结果,将被除数左移一位再减 11110010 00010100 -00011000 结果为负,丢弃结果,将被除数左移一位再减 11111100 00101000 -00011000 结果为正,将结果左移一位后加一再减 00010000 00100001 -00011000 结果为正,将结果左移一位后加一得最后结果 00001001 74 例 编写0.4(-0.8)的程序段。 .title “cjy5.asm” .mmregs STACK .usect “STACK”,10H .bss num,1 ;为分子分配单元 .bss den,1 ;为分母分配单元 .bss quot,1 ;为商分配单元 .data ;定义数据段起始地址 table:.word 4*32768/10 ;在以table为地址的 ;单元放入 0.4 .word -8*32768/10 ;在以table为地址的 ;下一单元放入-0.8 .def start (1)当被除数除数 此时商为小数。 75 .text ;定义数据段起始地址 start: STM #num,AR1 ;将分子所在单元的地址传给AR1 RPT #1 ;重复执行下一指令2次 MVPD table,*AR1+;传送程序空间的2个数据(分子、 ;分母)至地址为num开始的数据存储器单元 LD den,16,A ;将分母移到累加器A(3116) MPYA num ;(num)*( A(3116)B, ;获取商的符号(在累加器B中) ABS A ;分母取绝对值 STH A,den ;分母绝对值存回原处 LD num,16,A ;分子加载到A(3116) ABS A ;分子取绝对值 RPT #14 ;15次减法循环,完成除法 SUBC den,A ; XC 1,BLT ;如果B0(商是负数),则需要变号 NEG A ;如果B0执行求反,否则跳过此指令 STL A,quot ;保存商 end: B end .end 76 a)被除数除数商为小数 b被除数除数商为整数 77 (2)当被除数除数时时,商为为整数。 例 编写16384512的程序段。 将上例程序段仅作两处修改,其它不变,就得本例 的程序段: LD num,16,A 改成 LD num,A RPT #14 改成 RPT #15 本例的程序段为: .title “cjy6.asm” .mmregs STACK .usect “STACK”,10H 78
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 数控技术应用试题及答案
- 2025年北京个人房屋租赁合同范本官方版下载
- 2025官方版股权投资合同范本
- 2025年高二【数学(人教A版)】两条平行直线间的距离公式-学习任务单
- 2025抵质押物的借款合同范本
- 公园养护基本知识培训总结
- 公司职工财务知识培训课件
- 高职卫生专业招生面试题库
- 2025关于汽车租赁的合同样本
- 市场调研与创意策划的关系面试题及答案解析
- 安全生产培训(完整版)课件
- 钢结构长廊施工方案
- 信保业务自查问题统计表
- 年产3万吨环保型铝箔容器系列产品生产线项目环境影响报告
- 安庆汇辰药业有限公司高端原料药、医药中间体建设项目环境影响报告书
- 关于术中知晓预防和脑功能监测专家共识
- 河道修防工高级工试题
- 保障农民工工资支付协调机制和工资预防机制
- GB/T 4458.3-2013机械制图轴测图
- GB/T 311.2-2013绝缘配合第2部分:使用导则
- GB/T 13912-2002金属覆盖层钢铁制件热浸镀锌层技术要求及试验方法
评论
0/150
提交评论