汇编语言程序设计_第1页
汇编语言程序设计_第2页
汇编语言程序设计_第3页
汇编语言程序设计_第4页
汇编语言程序设计_第5页
已阅读5页,还剩96页未读 继续免费阅读

下载本文档

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

文档简介

1、第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 程序存储器地址生成程序存储器中存放指令代码、参数表和立即数。程序地址产生逻辑(PAGEN), 包括以下5个寄存器(如图7-1所示): 程序计数器(PC);重复计数器(RC)

2、;块重复计数器(BRC);块重复起始地址寄存器(RSA);块重复结束地址寄存器(REA)。图7-1 程序地址产生逻辑(PAGEN)寄存器返回本节7.1.2 条件操作表7-1 条件指令中的各种条件表7-2 多条件指令中的条件组合第一组第二组A 类B 类A 类B 类C 类EQOVTCCBIONEQNOVNTCNCNBIOLTLEQGTGEQ返回本节7.1.3 分支转移表7-3 无条件分支转移指令指令说明周期数(非延迟/延迟)BD用指令中给出的地址加载PC4/2BACCD用指定累加器(A或B)的低16位作为地址加载PC6/4表7-4 条件分支转移指令指令说明周期数(条件满足/不满足)非延迟延迟BCD

3、如果指令中的条件满足,就用指令中给出的地址加载PC5/33/3BANZD如果所选择的辅助寄存器不等于0,就用指令中给出的地址加载PC(用于循环)4/22/2表7-5 远分支转移指令指令说明周期数(非延迟/延迟)FBD可以转移到由指令所给定的23位地址(C5402为20位地址)4/2FBACCD可以转移到指定累加器所给定的23位地址(C5402为20位地址)6/4返回本节7.1.4 调用与返回表7-6 无条件调用与返回指令表7-7 条件调用与返回指令表7-8 远调用和远返回指令返回本节7.1.5 重复操作1单条指令的重复操作RPT(重复执行下一条指令)和RPTZ(累加器清0后重复执行下一条指令)

4、可重复执行其后的一条指令,重复的次数是指令操作数加1,这个值保存在16位的重复计数寄存器(RC)中,这个值只能由重复指令(RPT或RPTZ)加载,而不能编程设置RC寄存器中的值,一次给定指令重复执行的最大次数是65536。2块重复操作指令块重复指令RPTB用于将一个码块重复执行N1次,N是装入块重复计数器(BRC)的值。一个码块可以有一条或多条指令。单条重复指令执行时关闭所有可屏蔽中断,而块重复操作执行期间可以响应中断。 返回本节7.1.6 TMS320C54x中断系统1中断类型C54x支持软件中断和硬件中断。软件中断由程序指令产生(INTR、TRAP或RESET)。硬件中断由设备的一个信号产

5、生,包括两种类型:外部硬件中断由外部中断口的信号触发;内部硬件中断由片内外设的信号触发。无论是硬件中断还是软件中断,都属于以下两种类型:(1)可屏蔽中断 (2)非屏蔽中断 表7-9 C5402中断源的中断向量及硬件中断优先权2中断标志寄存器(IFR)和中断屏蔽寄存器(IMR)中断标志寄存器(IFR)是存储器映象的CPU寄存器。如图7-2所示为C5402中断标志寄存器(IFR)结构图。中断屏蔽寄存器(IMR)也是存储器映象的CPU寄存器,用来屏蔽外部和内部的可屏蔽中断,其结构图同IFR完全一致。 图7-2 中断标志寄存器(IFR)结构图3中断响应过程(如图7-3所示)(1)接受中断请求。 (2)

6、响应中断。(3)执行中断服务程序(ISR)。图7-3 中断操作流程图4重新映象中断向量地址C54x的中断向量表是可重定位的,即在DSP复位时,中断向量表的起始地址固定为0FF80H,复位后,此表的起始地址可由用户指定。中断向量可重新被映象到程序存储器的任何一个128字页开始的地方(除保留区域外)。中断向量地址由PMST中的中断向量指针IPTR(9位)和中断向量号(031)左移两位后组成。如图7-4所示。中断向量号左移两位后中断向量地址图7-4 中断向量地址的产生返回本节7.1.7 堆栈的使用堆栈被用于保存中断程序、调用子程序的返回地址,也用于保护和恢复用户指定的寄存器和数据,还可用于程序调用时

