《DSP汇编语言程序设计实用教案》由会员分享,可在线阅读,更多相关《DSP汇编语言程序设计实用教案(59页珍藏版)》请在金锄头文库上搜索。
1、1内容提要(nirntyo)汇编语言汇编语言(hu bin y yn)(hu bin y yn)源程序的概述源程序的概述堆栈堆栈(duzhn)(duzhn)的使用方法的使用方法控制程序控制程序算术运算算术运算1 12 23 34 4第1页/共58页第一页,共59页。23-1 汇编语言(hu bin y yn)源程序概述 .asm .asm为扩展名为扩展名 助记符指令语法助记符指令语法(yf)(yf)格式格式 标号标号: : 助记符助记符 操作数操作数 ; ; 注释注释 第2页/共58页第二页,共59页。33-1 汇编语言(hu bin y yn)源程序概述标号冒号可选;由字母、数字、下划线等组
2、成;分大小写供本程序或其它程序调用,标号的值是段程序计数器SPC的当前值(局部(jb)的符号地址)。例如,若使用.word伪指令初始化几个字,则标号将指到第一个字。标号标号(bioho)也可独立成行也可独立成行第3页/共58页第三页,共59页。43-1 汇编语言(hu bin y yn)源程序概述 可作为可作为(zuwi).global(zuwi).global,.ref.ref,.def.def或或.bss.bss等汇编伪指令的操作数等汇编伪指令的操作数 如:如:.def:在当前模块中定义,并可在别的模块中使用(shyng)的符号。.ref:在当前模块中使用(shyng),但在别的模块中定义
3、的符号。.global:可以是上面的任何一种情况。 第4页/共58页第四页,共59页。53-1 汇编语言(hu bin y yn)源程序概述操作数指令中参与操作的数值或汇编伪指令定义的内容,紧跟在助记符的后面,由一个或多个空格分开。操作数前缀“#”:作为(zuwi)立即数例如:Label:ADD#99,B“*”:间接地址,即把操作数的内容作为(zuwi)地址例如:Label:LD*AR3,B“”:作为(zuwi)直接地址,即操作数由直接地址码赋值。例如:Label:LDx,A第5页/共58页第五页,共59页。63-1 汇编语言(hu bin y yn)源程序概述汇编语言(hubinyyn)中的
4、数据类型数据类型举 例说 明 二进制 1110001 1110001b b 或或 1110001 1110001B B 八进制 226 226q q 或或 572 572Q Q 十进制 1234 1234 或或 +1234 +1234 或或 -11234 -11234 缺省型缺省型 十六进制 0 0A40A40h h 或或 0 0A40A40H H 或或 0 0x xA40 A40 浮点数 1.623 1.623e-23e-23仅用于仅用于C C语言语言 字符 D D 字符串 “this is a stringthis is a string”第6页/共58页第六页,共59页。73-1 汇编语
5、言(hu bin y yn)源程序概述汇编时间常数.set使用.set伪指令给一个符号赋值,该符号就成为(chngwi)一个汇编时间常数,等效于一个常数。将符号常数赋给寄存器名。此时,该符号变成了寄存器的替代名。第7页/共58页第七页,共59页。83-1 汇编语言(hu bin y yn)源程序概述局部标号局部标号是一种特殊的标号,使用(shyng)的范围和影响是临时性的定义方式:用$n来定义。n是09的十进制数第8页/共58页第八页,共59页。93-1 汇编语言(hu bin y yn)源程序概述局部(jb) 标号举例: 假设符号假设符号假设符号假设符号(fho)ADDRA(fho)ADDR
6、A,ADDRBADDRB,ADDRCADDRC已经在前面作了定义。已经在前面作了定义。已经在前面作了定义。已经在前面作了定义。 第9页/共58页第九页,共59页。103-1 汇编语言(hu bin y yn)源程序概述符号:由AZ,az,09,_和$组成;第一位不能为数字;不能含空格;符号也可被设置成常数值。为了提高程序(chngx)的可读性,可以用有意义的名称来代表一些重要的常数值。如:第10页/共58页第十页,共59页。113-1 汇编语言(hu bin y yn)源程序概述汇编(hubin)源程序中的表达式序号符 号运算操作求值顺序1 1+ - + - !取正、取负、按位求补、逻辑负取正
7、、取负、按位求补、逻辑负 从右至左从右至左2 2* * / %/ %乘法、除法、求模乘法、除法、求模从左至右从左至右3 3+ -+ -加法、减法加法、减法从左至右从左至右4 4 指数指数 从左到右从左到右 5 5左移、右移左移、右移从左至右从左至右6 6 = = =大于、大于等于大于、大于等于从左至右从左至右8 8!= =!= =不等于、等于不等于、等于 从左至右从左至右9 9& &按位与运算按位与运算从左至右从左至右1010 按位异或运算按位异或运算从左至右从左至右1111| |按位或运算按位或运算从左至右从左至右第11页/共58页第十一页,共59页。123-2 堆栈(duzhn)的使用 当
8、程序调用中断服务程序或子程序时,需要将程序计数器当程序调用中断服务程序或子程序时,需要将程序计数器PCPC的值和一些重要的寄存器值进行压栈保护,以的值和一些重要的寄存器值进行压栈保护,以便程序返回时能从间断处继续执行。便程序返回时能从间断处继续执行。 C54xC54x提供一个用提供一个用1616位堆栈位堆栈(duzhn)(duzhn)指针指针SPSP寻址的软件堆栈寻址的软件堆栈(duzhn)(duzhn)。 当向堆栈当向堆栈(duzhn)(duzhn)中压入数据时,堆栈中压入数据时,堆栈(duzhn)(duzhn)是从高地址向低地址方向填入,堆栈是从高地址向低地址方向填入,堆栈(duzhn)(
9、duzhn)指针指针SPSP先减先减1 1,然后将数据压入堆栈,然后将数据压入堆栈(duzhn)(duzhn)。 当从堆栈当从堆栈(duzhn)(duzhn)中弹出数据时。数据先从堆栈中弹出数据时。数据先从堆栈(duzhn)(duzhn)中弹出中弹出, ,然后堆栈然后堆栈(duzhn)(duzhn)指针指针SPSP加加1 1。第12页/共58页第十二页,共59页。133-2堆栈的使用(shyng)方法堆栈(duzhn)的设置使用堆栈(duzhn)如:CALLpmad;(SP)-1SP,(PC)+2TOS,pmadPCRET;(TOS)PC,(SP)+1SP第13页/共58页第十三页,共59页。
10、143-2堆栈(duzhn)的使用方法堆栈大小(dxio)的确定先开辟一个较大的堆栈区,用已知数填充如:LD#-9224,BSTM#length,AR1MVMMSP,AR4loop:STLB,*AR4-BANZloop,*AR1- ;堆栈区要充填的数;堆栈区要充填的数;堆栈区要充填的数;堆栈区要充填的数0DBF8h0DBF8h加载加载加载加载B B ;设置循环次数;设置循环次数;设置循环次数;设置循环次数 ;设置数据;设置数据;设置数据;设置数据(shj)(shj)指针指针指针指针AR4AR4,SPAR4SPAR4 ;循环,填充数据;循环,填充数据;循环,填充数据;循环,填充数据(shj) (
11、shj) 运行程序,执行所有堆栈操作运行程序,执行所有堆栈操作检查堆栈中的数值检查堆栈中的数值vv用过的堆栈区就是实际需要的堆栈空间。用过的堆栈区就是实际需要的堆栈空间。数据RAMAR4DBF8DBF8DBF8DBF8DBF8SPDBF86B146B1400130013SPSP7AB37AB3用过的栈区用过的栈区第14页/共58页第十四页,共59页。153-3控制程序 C54xC54x具有丰富的程序控制指令具有丰富的程序控制指令(zhlng)(zhlng),利用这些指令,利用这些指令(zhlng)(zhlng)可以执行分支转移、子程序调用、子程可以执行分支转移、子程序调用、子程序返回,条件执行
12、以及循环等控制操作序返回,条件执行以及循环等控制操作 分支操作:分支操作: 分支转移程序分支转移程序 子程序调用子程序调用 子程序返回子程序返回 条件操作程序条件操作程序 比较转移比较转移 循环操作循环操作第15页/共58页第十五页,共59页。163-3控制程序 分支操作分支转移程序分支操作分支转移程序 改写改写PCPC值,使程序改变流向值,使程序改变流向(li xin)(li xin) 分支转移指令分支转移指令分 类 指 令 说 明 无条件无条件分支转移分支转移 BD BD 用该指令指定的地址加载用该指令指定的地址加载PC PC BACCD BACCD 用累加器的低用累加器的低1616位指定
13、的地址加载位指定的地址加载PC PC 条条 件件分支转移分支转移 BCD BCD 若满足指令给定条件,用该指令指定的地址加载若满足指令给定条件,用该指令指定的地址加载 PC PC BANZDBANZD 若当前选择辅助寄存器不等于若当前选择辅助寄存器不等于0 0,用该指令指定的,用该指令指定的 地址加载地址加载PC PC 远远 程程分支转移分支转移 FBD FBD 用该指令指定的地址加载用该指令指定的地址加载PCPC和和XPC XPC FBACCD FBACCD 用累加器的低用累加器的低2323位指定的地址加载位指定的地址加载PCPC和和XPC XPC 第16页/共58页第十六页,共59页。17
14、3-3控制程序例: STM #88H STM #88H,AR0AR0 LD #1000H LD #1000H,A A Loop1 Loop1: ADD AR0 ADD AR0 ,A A BC Loop1 BC Loop1,AGTAGT,AOVAOV;若累加器;若累加器A0A0且溢出且溢出(y ch)(y ch)则则转至转至 Loop1, Loop1,否则往下执行否则往下执行 u 例:例:第17页/共58页第十七页,共59页。183-3控制程序 B BC C Loop1 Loop1,AGTAGT,AOVAOV第18页/共58页第十八页,共59页。193-3控制程序 分支操作子程序调用分支操作子程
15、序调用(dioyng)(dioyng) 当子程序被调用当子程序被调用(dioyng)(dioyng)时,紧跟在调用时,紧跟在调用(dioyng)(dioyng)后的下一条指令的地址保存在堆栈中。该地址用后的下一条指令的地址保存在堆栈中。该地址用于返回时能继续执行调用于返回时能继续执行调用(dioyng)(dioyng)前的程序前的程序分 类 指 令 说 明 无条件调用 CALLD CALLD 将返回的地址压入堆栈,并用该指令指定的地址加载PC CALAD CALAD 将返回的地址压入堆栈,用累加器A或B指定的地址加载PC 条件调用 CCD CCD 如果满足指令给定条件,将返回的地址压入堆栈,并
16、用该 指令指定的地址加载PC远程调用 FCALLD FCALLD 将XPC和PC压入堆栈,并用该指令指定的地址加载PC和XPC FCALAD FCALAD 将XPC和PC压入堆栈,用累加器的低23位指定的地址加载 PC和XPC 第19页/共58页第十九页,共59页。203-3控制程序 分支操作子程序返回分支操作子程序返回 子程序返回可使程序重新在被中断的连续指令处继续执行。子程序返回可使程序重新在被中断的连续指令处继续执行。 返回指令通过返回指令通过(tnggu)(tnggu)将弹出堆栈的值(包含将要执行的下一条指令的地址),送到程序计数器将弹出堆栈的值(包含将要执行的下一条指令的地址),送到
17、程序计数器PCPC来实来实现返回功能。现返回功能。分 类 指 令 说 明 无条件返回 RETD RETD 将堆栈顶部的返回地址加载到将堆栈顶部的返回地址加载到PCPC。 RETED RETED 将堆栈顶部的返回地址加载到将堆栈顶部的返回地址加载到PCPC,并使能可屏蔽中断。并使能可屏蔽中断。 RETFD RETFD 将将RTNRTN寄存器中的返回地址加载到寄存器中的返回地址加载到PCPC,并使能可屏蔽中并使能可屏蔽中断。断。 条件返回 RCD RCD 如果满足指令给定条件,将堆栈顶部的返回地址加载如果满足指令给定条件,将堆栈顶部的返回地址加载到到PCPC。 远程返回 FCALLD FCALLD
18、 FCALAD FCALAD 第20页/共58页第二十页,共59页。213-3控制程序例: STM #123H,AR0 LD #456H,AR1 CALL new LD AR1,16,Anew: MPY AR0,AR1,A RET ;将操作数;将操作数;将操作数;将操作数#123H#123H#123H#123H装入装入装入装入AR0AR0AR0AR0 ;将操作数;将操作数;将操作数;将操作数#456H#456H#456H#456H装入装入装入装入AR1AR1AR1AR1 ;调子程序;调子程序;调子程序;调子程序newnewnewnew ;将将将将AR1AR1AR1AR1的的的的内内内内容容容容
19、(nirng)(nirng)(nirng)(nirng)左左左左移移移移16161616位位位位后后后后装装装装入入入入A A A A ;AR0AR0AR0AR0与与与与AR1AR1AR1AR1的的的的内内内内容容容容(nirng)(nirng)(nirng)(nirng)相相相相乘乘乘乘, , , ,结结结结果果果果放放放放入入入入A A A A中中中中 ;子程序返回;子程序返回;子程序返回;子程序返回 u 例:例:第21页/共58页第二十一页,共59页。223-3控制程序 分支操作比较转移分支操作比较转移 指令:指令: CMPR CC CMPR CC,ARx ARx 指令功能:指令功能:
20、辅助寄存器辅助寄存器ARxARx与与AR0AR0进行比较,若比较结果使所给定的测试条件成立进行比较,若比较结果使所给定的测试条件成立(chngl),(chngl),则则TCTC位置位置1 1。 实现方法:实现方法: 通过通过CMPRCMPR的比较结果得的比较结果得TCTC值;值; 根据根据TCTC值,由条件转移指令实现分支转移。值,由条件转移指令实现分支转移。 第22页/共58页第二十二页,共59页。233-3控制程序 例如:比较例如:比较(bjio)(bjio)操作后条件分支转移操作后条件分支转移 STM #5,AR1 ; AR1=5 STM #5,AR1 ; AR1=5 STM #10,A
21、R0 ; AR0=10 STM #10,AR0 ; AR0=10 loop: loop: *AR1+ ; AR1=AR1+1 *AR1+ ; AR1=AR1+1 CMPR LT,AR1 ; CMPR LT,AR1 ; 若若AR1 AR0AR1 AR0,则,则TC=1TC=1,否则为,否则为0 0 BC loop, TC ; BC loop, TC ;若若AR1 AR0AR1N。例:N=31,k的最小值为5,则缓冲区的起始地址(dzh):XXXXXXXXXXX00000B若N=32,k的最小值为6,缓冲区的起始地址(dzh):XXXXXXXXXX000000B使用循环使用循环(xnhun)(xn
22、hun)缓冲区的缓冲区的FIRFIR实现实现FIR2.asmFIR2.asm第56页/共58页第五十六页,共59页。57第57页/共58页第五十七页,共59页。58谢谢您的观看(gunkn)!第58页/共58页第五十八页,共59页。内容(nirng)总结1。“”:作为直接地址,即操作数由直接地址码赋值。不等于、等于。设置数据指针AR4,SPAR4。3-3 控制程序。辅助寄存器ARx与AR0进行比较,若比较结果使所给定的测试条件成立,则TC位置1。先判断,再修正AR2=AR2-1。取a值,T=a。完成ax乘积,B=ax。假设字长4位,累加器8位(Q3格式)。在一个机器周期内需要(xyo)一次读和一次写操作。可与其他指令结合,可在同样的机器周期内完成这些操作第五十九页,共59页。