MS320C54x汇编语言程序设计.ppt
《MS320C54x汇编语言程序设计.ppt》由会员分享,可在线阅读,更多相关《MS320C54x汇编语言程序设计.ppt(242页珍藏版)》请在三一办公上搜索。
1、第4章 TMS320C54x汇编语言程序设计,4.1 TMS320C54x汇编语言的基本概念 4.2 TMS320C54x汇编语言程序设计的基本方法 4.3 TMS320C54x汇编语言程序的编辑、汇编与链接过程 4.4 汇编器 4.5 链接器 4.6 Simulator的使用方法 4.7 汇编程序举例,4.1 TMS320C54x汇编语言的基本概念,4.1.1 TMS320C54x汇编语句的组成 汇编语言源程序中的每一行语句都可以由四部分组成,句法格式如下:标号:助记符 操作数;注释 其中,为选项。书写规则如下:,(1)所有语句必须以标号、空格、星号(*)或分号开始。(2)所有包含伪指令的语
2、句必须在一行内完全指定。(3)若使用标号,则标号必须从第一列开始。(4)语句的每部分必须用一个或多个空格分开,Tab键与空格等效。,1标号 所有指令或大多数伪指令前面都可带有语句标号,供本程序的其他部分或其他程序调用。标号是任选项,标号后可以加也可以不加冒号(:)。标号必须从第一列开始,其最多可长达32个字符(AZ,az,09,_和$),但第一个字符不能是数字。引用标号时,标号的大小写必须一致,标号的值就是段程序计数器(SPC)的当前值。若不用标号,则第一个字母必须为空格、分号或星号(*)。,2助记符 助记符跟在标号的后面。助记符不能从第一列开始。助记符包含指令、伪指令、宏命令和宏调用。作为指
3、令,一般用大写;伪指令和宏命令则以句号(.)开始,且为小写。伪指令可以形成常数和变量,当用它控制汇编和链接过程时,可以不占存储空间。,3操作数 操作数是指指令中的操作数或伪指令中定义的内容。操作数之间必须用逗号(,)分开。有的指令无操作数,如指令NOP。指令中的操作数可以是寄存器、地址、常数、算术或逻辑表达式。4注释 注释从分号(;)开始,可以放在指令或伪指令的后面,也可以单独占一行或数行。注释是任选项。如果注释从第1列开始,也可以用星号(*)。,4.1.2 TMS320C54x汇编语言中的常数、字符串、符号与表达式 1常数和字符串 常数就是指令中出现的那些固定值。汇编器支持7种类型的常数:二
4、进制数、十进制数、八进制数、十六进制数、字符常数、字符串和浮点常数。二进制数:二进制数字(0或1),其后缀为B(或b)。十进制数:用数字09表示,无后缀。,八进制数:用数字07表示,其后缀为Q或q。十六进制数:用数字09及字母AF表示,其后缀为h或H。字符常数:是由单引号()括起来的1或2个字符组成的字符串,每个字符在内部表示为8位ASCII码。字符串:是由双引号(“”)括起来的一串字符。浮点常数:是一串十进制数,可带小数点、分数和指数部分。,2符号 符号用作标号、常数和替代符号。符号名可以是长达200个字符的字母(AZ,az)、数字(09)加上$或下划线(_)。第一个字符不能是数字,符号中间
5、不能有空格。符号分大小写,例如:Abc。,3表达式 1)运算顺序 影响表达式运算顺序的三个主要因素是:圆括号、优先级和同级运算顺序。圆括号内的表达式最先运算,不能用 或 来代替()。TMS320C54x汇编器的优先级使用与C语言类似,优先级高的运算先执行。表4-1给出了表达式中可用的运算符及优先级。,表4-1 表达式的运算符及优先级,2)表达式溢出 在汇编的过程中执行算术运算后,汇编器将检查溢出状态。一旦出现上溢和下溢,它都发出值被截断了的警告信息,但在做乘法时,汇编器不检查溢出状态。3)条件表达式 汇编器在任何表达式中都支持关系操作,这对条件汇编特别有用。关系运算符如下:=(等于)=(等于)
6、!=(不等于)=(大于等于)(大于)(小于),4)表达式的合法性 表达式在使用符号时,汇编器对符号在表达式中的使用具有一些限制,由于符号的属性不同(即定义不同),使表达式存在合法性问题。符号按属性可分为三种:外部符号、可重定位符号和绝对符号。,由伪指令.global定义的符号和寄存器被称为外部符号。在汇编和执行阶段,符号值、符号地址不同的是可重定位符号,相同的是绝对符号。含有乘、除法的表达式中只能使用绝对符号(其值不能改变)。表达式中不能使用未定义的符号。表4-2给出了表达式符号的合法性。,表4-2 表达式符号的合法性,4.1.3 TMS320C54x伪指令 TMS320C54x伪指令给程序提
7、供数据、控制汇编过程。具体实现以下任务:(1)将数据和代码汇编到特定的段。(2)为未初始化的变量保留存储空间。(3)控制展开列表的形式。(4)存储器初始化。,(5)汇编条件块。(6)定义全局变量。(7)指定汇编器可以获得宏的特定库。(8)检查符号调试信息。常用的伪指令如表4-3所示。,表4-3 常 用 伪 指 令,1段定义伪指令段定义伪指令有以下五个:.bss(未初始化段).data(已初始化段).sect(已初始化段).text(已初始化段).usect(未初始化段),1)未初始化段.bss和.usect命令建立未初始化段。未初始化段就是TMS320C54x存储器中的保留空间,它通常被定位在
8、RAM区。在目标文件中,这些段中没有确切内容,在程序运行时,可以利用这些存储空间存放变量,变量一般存放于数据存储器区域中。这两条命令的句法如下:.bss 符号,字数 符号.usect“段名”,字数,2)已初始化段.text、.data和.sect命令建立已初始化段。已初始化段包括可执行代码或已初始化的数据。在目标文件中,这些段中都有确切内容,当加载程序时再将这些内容放到TMS320C54x的存储器中。每个初始化段都可以重新定位,也可以引用在其他段中定义的符号,链接器会自动处理段间的相互引用。这三条命令的句法如下:.text 段起点.data 段起点.sect 段名”,段起点,.text后是汇编
9、语言程序的正文。经汇编后,.text后的是可执行程序代码,一般存放于程序存储器区域中。.data后是已初始化数据,有int和word两种数据形式。由命令文件可以将定义的数据存放于程序或数据存储器中。.sect建立包含代码和数据的自定义段,常用于定义中断向量表。,2常数初始化伪指令 常数初始化伪指令如表4-4所示。,表4-4 常数初始化伪指令,(1).bes和.space。汇编器对这些保留的位填0,将位数乘以16来实现保留字。(2).field。此指令可以把多个域打包成一个字,汇编器不会增加SPC的值,直至填满一个字。(3).float和.xfloat。这两个指令将32位浮点数存放在当前段的连续
10、字中,高位字先存。.float伪指令能自动按长字(偶地址)边界排列,但.xfloat不能。,(4).long和.xlong。这两个指令将32位数存放在当前段的连续字中,高位字先存。.long伪指令能自动按长字(偶地址)边界排列,但.xlong不能。(5).string和.pstring。.string类似于.byte,把8位字符放到当前段的连续字中,每8位字符占一个字。(6).int和.word。例如“table:.int 1,2,3,4”,或例“table:.word 8,6,4,2”。,3段程序计数器定位伪指令 段程序计数器定位伪指令的句法如下:.align size in bits 该指
11、令使段程序计数器SPC对准1128字的边界,保证该指令后面的代码从一个字或页的边界开始。不同的操作数代表了不同的含义:“1”表示让SPC对准字边界;“2”表示让SPC对准长字/偶地址边界;“128”表示让SPC对准页边界。当.align不带操作数时,其缺省值为128,即对准页边界。,4输出列表格式伪指令 表4-5列出了输出列表格式伪指令。,表4-5 输出列表格式伪指令,表中,.option操作数所代表的含义如下:B:把.byte伪指令的列表限制在一行里。L:把.long伪指令的列表限制在一行里。M:关掉列表中的宏扩展。R:复位B、M、T和W选项。T:把.string伪指令的列表限制在一行里。W
12、:把.word伪指令的列表限制在一行里。X:产生一个符号交叉参照列表。,5文件引用伪指令文件引用伪指令如表4-6所示。,表4-6 文件引用伪指令,6条件汇编伪指令 以下分两种情况介绍条件汇编伪指令。(1)第一种情况:.if well-defined expression.elseif well-defined expression.else.endif,(2)第二种情况:.loopwell-defined expression.breakwell-defined expression.endloop,7符号定义伪指令符号定义伪指令如表4-7所示。,表4-7 符号定义伪指令,8其他伪指令其他伪指
13、令如表4-8所示。,表4-8 其 他 伪 指 令,4.1.4 TMS320C54x宏命令 TMS320C54x汇编器支持宏语言。宏命令是源程序中具有独立功能的一段程序代码,它可以根据用户的需要,由用户创建自己的指令。宏命令一经定义,便可在以后的程序中多次调用,从而可以简化和缩短源程序。其功能如下:,定义自己的宏,重新定义已存在的宏;简化长的或复杂的汇编代码;访问由归档器创建的宏库;处理一个宏中的字符串;控制展开列表。,1宏定义 宏命令可以在源程序的任何位置定义,但必须在宏调用之前先定义好。宏定义也可以嵌套。定义如下:宏命令名.macro;宏体;.endm,2调用 宏命令定义好之后,就可以在源程
14、序中将宏命令名作为指令来调用这个宏了。格式如下:宏命令名,3宏展开 当源程序中调用宏命令时,汇编时就将宏命令展开。在宏展开时,汇编器将实际参数传递给形式参数,再用宏定义替代宏调用语句,并对其进行汇编。上例的宏展开如下:1 1000001000!LDabc,A 1000010000!ADD def,A 1000020000!ADD ghi,A 1000038000!STL A,adr,4.2 TMS320C54x汇编语言程序设计的基本方法,DSP的软件开发一般有以下几种方式:(1)直接编写汇编语言源程序;(2)编写C语言程序;(3)混合编程(既有C代码,又含汇编代码)。,4.2.1 TMS320
15、C54x汇编语言源程序的完整结构 汇编语言源程序中,以.asm为程序的扩展名,程序员用“段”伪指令来组织程序的结构。程序一般由数据段、堆栈段和代码段组成。在4.1.3节中,我们介绍了五个段定义伪指令,.data用于存放有初值的数据块;.usect用于为堆栈保留一块存储空间;.text用于设置代码段。另外,.bss用于为变量保留一块存储空间;.sect常用于定义中断向量表。程序的基本结构有四种:顺序结构、分支结构、循环结构和子程序结构。,4.2.2 顺序结构程序 顺序结构是最基本、最简单的程序结构形式,程序中的语句或结构被连续执行。【例1】试编制程序,求出下列公式中z的值。z=(x+y)8-w
16、源程序编制如下:*ex41.asm z=(x+y)*8-w*,.title ex41.asm.mmregsSTACK.usectSTACK,10H;开辟堆栈空间.bss x,1;为变量分配4个字的空间.bss y,1.bss w,1.bss z,1.def start.data,table:.word 6,7,9.text start:STM#0,SWWSR;零等待状态 STM#STACK+10H,SP;设置堆栈指针 STM#x,AR1;AR1指向x RPT#2;从程序存储器传送3个值至数据存储器 MVPD table,*AR1+LD x,A,ADD y,A;A=x+y LD A,3;A=(x
17、+y)*8 SUB w,A;A=(x+y)*8-w STL A,zend:B end.end,4.2.3 分支结构程序 程序的分支主要是靠条件转移指令来实现的。TMS320C54x具有丰富的程序控制与转移指令(见3.2.2节),利用这些指令可以执行分支转移、循环控制以及子程序操作。分支转移指令(如B、BACC、BC等)通过改写PC,以改变程序的流向。分支结构也称条件结构。,【例2】试编制程序,求一个数的绝对值,并送回原处。源程序编制如下:*ex42.asm ABS of positive or negative*.title ex42.asm.mmregs,STACK.usect STACK,
18、10H;开辟堆栈空间.bss x,1;为变量分配一个字的空间.def start.data table:.word-7.text,start:STM#0,SWWSR;零等待状态 STM#STACK+10H,SP;设置堆栈指针 STM#x,AR1 MVPD table,*AR1 LD*AR1,A BC end,AGT;若A0,则转至end,否则往下执行 ABS A STL A,xend:B end.end,4.2.4 循环结构程序 循环结构程序设计主要用于某些需要重复进行的操作,它简化程序,节约内存。循环结构程序的设计可分为设置循环初始状态、循环体和循环控制条件三部分。循环初始状态主要是指设置循
19、环次数的计数初值,以及其他为能使循环体正常工作而设置的初始状态等(比如缓冲区首地址)。,循环体是循环操作(重复执行)部分,包括循环的工作部分及修改部分。循环的工作部分是实现程序功能的主要程序段;循环的修改部分是指当程序循环执行时,对一些参数(如地址、变量)的有规律的修正。循环控制部分是循环程序设计的关键。每个循环程序必须选择一个控制循环程序运行和结束的条件。使用循环指令BANZ(当辅助寄存器不为0时转移)执行循环计数和操作是十分方便的。,【例3】试编制程序,在4项乘积aixi(i=1,2,3,4)中找出最大值,并存放在累加器A中。源程序编制如下:.title ex43.asm.mmregs S
20、TACK.usect STACK,10H.bss a,4.bss x,4.def start.data,table:.word 1,2,3,4.word 8,6,9,7.text start:STM#0,SWWSR STM#STACK+10H,SP STM#a,AR1 RPT#7 MVPD table,*AR1+STM#a,AR1 STM#x,AR2 STM#2,AR3 LD*AR1+,T MPY*AR2+,A;第一个乘积在累加器A中,loop1:LD*AR1+,T MPY*AR2+,B;其他乘积在累加器B中 MAX A;累加器A和B比较,选大的存在A中 BANZ loop1,*AR3-;此循
21、环中共进行3次乘法和比较end:B end.end,4.2.5 子程序结构 子程序是一个独立的程序段,具有确定的功能,可被其他程序调用,调用它的程序一般为主程序。子程序调用指令(如:CALL、CALA、CC等)将一个返回地址压入堆栈,执行返回指令(如RET、RC等)时复原。子程序的定义和调用的格式为 子程序名:RET,子程序名,【例4】试编制程序,求。这是一个典型的乘法累加运算,在数字信号处理中用得很多。,源程序编制如下:*ex44.asm y=a1*x1+a2*x2+a3*x3+a4*x4*.title EX44.asm.mmregs,STACK.usectSTACK,10H;开辟堆栈空间.
22、bss x,4;为变量分配9个字的空间.bss a,4.bss y,1.def start.data,table:.word 1*32768/10.word 2*32768/10.word-3*32768/10.word 4*32768/10.word 8*32768/10.word 6*32768/10.word-4*32768/10.word-2*32768/10.text,start:STM#0,SWWSR;零等待状态 SSBX FRCT STM#STACK+10H,SP;设置堆栈指针 STM#x,AR1;AR1指向a RPT#7;从程序存储器传送8个值主数据存储器 MVPD table
23、,*AR1+CALL SUM;调用SUM子程序,end:B endSUM:STM#x,AR2;子程序实现乘累加 STM#a,AR3 RPTZ A,#3 MAC*AR2+,*AR3+,A STH A,y RET.end,【例5】编写浮点乘法程序,完成x1x2=0.3(-0.8)运算。虽然TMS320C54x是定点DSP,但它可通过以下3条指令支持浮点运算:EXPA STT,EXPONENT NORMA,假设定点数放在A中,这样就可以将定点数转换为浮点数了。反之,若将浮点数转换为定点数,只要将指数取反即可。浮点数由尾数与指数两部分组成,其与定点数的关系如下:定点数=尾数2(指数)指数与尾数均用补码
24、表示。例如,本例中x1的定点数0 x3333(0.4)用浮点数表示时,尾数为0 x6666(0.8),指数为1,即0.82-1=0.4;x2的定点数0 xb334(-0.6)用浮点数表示为-0.6=-0.62-0。,程序中所用的数据变量如下:x1:定点被乘数;e1:被乘数的指数;m1:被乘数的尾数;x2:定点乘数;e2:乘数的指数;m2:乘数的尾数;ep:乘积的指数;mp:乘积的尾数;product:定点乘积;temp:暂存单元。,首先将定点数x1、x2转换为浮点数,浮点数相乘即指数相加,尾数相乘,最后再将乘积(浮点数)转换为定点数。*ex45.asm x1*x2=0.4*(-0.6)*.ti
25、tle EX45.asm.mmregs,STACK.usect STACK,10H.bss x1,1.bss x2,1.bss e1,1.bss m1,1.bss e2,1.bss m2,1.bss ep,1.bss mp,1.bss product,1.bss temp,1.def start.data,table:.word 4*32768/10.word-6*32768/10.text start:STM#0,SWWSR STM#STACK+10H,SP;设置堆栈指针 MVPD table,x1;将x1、x2传送至数据存储器 MVPD table+1,x2,LD x1,16,A;先将x1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MS320C54x 汇编语言 程序设计

链接地址:https://www.31ppt.com/p-5440772.html