7、的参数传递。返回地址是由DSP自动保存的。 用户编写的压栈指令和出栈指令将指定的内容压入和弹出堆栈,SP总是指向最后压入堆栈的数据,压栈之前SP减1,出栈之后SP加1。 C54x支持软件堆栈,在用户指定的存储区开辟一块存储区作为堆栈存储器。堆栈的定义及初始化步骤为:1)声明具有适当长度的未初始化段;2)将堆栈指针指向栈底;3)在链接命令文件(.cmd)中将堆栈段放入内部数据存储区。 返回本节7.2 数据块传送C54x有10条数据传送指令,为:数据存储器数据存储器:MVDK Smem,dmad MVKD dmad,Smem MVDD Xmem,Ymem数据存储器MMR:MVDM dmad,MMR

8、 MVMD MMR,dmad MVMM mmr,mmr返回首页程序存储器数据存储器: MVPD Pmad,Smem MVDP Smem,Pmad READA Smem WRITA Smem1编写汇编源程序为 .mmregs .def _c_int00 .dataTBL: .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,1PROM:.usect PROM,20 .bss a,20 .bss x,20 .bss y,20DATA:.usectDAT

9、A,20 .text_c_int00 b start nop nopstart:STM: #a,AR1;a20=0,1,2,3,4,5,6,7,8,9,10, ;11,12,13,14,15,16,17,18,19 RPT #39 ;x20=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;将数据存储器中的数组x20复制到数组y20 STM #y,AR3 RPT #19 MVDD *AR2+,*AR3+ STM #a,AR1;将数据存储器中的a20写入到程序存储器PROM LD #PROM,A STM #19,

10、AR3LOOPP: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,ALOOP2: READA *AR1+ ;该指令为单字指令WAIT: NOP B WAIT2建立汇编源程序点击CCS C5000图标,进入CCS环境,再点击FileNewSource File菜单命令,打开一个空白文档,将汇编源程序逐条输入。单击FileSave菜单命令,出现如图7-5所示的窗口,选择D:Program File

11、sti myprojcetsmymove子目录,在“文件名”一栏中输入mymove,并选择保存类型为Assembly Source Files(*.asm),单击“保存”按钮,以上汇编程序被存盘。3建立链接命令文件点击FileNewSource File菜单命令,打开一个空白文档,逐条输入链接命令文件。 mymove.obj -o mymove.out -m mymove.map MEMORY PAGE 0:RAM: origin=1000h,length=800h RAM1: origin=2000h,length=300hPAGE 1: DARAM1: origin=0100h,lengt

12、h=100hDARAM2: origin=0200h,length=100h SECTIONS .data :RAM PAGE 0.text :RAM PAGE 0PROM:RAM1 PAGE 0.bss:DARAM1 PAGE 1DATA:DARAM2 PAGE 1点击FileSave菜单命令,如图7-5所示,选择D:Program Filestimyprojcetsmymove子目录,在“文件名”一栏中输入mymove,并选择保存类型为TI Command Language File(*.cmd),单击“保存”按钮,以上链接命令程序被存盘。4创建一个新工程在Project菜单中选择New项

13、,弹出Project Creation(工程创建)窗口,如图7-6所示。在Project一栏键入mymove,然后单击“完成”按钮,CCS将创建一个名为mymove.pjt的工程,此文件保存了工程的设置信息及工程中的文件引用情况。 图7-5 保存汇编源程序 图7-6 工程创建窗口5将有关文件添加到工程中从Project菜单中选取Add Files to Project命令,选择文件mymove.asm,双击将mymove.asm添加到工程中。点击ProjectAdd Files to Project菜单命令,将mymove.cmd添加到工程文件中。逐层打开如图7-7所示。双击mymove.as

14、m打开文件,可以观察和修改mymove.asm文件的内容。 6汇编、编译和链接产生.out文件点击Project菜单中的Rebuild All。请注意在监视窗口显示的汇编、编译和链接的相关信息。如果没有错误,将产生mymove.out文件;如果有错,在监视窗口以红色字体显示出错行,用鼠标双击该行,光标跳将至源程序相应的出错行。修改错误后,重新汇编、链接。7加载并运行.out文件执行菜单命令FileLoad Program,选择mymove.out并打开,将Rebuild All生成的程序加载到DSP中。CCS将自动打开一个反汇编窗口,显示加载程序的反汇编指令。点击DebugRun菜单命令运行程

15、序,单步执行程序则点击DebugStepInto菜单命令,或按F8键。8观察运行结果点击ViewMemory菜单命令,将出现如图7-8所示的选项窗口,将Address改为0 x0100,单击OK按钮,将在汇编窗口显示选定的数据空间的内容。当结果数据错误时,可检查源程序并进行修改。修改完毕,可重新汇编、链接,再加载运行.out文件,直到结果正确。返回本节7.3 定点数的基本算术运算7.3.1 加法、减法和乘法运算7.3.2 定点除法运算返回首页7.3.1 加法、减法和乘法运算1定点DSP中数据表示方法定点DSP芯片的数值表示是基于2的补码表示形式。数的定标有Q表示法和S表示法,表7-10列出了1

