TMS320C54x的汇编语言程序设计报告课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《TMS320C54x的汇编语言程序设计报告课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- TMS320C54x 汇编语言 程序设计 报告 课件
- 资源描述:
-
1、第5章TMS320C54x的汇编语言程序设计第1页,共93页。知识要点:本章涉及的内容包括汇编语言源程序的格式、常数、字符串、符号和表达式的规定;堆栈的使用方法;分支、调用、返回等控制程序;加法、乘法、除法、长字和并行等算术运算程序;单指令、块重复、循环嵌套等重复操作程序;数据块传送程序;小数运算程序以及浮点运算程序等。第2页,共93页。5.1 概述 TMS320C54x汇编语言源程序由源语句组成。这些语句可以包含汇编语言指令、汇编伪指令和注释。程序的编写必须符合一定的格式,以便汇编器将源文件转换成机器语言的目标文件。下面将介绍汇编语言源程序的格式、各种常数、符号、字符串和表达式的规定。第3页
2、,共93页。5.1.1 汇编语言源程序格式 汇编语言程序以.asm为扩展名,可以用任意的编辑器编写源文件。一句程序占源程序的一行,每行字符最多200个,如果长度超过200,则汇编器截去行尾的多余字符,并发出一个警告。第4页,共93页。源文件格式 助记符指令源语句的每一行通常包含4个部分:标号区、助记符区、操作数区和注释区。助记符指令语法格式如下:label:mnemonic operand list ;comment 标号区 助记符区 操作数区 注释区第5页,共93页。例 助记符指令源语句举例。NANHUA .set 1;符号NANHUA=1 Begin:LD#NANHUA,AR1;将1加载到
3、AR1 汇编语句书写格式应遵循一定规则。这些规则如下:所有语句必须以一个标号、空格、星号或分号开始;标号是可选项,若使用标号,则标号必须从第一列开始;包含有一个汇编伪指令的语句必须在一行完全指定;每个区必须用一个或多个空格分开,Tab字符与空格等效。程序中注释是可选项。在第一列用*号或;号,其它列用;号。若源程序很长,需要书写若干行,可在前一行用反斜杠()结束,余下接着在下一行继续书写。第6页,共93页。标号区 所有汇编指令和大多数汇编伪指令前面都可以选择语句标号。使用语句标号时,必须从源语句第一列开始。标号最多为32个字符,由(AZ,az,09,_和$)等组成。标号分大小写,第一个字符不能用
4、数字。标号后面带冒号:在使用标号时,标号的值是段程序计数器(SPC)的当前值。第7页,共93页。例5.1.2 标号格式举例。标号Start的值为40h:9 000000 ;假设汇编了某个其他代码10 000040 000A Start:.word 0Ah,3,7 000041 0003 000042 0007第8页,共93页。在一行中的标号本身是一个有效的语句。标号将段程序计数器(SPC)的当前值赋给标号,等效于下列伪指令语句:label .set$;$提供SPC当前值 如果标号单独占一行时,它将指到下一行的指令(SPC不增加):3 000043 Here:4 000043 0003 .wor
5、d 3 第9页,共93页。助记符指令区 在助记符汇编语言中,紧接在标号区后面的是助记符区和操作数区。助记符区 助记符区跟在标号区的后面。助记符指令可以是汇编语言指令、汇编伪指令、宏伪指令。助记符区不能从第一列开始。助记符区可以包含如下操作码。机器指令助记符,一般用大写;汇编伪指令、宏伪指令。以英文句号“.”开头,且为小写;宏调用。第10页,共93页。操作数区 操作数区是跟在助记符区后面的一系列操作数,由一个和多个空格分开。操作数可以是符号、常数或是符号与常数组合的表达式。操作数之间一定用逗号“,”分开。对操作数前缀的规定。汇编器允许将常数、符号或表达式作为地址、立即数或间接地址。指令操作数遵循
6、以下规定:前缀“#”后面的操作数是一个立即数。前缀“*”后面的操作数是一个间接地址。第11页,共93页。注释区 注释是任选项。注释可以由ASC码和空格组成。第12页,共93页。5.1.2 汇编语言中的常数与字符串 汇编器支持以下几种类型的常数(常量)。二进制整数 二进制整数常量最多由16位二进制数字(0或1)组成,后缀为B(或b)。如果数字小于16位,汇编器将其右边对其,并在前面补零。例如:10001000B 136(十进制)0111100b 60(十进制)10b 2(十进制)10001111B 143(十进制)第13页,共93页。八进制整数 八进制整数型常量最多由6位八进制数字(07)组成,
7、后缀为Q(或q)或前缀为0 例如:100011Q 32777(十进制)124q 84(十进制)对八进制常数也可使用C语言的记号,即加前缀0。0100011 32777(十进制)0124 84(十进制)第14页,共93页。十进制整数 十进制整数型常量由十进制数字串组成,无后缀。取值范围为:-3276832767或065535。例如:2118 2118(十进制)65535 65535(十进制)-32768 -32768(十进制)第15页,共93页。十六进制整数 十六进制整数常量最多由4位十六进制数字组成,带后缀H(或h)。例如:0DH 14(十进制)12BCH 4796(十进制)对十六进制常数也可
8、使用C语言的记号,即加前缀0 x:0 x0D 14(十进制)0 x12BC 4796(十进制)第16页,共93页。浮点数 浮点整型常量由一串十进制数字组成,可以带小数点、分数和指数部分。浮点数的表示方法为 n.nE|e n n代表一串十进制数,小数点必须指定。例如99.e9是有效数,但99e9非法。汇编时间常数 在程序中使用.set伪指令给一个符号赋值,该符号就成为一个汇编时间常数,等效于一个常数。赋给符号的必须是绝对值。例如将常数值18赋给符号nan_hua,即 nan_hua .set 18 LD#nan_hua,A第17页,共93页。也可以用.set伪指令将符号常数赋给寄存器名。此时,该
9、符号变成了寄存器替代名。例如:AuxR1 .set AR1 MVMM AuxR1,SP 字符常数 字符常数是包括单引号内的字符串。若单引号之间没有字符,则值为0。每个字符在内部表示为8位ASC码。例如:a 内部表示为61h B 内部表示为42h第18页,共93页。字符串 字符串是由双引号括起来的一串字符。字符串的最大长度是可以变化的,由要求字符串的伪指令来设置。字符在内部用8位ASC码来表示。例如:“example”定义了一个长度为7的字符串:example第19页,共93页。5.1.3 汇编源程序中的符号 汇编源程序中的符号用于标号、常数和替代字符。符号名最多可长达200个字符,由字母、数字
10、以及下划线和美元符号(AZ,az,09,_和$)等组成。标号分大小写。在符号中,第一个字符不能用数字,符号中不能含空格。第20页,共93页。标号 用做标号(labels)的符号代表在程序中对应位置的符号地址。通常标号是局部变量,在一个文件中局部使用的标号必须是惟一的。标号还可以作为.global,.ref,.def或.bss等汇编伪指令的操作数。如:.global label lable1 NOP ADD label,B B label1第21页,共93页。符号常数 符号也可被设置成常数值。这样可以用有意义的名称来代表一些重要的常数值,提高程序的可读性。例5.1.3 定义符号常数举例。N .s
11、et 512 ;定义常数 buffer .set 4*N nzg1 .set 1 nzg2 .set 2 nzg3 .set 3 item .struct ;item结构定义 .int nzg1 ;常数偏移nzg1=1 .int nzg2 ;常数偏移nzg2=2 .int nzg3 ;常数偏移nzg2=3 tang_ning .endstruct array .tag item ;声明数组 .bss array,tang_ning*N 第22页,共93页。定义符号常数(-d选项)使用-d选项可以将常数值与一个符号等同起来。定义以后,在汇编源文件中可用符号代替和它等同的值。-d选项的格式如下:a
12、sm500 -d name=value 在汇编源程序中,可以用下表所列的伪指令来检测符号:检测类型 使用的伪指令 存在 不存在 与值相等 与值不相等.if$isdefed(“name”).if$isdefed(“name”)=0.if name=value.if name!=value注意,内部函数$isdefed中的变量必须在双引号内。第23页,共93页。预先定义的符号常数 汇编器有若干预先定义的符号,包括:$,美元符号,代表段程序指针的当前值;寄存器符号包括AR0AR7;_large_model指定存储器模式。默认值为0,由-mk选项可以设置为1。第24页,共93页。替代符号 可将字符串值
13、(变量)赋给符号,这时符号名与该变量等效,成为字符串的别名。这种用来代表变量的符号称为替代符号。当汇编器遇到替代符号时,将用字符串值代替它。可在程序中的任何地方将变量赋给替代符号。例如:.asg “high”,AR2 ;寄存器AR2用high替代第25页,共93页。局部标号 局部标号是一种特殊的标号,使用的范围和影响是临时性的。局部标号可用以下方法定义:用$n来定义,这里n是09的十进制数。用NAME?定义,其中NAME是任何一个合法的符号名。第26页,共93页。下面举例说明局部标号$n的格式。该例中假设符号ADDRA,ADDRB,ADDRC已经在前面做了定义。例5.1.4 合法、非法局部标号
14、$n举例。合法使用局部标号的代码段 Label1:LD ADDRA,A ;将ADDRA装入A SUB ADDRB,A ;A减去地址ADDRB BC$1,ALT ;结果小于0,转到$1 LD ADDRB,A ;否则将ADDRB装入A B$2 ;转移到$2$1 LD ADDRA,A ;将ADDRA装入A$2 ADD ADDRC,A ;加上ADDRC .newblock ;取消$1 的定义,使它可再 次被使用 BC$1,ALT ;若小于0,转移到$1 STL A,ADDRC ;存A低16位$1 NOP 第27页,共93页。非法使用局部标号的代码段 Label1:LD ADDRA,A SUB ADDR
15、B,A BC$1,ALT LD ADDRB,A B$2$1 LD ADDRA,A$2 ADD ADDRC,A BC$1,ALT STL A,ADDRC$1 NOP ;错误,$1 被多次 定义 第28页,共93页。例5.1.5 name?形式的局部标号的使用 ;局部标号局部标号 mylab 的第一个定义的第一个定义nopmylab?nop bmylab?mylab?nop bmylab?maymac .macromylab?nop bmylab?.sect “Secto_One”nopmylab?.word 0 nop nop bmylab?.newblockmylab?.word0 nop n
16、op bmylab?第29页,共93页。5.1.4 汇编源程序中的表达式 表达式可以是常数、符号,或者是由算术运算符分开的一系列常数和符号。有效表达式值的范围从-3276832767。影响表达式计算顺序的因素主要有以下3个:圆括号()。圆括号内的表达式最先计算。优先级。见表3.2.2。优先级高的先计算。从左到右运算。具有相同优先级的运算按从左 到右顺序计算。第30页,共93页。运算符 第3章中的表列出了可用在表达式中的运算符。TMS320C54x汇编器使用与C语言相似的优先级。条件表达式 汇编器支持关系运算符,可以用于任何表达式,这对条件汇编特别有用。有以下几种关系运算符:=等于;=等于;!=
17、不等于;=大于或等于;大于;小于 条件表达式为真是值为1,否则为0。表达式两端的 操作数类型必须相同。第31页,共93页。有效定义的表达式 某些汇编器要求有效定义的表达式作为操作数。操作数是汇编时间常数或链接时可重定位的符号。例5.1.6 有效定义表达式.dataLabel.word0.word1.word2Label.word3X.set50hgoodsym1.set100h+Xgoodsym2.set$goodsym3.setlabel1goodsym4.setlabel2-label2第32页,共93页。.global Ybadsym1.setybadsym2.set50h+Ybadsy
18、m3.set50h+zZ.set60h例5.1.7 无效的定义表达式第33页,共93页。表达式上溢和下溢 汇编时执行了算术运算以后,汇编器检查上溢和下溢的条件。无论上溢和下溢的出现,它都会发出一个值被截断了的警告。汇编器不检查乘法的溢出状态。可重新定位符号和合法表达式 表5.1.2列出了有关绝对符号、可重新定位符号,以及外部符号的有效操作。表达式不能包含可重新定位符号和外部符号的乘或除,表达式中也不能包含对其他的段可重新定位但不能被分辨的符号。第34页,共93页。表表5.1.2 带有关绝对符号和可重新定位符号的表达式带有关绝对符号和可重新定位符号的表达式第35页,共93页。以下例子说明了在表达
19、式中绝对符号和可重新定位符号的使用。.global extern_1 ;定义在外部模块中 intern_1 .word “D”;可重新定位,在现行模块中定义 LAB1:.set 2 ;LAB1=2不可重新定位(绝对符号)intern_2 ;可重新定位,在现行模块中定义第36页,共93页。例例 5.1.8LDextern_1-10,B ;合法合法LD10-extern_1,B ;不能将可重新定义符号变为负;不能将可重新定义符号变为负LDextern_1/10,B ;不能将可重新定义符号乘除;不能将可重新定义符号乘除LDintern_1+extern_1,B;无效的加操作;无效的加操作例例 5.1
20、.9LDintern_1-intern_2+extern_1,B ;合法;合法LDintern_1+intern_2+extern_1,B ;非法;非法LDintern_1+extern_1-intern_2,B ;非法;非法第37页,共93页。5.9 堆栈的使用方法 当程序调用中断服务程序或子程序时,需要将程序计数器PC值和一些重要的寄存器值进行压栈保护,以便程序返回时能从间断处继续执行。C54x提供一个用16位堆栈指正(SP)寻址的软件堆栈。当向堆栈中压入数据时,堆栈是从高地址向低地址方向填入的。第38页,共93页。如果程序中要用堆栈,必须先进行设置,方法如下:size .set 120
21、stack .usect “STACK”,size STM#stack+size,SP第39页,共93页。堆栈区的大小可以按照以下步骤来确定。先开辟一个较大的堆栈区,用已知数重填。LD#-9224,B STM#length,AR1 MVMM SP,AR4 loop:STL B,*AR4-BANZ loop,*AR1-第40页,共93页。执行以上程序后,堆栈区中的所有单元均重填0DBF8h。运行程序。检查堆栈中的数值。DBF8DBF8DBF8DBF8DBF8DBF8数据RAM图5.2.1 堆栈区大小的确定第41页,共93页。5.3 控制程序 TMS320C54x具有丰富的程序控制指令,利用这些指
22、令可以执行分支转移、子程序调用、子程序返回、条件操作以及循环操作等控制操作。第42页,共93页。5.3.1 分支操作程序 程序控制中的分支操作包括:分支转移、子程序返回和条件操作。分支转移程序 通过传送控制到程序存储器的其他位置,分支转移会中断连续的指令流。分支转移回影响在PC产生和保存的程序地址。分支转移操作分成两种形式:无条件分支转移和条件分支转移,两者都可以带延时操作和不带延时操作。如表5.3.1。P149 第43页,共93页。例5.3.1 分支转移举例 STM#88H,AR0 LD#1000H,A zhangshan:SUB AR0,A BC zhangshan,AGT,AOV第44页
23、,共93页。子程序调用程序 子程序调用会中断连续的指令流,但与分支转移不同的是,这种传送是临时的。当函数的子程序被调用时,紧跟在调用后的下一条指令的地址保存在堆栈中。这个地址用于返回到调用程序并继续执行调用前的程序。子程序调用操作分成两种形式:无条件调用和条件调用,两者都可以带延时操作和不带延时操作,如表5.3.2。P149第45页,共93页。例5.3.2 子程序调用举例 STM#123H,AR0 LD#456H,AR1 CALL new LD AR1,16,A new:MPY AR0,AR1,A RET第46页,共93页。子程序返回程序 子程序返回程序可以使程序重新再被中断的连续指令处继续执
展开阅读全文