《DSP汇编语言程序设计.pptx》由会员分享,可在线阅读,更多相关《DSP汇编语言程序设计.pptx(58页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1内容提要汇编语言源程序的概述汇编语言源程序的概述堆栈的使用方法堆栈的使用方法控制程序控制程序算术运算算术运算1 12 23 34 4第1页/共58页23-1 汇编语言源程序概述 .asmasm为扩展名为扩展名 助记符指令语法格式助记符指令语法格式标号:助记符 操作数 ;注释第2页/共58页33-1 汇编语言源程序概述标号 冒号可选冒号可选;由字母、数字、下划线等组成;由字母、数字、下划线等组成;分大小写分大小写 供本程序或其它程序调用,标号的值是段程序计数器供本程序或其它程序调用,标号的值是段程序计数器SPCSPC的当前值(局部的符号的当前值(局部的符号地址地址)。)。例如,若使用例如,若使
2、用.wordword伪指令初始化几个字,则标号将指伪指令初始化几个字,则标号将指到第一个字。到第一个字。标号也可独立成行标号也可独立成行第3页/共58页43-1 汇编语言源程序概述 可作为可作为.globalglobal,.ref.ref,.def.def或或.bssbss等汇编伪指令的操作数等汇编伪指令的操作数 如:如:.def:在当前模块中定义,并可在别的模块中使用的符号。.ref:在当前模块中使用,但在别的模块中定义的符号。.global:可以是上面的任何一种情况。第4页/共58页53-1 汇编语言源程序概述操作数 指令中参与操作的数值或汇编伪指令定义的内容,紧跟在助记符的后面,由一个或
3、多个空格分开。指令中参与操作的数值或汇编伪指令定义的内容,紧跟在助记符的后面,由一个或多个空格分开。操作数前缀操作数前缀 “#”“#”:作为立即数:作为立即数 例如:例如:Label:ADD#99,BLabel:ADD#99,B “*”“*”:间接地址,即把操作数的内容作为地址间接地址,即把操作数的内容作为地址 例如:例如:Label:LD *AR3,B Label:LD *AR3,B“”“”:作为直接地址,即操作数由直接地址码赋值。:作为直接地址,即操作数由直接地址码赋值。例如:例如:Label:LD x,A Label:LD x,A第5页/共58页63-1 汇编语言源程序概述汇编语言中的数
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 0 x xA40 A40 浮点数 1.623 1.623e-23e-23仅用于仅用于C C语言语言 字符 D D 字符串 “this is a stringthis is a string”第6页/共58页73-1 汇编语言源程序概述汇编时间常
5、数.set 使用使用.setset伪指令给一个符号赋值,该符号就成为一个汇编时间常数,等效于一个常数。伪指令给一个符号赋值,该符号就成为一个汇编时间常数,等效于一个常数。将符号常数赋给寄存器名。此时,该符号变成了寄存器的替代名。将符号常数赋给寄存器名。此时,该符号变成了寄存器的替代名。第7页/共58页83-1 汇编语言源程序概述局部标号 局部标号是一种特殊的标号,使用的范围和影响是临时性的局部标号是一种特殊的标号,使用的范围和影响是临时性的 定义方式:定义方式:用用$n n来定义。来定义。n n是是0909的十进制数的十进制数第8页/共58页93-1 汇编语言源程序概述局部标号举例:假设符号假
6、设符号假设符号假设符号ADDRAADDRAADDRAADDRA,ADDRBADDRBADDRBADDRB,ADDRCADDRCADDRCADDRC已经在前面作了定义。已经在前面作了定义。已经在前面作了定义。已经在前面作了定义。第9页/共58页103-1 汇编语言源程序概述符号:由AZ,az,09,_和$组成;第一位不能为数字;不能含空格;符号也可被设置成常数值。为了提高程序的可读性,可以用有意义的名称来代表一些重要的常数符号也可被设置成常数值。为了提高程序的可读性,可以用有意义的名称来代表一些重要的常数值。值。如:如:第10页/共58页113-1 汇编语言源程序概述汇编源程序中的表达式序号符
7、号运算操作求值顺序1 1+-+-!取正、取负、按位求补、逻辑负取正、取负、按位求补、逻辑负 从右至左从右至左2 2*/%/%乘法、除法、求模乘法、除法、求模从左至右从左至右3 3+-+-加法、减法加法、减法从左至右从左至右4 4 指数指数 从左到右从左到右 5 5左移、右移左移、右移从左至右从左至右6 6 =大于、大于等于大于、大于等于从左至右从左至右8 8!=!=不等于、等于不等于、等于 从左至右从左至右9 9&按位与运算按位与运算从左至右从左至右1010 按位异或运算按位异或运算从左至右从左至右1111|按位或运算按位或运算从左至右从左至右第11页/共58页123-2 堆栈的使用 当当程序
8、调用中断服务程序或子程序程序调用中断服务程序或子程序时,需要将程序计数器时,需要将程序计数器PCPC的值和一些重要的寄存器值进行压栈保护,以的值和一些重要的寄存器值进行压栈保护,以便程序返回时能从间断处继续执行。便程序返回时能从间断处继续执行。C54xC54x提供一个用提供一个用1616位堆栈指针位堆栈指针SPSP寻址的软件堆栈。寻址的软件堆栈。当向堆栈中压入数据时,堆栈是从当向堆栈中压入数据时,堆栈是从高地址向低地址高地址向低地址方向填入,堆栈指针方向填入,堆栈指针SPSP先减先减1 1,然后将数据压入,然后将数据压入堆栈。堆栈。当从堆栈中弹出数据时。数据先从堆栈中弹出当从堆栈中弹出数据时。
9、数据先从堆栈中弹出,然后堆栈指针然后堆栈指针SPSP加加1 1。第12页/共58页133-2 堆栈的使用方法堆栈的设置使用堆栈如:CALL pmad CALL pmad ;(SP)-1SP,(PC)+2TOS(SP)-1SP,(PC)+2TOS,pmadPCpmadPC RET RET ;(TOS)PC,(SP)+1SP(TOS)PC,(SP)+1SP 第13页/共58页143-2 堆栈的使用方法堆栈大小的确定 先开辟一个较大的堆栈区,用已知数填充先开辟一个较大的堆栈区,用已知数填充 如:如:LD#-9224LD#-9224,B B STM#length STM#length,AR1AR1 M
10、VMM SP MVMM SP,AR4AR4 loop loop:STL B STL B,*AR4-*AR4-BANZ loopBANZ loop,*AR1AR1-;堆栈区要充填的数堆栈区要充填的数堆栈区要充填的数堆栈区要充填的数0 0 0 0DBF8hDBF8hDBF8hDBF8h加载加载加载加载B B B B ;设置循环次数设置循环次数设置循环次数设置循环次数 ;设置数据指针设置数据指针设置数据指针设置数据指针AR4AR4AR4AR4,SPAR4SPAR4SPAR4SPAR4 ;循环,填充数据循环,填充数据循环,填充数据循环,填充数据 运行程序,执行所有堆栈操作运行程序,执行所有堆栈操作检查
11、堆栈中的数值检查堆栈中的数值vv用过的堆栈区就是实际需要的堆栈空间。用过的堆栈区就是实际需要的堆栈空间。数据RAMAR4DBF8DBF8DBF8DBF8DBF8SPDBF86B146B1400130013SPSP7AB37AB3用过的栈区用过的栈区第14页/共58页153-3 控制程序 C54xC54x具有丰富的程序控制指令,利用这些指令可以执行分支转移、子程序调用、子程序返回,条件执行具有丰富的程序控制指令,利用这些指令可以执行分支转移、子程序调用、子程序返回,条件执行以及循环等控制操作以及循环等控制操作 分支操作:分支操作:分支转移程序分支转移程序 子程序调用子程序调用 子程序返回子程序返
12、回 条件操作程序条件操作程序 比较转移比较转移 循环操作循环操作第15页/共58页163-3 控制程序 分支操作分支操作分支转移程序分支转移程序 改写改写PCPC值,使程序改变流向值,使程序改变流向 分支转移指令分支转移指令分 类 指 令 说 明 无条件无条件分支转移分支转移 BDBD 用该指令指定的地址加载用该指令指定的地址加载PC PC BACCDBACCD 用累加器的低用累加器的低1616位指定的地址加载位指定的地址加载PC PC 条条 件件分支转移分支转移 BCDBCD 若满足指令给定条件,用该指令指定的地址加载若满足指令给定条件,用该指令指定的地址加载 PC PC BANZDBANZ
13、D 若当前选择辅助寄存器不等于若当前选择辅助寄存器不等于0 0,用该指令指定的,用该指令指定的 地址加载地址加载PC PC 远远 程程分支转移分支转移 FBDFBD 用该指令指定的地址加载用该指令指定的地址加载PCPC和和XPC XPC FBACCDFBACCD 用累加器的低用累加器的低2323位指定的地址加载位指定的地址加载PCPC和和XPC XPC 第16页/共58页173-3 控制程序 例:STM#88H STM#88H,AR0AR0 LD#1000H LD#1000H,A A Loop1 Loop1:ADD AR0 ADD AR0,A A BC Loop1 BC Loop1,AGTAG
14、T,AOVAOV;若累加器若累加器A0A0且溢出则转至且溢出则转至 Loop1,Loop1,否则往下执行否则往下执行 u 例:例:第17页/共58页183-3 控制程序 B BC C Loop1 Loop1,AGTAGT,AOVAOV第18页/共58页193-3 控制程序 分支操作分支操作子程序调用子程序调用 当子程序被调用时,紧跟在调用后的下一条指令的地址保存在堆栈中。该地当子程序被调用时,紧跟在调用后的下一条指令的地址保存在堆栈中。该地址用于址用于返回时返回时能继续执行调用前的程序能继续执行调用前的程序分 类 指 令 说 明 无条件调用 CALLD CALLD 将返回的地址压入堆栈,并用该
15、指令指定的地址加载PC CALAD CALAD 将返回的地址压入堆栈,用累加器A或B指定的地址加载PC 条件调用 CCDCCD 如果满足指令给定条件,将返回的地址压入堆栈,并用该 指令指定的地址加载PC远程调用 FCALLD FCALLD 将XPC和PC压入堆栈,并用该指令指定的地址加载PC和XPC FCALAD FCALAD 将XPC和PC压入堆栈,用累加器的低23位指定的地址加载 PC和XPC 第19页/共58页203-3 控制程序 分支操作分支操作子程序返回子程序返回 子程序返回可使程序重新在被中断的连续指令处继续执行。子程序返回可使程序重新在被中断的连续指令处继续执行。返回指令通过将弹
16、出堆栈的值(包含将要执行的下一条指令的地址),送到程序计返回指令通过将弹出堆栈的值(包含将要执行的下一条指令的地址),送到程序计数器数器PCPC来实现返回功能。来实现返回功能。分 类 指 令 说 明 无条件返回 RETD RETD 将堆栈顶部的返回地址加载到将堆栈顶部的返回地址加载到PCPC。RETEDRETED 将堆栈顶部的返回地址加载到将堆栈顶部的返回地址加载到PCPC,并使能可屏蔽中断。并使能可屏蔽中断。RETFDRETFD 将将RTNRTN寄存器中的返回地址加载到寄存器中的返回地址加载到PCPC,并使能可屏蔽中并使能可屏蔽中断。断。条件返回 RCD RCD 如果满足指令给定条件,将堆栈
17、顶部的返回地址加载如果满足指令给定条件,将堆栈顶部的返回地址加载到到PCPC。远程返回 FCALLD FCALLD FCALAD FCALAD 第20页/共58页213-3 控制程序例:STM#123H,AR0 LD#456H,AR1 CALL new LD AR1,16,Anew:MPY AR0,AR1,A RET ;将操作数将操作数将操作数将操作数#123#123#123#123H H H H装入装入装入装入AR0AR0AR0AR0 ;将操作数将操作数将操作数将操作数#456#456#456#456H H H H装入装入装入装入AR1AR1AR1AR1 ;调子程序调子程序调子程序调子程序n
18、ewnewnewnew ;将将将将AR1AR1AR1AR1的内容左移的内容左移的内容左移的内容左移16161616位后装入位后装入位后装入位后装入A A A A ;AR0AR0AR0AR0与与与与AR1AR1AR1AR1的内容相乘的内容相乘的内容相乘的内容相乘,结果放入结果放入结果放入结果放入A A A A中中中中 ;子程序返回子程序返回子程序返回子程序返回 u 例:例:第21页/共58页223-3 控制程序 分支操作分支操作比较转移比较转移 指令:指令:CMPR CCCMPR CC,ARxARx 指令功能指令功能:辅助寄存器辅助寄存器ARxARx与与AR0AR0进行比较,若比较结果使所给定的
19、进行比较,若比较结果使所给定的测试条测试条件成立件成立,则则TCTC位置位置1 1。实现方法:实现方法:通过通过CMPRCMPR的比较结果得的比较结果得TCTC值;值;根据根据TCTC值,由条件转移指令实现分支转移。值,由条件转移指令实现分支转移。第22页/共58页233-3 控制程序 例如:例如:比较操作后条件分支转移比较操作后条件分支转移 STM#5,AR1 ;AR1=5 STM#10,AR0 ;AR0=10 loop:*AR1+;AR1=AR1+1 CMPR LT,AR1 ;若AR1 AR0,则TC=1,否则为0 BC loop,TC ;若AR1N。例:N=31N=31,k k的最小值为的最小值为5 5,则缓冲区的起始地址:,则缓冲区的起始地址:XXXX XXXX XXX0 0000BXXXX XXXX XXX0 0000B 若若N=32N=32,k k的最小值为的最小值为6 6,缓冲区的起始地址:,缓冲区的起始地址:XXXX XXXX XX00 0000B XXXX XXXX XX00 0000B使用循环缓冲区的使用循环缓冲区的FIRFIR实现实现FIR2.asm第56页/共58页57第57页/共58页58谢谢您的观看!第58页/共58页
限制150内