16、6位数的16种Q表示和S表示,以及它们所能表示的十进制数范围。16位中有一个符号位、Q个小数位和15-Q个整数位来表示一个数。 表7-10 Q表示、S表示及数值范围图7-9 DSP定点运算中小数的表示216位定点加法和16位定点减法C54x中提供了多条用于加法的指令,如ADD、ADDC、ADDM和ADDS。其中,ADDS用于无符号数的加法运算,ADDC用于带进位的加法运算而ADDM专用于立即数的加法。 C54x中提供了多条用于减法的指令,如SUB、SUBB、SUBC和SUBS。其中,SUBS用于无符号数的减法运算,SUBB用于带进位的减法运算,而SUBC为条件减法指令。316位定点整数乘法C5

17、4x中提供了大量的乘法运算指令,其结果都是32位,放在累加器A或B中。乘数在C54x的乘法指令中很灵活,可以是T寄存器、立即数、存储单元和累加器A或B的高16位。在C54x中,一般对数据的处理都当做有符号数,如果是无符号数相乘,使用MPYU指令,这是一条专门用于无符号数乘法运算的指令,其他指令都是有符号数的乘法。 4Q15定点小数乘法运算两个16位整数相乘,乘积总是“向左增长”,这就意味着多次相乘后乘积将会很快超出定点器件的数据范围。而且要将32位乘积保存到数据存储器,就要耗费两个机器周期以及两个字的程序和RAM单元。然而,两个Q15的小数相乘,乘积总是“向右增长”,这就意味着超出定点器件数据

18、范围的将是不太感兴趣的部分。 5混合表示法有些情况下,运算过程中为了既满足数值的动态范围又保证一定的精度,必须采用Q0与Q15之间的表示方法。在做加、减运算时,如果两个操作数的定标不一样,在运算前要进行小数点的调整,为保证运算精度,需要使Q值小的数调整为与另一个数的Q值一样大。返回本节 .title suanshu.asm.mmregs.def start,_c_int00.bss x1,1 ;地址:0400H.bss x2,1 ;地址:0400H .bss y1,1 ;地址:0400H.bss y2,1 ;地址:0400H .bss z1,1 ;地址:0400H.bss z2,1 ;地址:0

19、400H .bss z3_h,1 ;地址:0400H .bss z3_l,1 ;地址:0400H.bss z4,1 ;地址:0400Hv1 .set 014H ;20 X1v2 .set 036H ;54Y1v3 .set 04000H ;0.5X2v4 .set 0b548H ;-0.5837Y2_c_int00 b start nop nopstart: LD #x1,DP ST #V1,x1 ST #v2,y1;*test ADD* LD x1,A ;X1A ADD y1,A ;A+Y1 A STL A,z1 ;保存AL Z1 NOP ;可以在此处设置断点,观察加法运算结果;*test

20、SUB* LD x1,A SUB y1,A STL A,z2 NOP ;可以在此处设置断点,观察减法运算结果 ;*test MPY(整数)* RSBX FRCT ;准备整数乘法,FACT=0 LD x1,T ;X1 T MPY y1,A ;X1*Y1 A(32bits) STH A,z3_h STL A,z3_l NOP ;可以在此处设置断点,观察整数乘法运算结果 ST #v3,x2 ST #v4,Y2;*test MPY(小数)*;*0.5*(-0.58374)=-0.29187(0 x0daa4)* SSBX FRCT ;准备小数乘法,FACT=1 LD x2,16,A ;将X2加载到AH

21、 MPYA y2 ;X2*Y2 B,Y2 T STH B,z4 ;结果存储在Z4单元中 NOP ;可以在此处设置断点,观察小数乘法运算结果end: B end7.3.2 定点除法运算在一般的DSP中,没有专门的除法指令。同样,在C54x中也没有提供专门的除法指令。一般有两种方法来完成除法。一种是用乘法来代替,除以某个数相当于乘以其倒数,所以先求出其倒数,然后相乘。这种方法对于除以常数特别适用。另一种方法是使用条件减法SUBC指令,加上重复指令RPT #15,重复16次减法完成无符号数除法运算。两种不同情况下的除法程序。1|被除数|ROM1PAGE 0.data : INTRAM1 PAGE 1

22、FIR_COEF: INTRAM2 PAGE 1FIR_BFR : INTRAM3 PAGE 1.stack : B2B PAGE 1 5CCS集成开发环境下上机操作过程(1)在CCS上建立fir工程并运行fir.out程序。 (2)观察输入信号的波形及频谱(如图7-137-15所示)。(3)观察输出信号的波形及频谱(如图7-16、7-17所示 )。图7-13 Graph 属性设置窗口 图7-14 输入信号的时域波形 图7-15 输入信号的频谱图 图7-16 滤波器输出信号时域波形 图7-17 滤波器输出信号频谱图返回本节7.5.3 系数对称FIR滤波器的DSP实现1在数据存储器中开辟两个循环

