1 / 98

第 7 章 汇编语言程序设计

第 7 章 汇编语言程序设计. 7.1 程序流程控制 7.2 数据块传送 7.3 定点数的基本算术运算 7.4 长字运算和并行运算 7.5 FIR 滤波器的 DSP 实现 7.6 IIR 数字滤波器的 DSP 实现 7.7 FFT 运算的 DSP 实现. 7.1 程序流程控制. 7.1.1 程序存储器地址生成 7.1.2 条件操作 7.1.3 分支转移 7.1.4 调用与返回 7.1.5 重复操作 7.1.6 TMS320C54x 中断系统 7.1.7 堆栈的使用. 返回首页. 7.1.1 程序存储器地址生成.

ilori
Download Presentation

第 7 章 汇编语言程序设计

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第7章汇编语言程序设计 • 7.1 程序流程控制 • 7.2 数据块传送 • 7.3 定点数的基本算术运算 • 7.4 长字运算和并行运算 • 7.5 FIR滤波器的DSP实现 • 7.6 IIR数字滤波器的DSP实现 • 7.7 FFT运算的DSP实现

  2. 7.1 程序流程控制 • 7.1.1 程序存储器地址生成 • 7.1.2 条件操作 • 7.1.3 分支转移 • 7.1.4 调用与返回 • 7.1.5 重复操作 • 7.1.6 TMS320C54x中断系统 • 7.1.7 堆栈的使用 返回首页

  3. 7.1.1 程序存储器地址生成 • 程序存储器中存放指令代码、参数表和立即数。程序地址产生逻辑(PAGEN),包括以下5个寄存器(如图7-1所示): • 程序计数器(PC); • 重复计数器(RC); • 块重复计数器(BRC); • 块重复起始地址寄存器(RSA); • 块重复结束地址寄存器(REA)。

  4. 图7-1 程序地址产生逻辑(PAGEN)寄存器 返回本节

  5. 表7-1 条件指令中的各种条件 7.1.2 条件操作

  6. 第一组 第二组 A 类 B 类 A 类 B 类 C 类 EQ OV TC C BIO NEQ NOV NTC NC NBIO LT LEQ GT GEQ 表7-2 多条件指令中的条件组合 返回本节

  7. 指令 说明 周期数(非延迟/延迟) B[D] 用指令中给出的地址加载PC 4/2 BACC[D] 用指定累加器(A或B)的低16位作为地址加载PC 6/4 7.1.3 分支转移 表7-3 无条件分支转移指令

  8. 指令 说明 周期数(条件满足/不满足) 非延迟 延迟 BC[D] 如果指令中的条件满足,就用指令中给出的地址加载PC 5/3 3/3 BANZ[D] 如果所选择的辅助寄存器不等于0,就用指令中给出的地址加载PC(用于循环) 4/2 2/2 表7-4 条件分支转移指令

  9. 指令 说明 周期数(非延迟/延迟) FB[D] 可以转移到由指令所给定的23位地址(C5402为20位地址) 4/2 FBACC[D] 可以转移到指定累加器所给定的23位地址(C5402为20位地址) 6/4 表7-5 远分支转移指令 返回本节

  10. 7.1.4 调用与返回 表7-6 无条件调用与返回指令

  11. 表7-7 条件调用与返回指令

  12. 表7-8 远调用和远返回指令 返回本节

  13. 7.1.5 重复操作 1.单条指令的重复操作 • RPT(重复执行下一条指令)和RPTZ(累加器清0后重复执行下一条指令)可重复执行其后的一条指令,重复的次数是指令操作数加1,这个值保存在16位的重复计数寄存器(RC)中,这个值只能由重复指令(RPT或RPTZ)加载,而不能编程设置RC寄存器中的值,一次给定指令重复执行的最大次数是65536。

  14. 2.块重复操作指令 • 块重复指令RPTB用于将一个码块重复执行N+1次,N是装入块重复计数器(BRC)的值。一个码块可以有一条或多条指令。单条重复指令执行时关闭所有可屏蔽中断,而块重复操作执行期间可以响应中断。 返回本节

  15. 7.1.6 TMS320C54x中断系统 1.中断类型 • C54x支持软件中断和硬件中断。软件中断由程序指令产生(INTR、TRAP或RESET)。硬件中断由设备的一个信号产生,包括两种类型:①外部硬件中断由外部中断口的信号触发;②内部硬件中断由片内外设的信号触发。无论是硬件中断还是软件中断,都属于以下两种类型: (1)可屏蔽中断 (2)非屏蔽中断

  16. 表7-9 C5402中断源的中断向量及硬件中断优先权

  17. 2.中断标志寄存器(IFR)和中断屏蔽寄存器(IMR)2.中断标志寄存器(IFR)和中断屏蔽寄存器(IMR) • 中断标志寄存器(IFR)是存储器映象的CPU寄存器。如图7-2所示为C5402中断标志寄存器(IFR)结构图。中断屏蔽寄存器(IMR)也是存储器映象的CPU寄存器,用来屏蔽外部和内部的可屏蔽中断,其结构图同IFR完全一致。

  18. 图7-2 中断标志寄存器(IFR)结构图

  19. 3.中断响应过程(如图7-3所示) (1)接受中断请求。 (2)响应中断。 (3)执行中断服务程序(ISR)。

  20. 图7-3 中断操作流程图

  21. 4.重新映象中断向量地址 • C54x的中断向量表是可重定位的,即在DSP复位时,中断向量表的起始地址固定为0FF80H,复位后,此表的起始地址可由用户指定。 • 中断向量可重新被映象到程序存储器的任何一个128字页开始的地方(除保留区域外)。中断向量地址由PMST中的中断向量指针IPTR(9位)和中断向量号(0~31)左移两位后组成。如图7-4所示。

  22. 中断向量号左移两位后 中断向量地址 图7-4 中断向量地址的产生 返回本节

  23. 7.1.7 堆栈的使用 • 堆栈被用于保存中断程序、调用子程序的返回地址,也用于保护和恢复用户指定的寄存器和数据,还可用于程序调用时的参数传递。返回地址是由DSP自动保存的。 • 用户编写的压栈指令和出栈指令将指定的内容压入和弹出堆栈,SP总是指向最后压入堆栈的数据,压栈之前SP减1,出栈之后SP加1。

  24. C54x支持软件堆栈,在用户指定的存储区开辟一块存储区作为堆栈存储器。堆栈的定义及初始化步骤为:C54x支持软件堆栈,在用户指定的存储区开辟一块存储区作为堆栈存储器。堆栈的定义及初始化步骤为: 1)声明具有适当长度的未初始化段; 2)将堆栈指针指向栈底; 3)在链接命令文件(.cmd)中将堆栈段放入内部数据存储区。 返回本节

  25. 7.2 数据块传送 • C54x有10条数据传送指令,为: • 数据存储器数据存储器:MVDK Smem,dmad MVKD dmad,Smem MVDD Xmem,Ymem • 数据存储器MMR:MVDM dmad,MMR MVMD MMR,dmad MVMM mmr,mmr 返回首页

  26. 程序存储器数据存储器: MVPD Pmad,Smem MVDP Smem,Pmad READA Smem WRITA Smem

  27. 1.编写汇编源程序为 .mmregs .def _c_int00 .data TBL: .word0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,1 7,18,19 .word 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 PROM: .usect "PROM",20 .bss a,20 .bss x,20 .bss y,20 DATA: .usect "DATA",20 .text

  28. _c_int00 b start nop nop start:STM: #a,AR1;a[20]={0,1,2,3,4,5,6,7,8,9,10, ;11,12,13,14,15,16,17,18,19} RPT #39 ;x[20]={1,1,1,1,1,1,1,1,1,1 MVPD TBL,*AR1+ ;1,1,1,1,1,1,1,1,1,1} STM #x,AR2;将数据存储器中的数组x[20]复制到数组y[20] STM #y,AR3 RPT #19 MVDD *AR2+,*AR3+

  29. STM #a,AR1;将数据存储器中的a[20]写入到程序存储器PROM LD #PROM,A STM #19,AR3 LOOPP:WRITA *AR1+ ADD #1,A,A BANZ LOOPP,*AR3- LD #PROM-1,A ;读程序存储器PROM中20个数据存入数据存储器DATA STM #DATA,AR1 ST #19,BRC RPTB LOOP2 ADD #1,A,A LOOP2: READA *AR1+ ;该指令为单字指令 WAIT: NOP B WAIT

  30. 2.建立汇编源程序 • 点击CCS C5000图标,进入CCS环境,再点击File→New→Source File菜单命令,打开一个空白文档,将汇编源程序逐条输入。 • 单击File→Save菜单命令,出现如图7-5所示的窗口,选择D:\Program Files\ti \myprojcets\mymove子目录,在“文件名”一栏中输入mymove,并选择保存类型为Assembly Source Files(*.asm),单击“保存”按钮,以上汇编程序被存盘。

  31. 3.建立链接命令文件 • 点击File→New→Source File菜单命令,打开一个空白文档,逐条输入链接命令文件。 mymove.obj -o mymove.out -m mymove.map MEMORY {PAGE 0: RAM: origin=1000h,length=800h RAM1: origin=2000h,length=300h PAGE 1: DARAM1: origin=0100h,length=100h DARAM2: origin=0200h,length=100h }

  32. SECTIONS { .data :>RAM PAGE 0 .text :>RAM PAGE 0 PROM : >RAM1 PAGE 0 .bss :>DARAM1 PAGE 1 DATA :>DARAM2 PAGE 1 } • 点击File→Save菜单命令,如图7-5所示,选择D:\Program Files\ti\myprojcets\mymove子目录,在“文件名”一栏中输入mymove,并选择保存类型为TI Command Language File(*.cmd),单击“保存”按钮,以上链接命令程序被存盘。

  33. 4.创建一个新工程 • 在Project菜单中选择New项,弹出Project Creation(工程创建)窗口,如图7-6所示。在Project一栏键入mymove,然后单击“完成”按钮,CCS将创建一个名为mymove.pjt的工程,此文件保存了工程的设置信息及工程中的文件引用情况。

  34. 图7-5 保存汇编源程序 图7-6 工程创建窗口

  35. 5.将有关文件添加到工程中 • 从Project菜单中选取Add Files to Project命令,选择文件mymove.asm,双击将mymove.asm添加到工程中。 • 点击Project→Add Files to Project菜单命令,将mymove.cmd添加到工程文件中。 • 逐层打开如图7-7所示。双击mymove.asm打开文件,可以观察和修改mymove.asm文件的内容。

  36. 6.汇编、编译和链接产生.out文件 • 点击Project菜单中的Rebuild All。请注意在监视窗口显示的汇编、编译和链接的相关信息。如果没有错误,将产生mymove.out文件;如果有错,在监视窗口以红色字体显示出错行,用鼠标双击该行,光标跳将至源程序相应的出错行。修改错误后,重新汇编、链接。

  37. 7.加载并运行.out文件 • 执行菜单命令File→Load Program,选择mymove.out并打开,将Rebuild All生成的程序加载到DSP中。CCS将自动打开一个反汇编窗口,显示加载程序的反汇编指令。 • 点击Debug→Run菜单命令运行程序,单步执行程序则点击Debug→StepInto菜单命令,或按F8键。

  38. 8.观察运行结果 • 点击View→Memory菜单命令,将出现如图7-8所示的选项窗口,将Address改为0x0100,单击OK按钮,将在汇编窗口显示选定的数据空间的内容。 • 当结果数据错误时,可检查源程序并进行修改。修改完毕,可重新汇编、链接,再加载运行.out文件,直到结果正确。 返回本节

  39. 7.3 定点数的基本算术运算 • 7.3.1 加法、减法和乘法运算 • 7.3.2 定点除法运算 返回首页

  40. 7.3.1 加法、减法和乘法运算 1.定点DSP中数据表示方法 • 定点DSP芯片的数值表示是基于2的补码表示形式。数的定标有Q表示法和S表示法,表7-10列出了16位数的16种Q表示和S表示,以及它们所能表示的十进制数范围。16位中有一个符号位、Q个小数位和15-Q个整数位来表示一个数。

  41. 表7-10 Q表示、S表示及数值范围

  42. 图7-9 DSP定点运算中小数的表示

  43. 2.16位定点加法和16位定点减法 • C54x中提供了多条用于加法的指令,如ADD、ADDC、ADDM和ADDS。其中,ADDS用于无符号数的加法运算,ADDC用于带进位的加法运算而ADDM专用于立即数的加法。 • C54x中提供了多条用于减法的指令,如SUB、SUBB、SUBC和SUBS。其中,SUBS用于无符号数的减法运算,SUBB用于带进位的减法运算,而SUBC为条件减法指令。

  44. 3.16位定点整数乘法 • C54x中提供了大量的乘法运算指令,其结果都是32位,放在累加器A或B中。乘数在C54x的乘法指令中很灵活,可以是T寄存器、立即数、存储单元和累加器A或B的高16位。在C54x中,一般对数据的处理都当做有符号数,如果是无符号数相乘,使用MPYU指令,这是一条专门用于无符号数乘法运算的指令,其他指令都是有符号数的乘法。

  45. 4.Q15定点小数乘法运算 • 两个16位整数相乘,乘积总是“向左增长”,这就意味着多次相乘后乘积将会很快超出定点器件的数据范围。而且要将32位乘积保存到数据存储器,就要耗费两个机器周期以及两个字的程序和RAM单元。然而,两个Q15的小数相乘,乘积总是“向右增长”,这就意味着超出定点器件数据范围的将是不太感兴趣的部分。

  46. 5.混合表示法 • 有些情况下,运算过程中为了既满足数值的动态范围又保证一定的精度,必须采用Q0与Q15之间的表示方法。 • 在做加、减运算时,如果两个操作数的定标不一样,在运算前要进行小数点的调整,为保证运算精度,需要使Q值小的数调整为与另一个数的Q值一样大。 返回本节

  47. 7.3.2 定点除法运算 • 在一般的DSP中,没有专门的除法指令。同样,在C54x中也没有提供专门的除法指令。一般有两种方法来完成除法。一种是用乘法来代替,除以某个数相当于乘以其倒数,所以先求出其倒数,然后相乘。这种方法对于除以常数特别适用。另一种方法是使用条件减法SUBC指令,加上重复指令RPT #15,重复16次减法完成无符号数除法运算。两种不同情况下的除法程序。 1.|被除数|<|除数|,商为小数 2.|被除数|≥|除数|,商为整数 返回本节

  48. 7.4 长字运算和并行运算 • 7.4.1 长字运算 • 7.4.2 并行运算 返回首页

  49. 7.4.1 长字运算 • 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 返回本节

More Related