23、缓冲区:New循环缓冲区中存放N/2=4个新数据(设N=8);Old循环缓冲区中存放4个老数据。循环缓冲区的长度为N/2。缓冲区指针AR2指向New 缓冲区中最新的数据;AR3指向Old 缓冲区中最老的数据,并在程序存储器中设置系数表,如图7-18所示。2.(AR2)+(AR3)AH(累加器A的高位)(AR2)-1AR2,(AR3)-1AR33将累加器B清0,重复执行以下操作N/2次(i=0,1,2,3):(AH)系数ai+(B)B,系数指针(PAR)加1(AR2)+(AR3)AH,AR2 和AR3减1并保存或输出结果(结果在BH中)。4修正数据指针将AR2和AR3分别指向New缓冲区中最新的

24、数据和Old 缓冲区中最老的数据。用New 缓冲区最老的数据替代Old 缓冲区中最老的数据,如图7-18中箭头所示。Old 缓冲区指针减1。5输入一个新的数据替代New 缓冲区中最老的数据重复执行步骤25。返回本节7.6 IIR数字滤波器的DSP实现IIR数字滤波器的传递函数H(z)为:其对应的差分方程为:例如,对于直接形式的二阶IIR数字滤波器,其结构如图7-19所示,编程时,可以分别开辟四个缓冲区,存放输入、输出变量和滤波器的系数,如图7-20所示。(7-4)(7-3)返回首页图7-19 直接形式的二阶IIR数字滤波器图7-20 存放输入、输出变量和滤波器系数的缓冲区【例7-15】设计一个

25、三阶的切比雪夫型带通数字滤波器,其采样频率Fs =16kHz,其通频带3.2kHzf4.8kHz,内损耗不大于1dB;f 5.6kHz为阻带,其衰减大于20dB。1IIR滤波器的设计在MATLAB中设计IIR滤波器,程序为: wp=3.2,4.8;ws=2.4,5.6;rp=1;rs=20 n,wn=cheb1ord(wp/8,ws/8,rp,rs) b,a=cheby1(n,rp,wn) 设计结果为: N=3 wn =0.4000 0.6000 b0=0.0114747a0=1.000000 b1=0 a1=0 b2=-0.034424 a2=2.13779 b3=0 a3=0 b4=0.0

26、34424 a4=1.76935 b5=0 a5=0 b6=-0.0114747 a6=0.5397582产生滤波器输入信号的文件使用CCS的Simulator进行滤波器特性的测试时,需要输入时间信号x(n)。 #include #include void main() int i; double f256; FILE *fp; if(fp=fopen(iirin.inc,wt)=NULL) printf(cant open file! n); return; fprintf(fp,INPUT: .sect %cINPUT %cn,);for(i=0;iROM PAGE 0.data:DARA

27、M PAGE 1BN:DARAM PAGE 1AN:DARAM PAGE 1 INBUF:RAM1 PAGE 1OUTPUT:RAM2 PAGE 1返回本节7.7 FFT运算的DSP实现7.7.1 基二实数FFT运算的算法7.7.2 FFT运算模拟信号的产生及输入7.7.3 实序列FFT汇编源程序及链接命令文件7.7.4 观察信号时域波形及其频谱返回首页7.7.1 基二实数FFT运算的算法该算法主要分为以下四步。第一步,输入数据的组合和位倒序把输入序列作位倒序是为了在整个运算最后的输出中得到的序列是自然顺序。如图7-21所示。第二步,N点复数FFT在DATA数据处理缓冲器里进行N点复数FFT运

28、算。如图7-22所示。第三步,分离复数FFT的输出为奇部分和偶部分分离FFT输出为RP、RM、IP和IM四个序列,即偶实数、奇实数、偶虚数和奇虚数四部分。第四步,产生2N点的复数FFT输出序列产生2N=256个点的复数输出,它与原始的256个点的实输入序列的DFT一致。如图7-24所示。返回本节7.7.2 FFT运算模拟信号的产生及输入产生模拟输入信号可以有两种方法,第一种方法是用C语言程序产生mdata.inc文件,然后,在DSP汇编语言程序中通过.copy汇编命令将生成的数据文件mdata.inc复制到汇编程序中,如例7-12和例7-15,数据起始地址标号为INPUT,段名为INPUT。第二种方法是首先建立与输入信号对应的数据流文件mdata.dat,其

温馨提示

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

评论

0/150

提交评论