第4章-TMS320C54x汇编语言程序设计课件_第1页
第4章-TMS320C54x汇编语言程序设计课件_第2页
第4章-TMS320C54x汇编语言程序设计课件_第3页
第4章-TMS320C54x汇编语言程序设计课件_第4页
第4章-TMS320C54x汇编语言程序设计课件_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

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

文档简介

第4章TMS320C54x汇编语言程序设计4.1TMS320C54x汇编语言的基本概念

4.2TMS320C54x汇编语言程序设计的基本方法4.3TMS320C54x汇编语言程序的编辑、汇编与链接过程4.4汇编器

4.5链接器4.6Simulator的使用方法4.7汇编程序举例4.1TMS320C54x汇编语言的基本概念4.1.1TMS320C54x汇编语句的组成汇编语言源程序中的每一行语句都可以由四部分组成,句法格式如下:[标号][:]助记符[操作数][;注释]其中,[]为选项书写规则如下:

(1)所有语句必须以标号、空格、星号(*)或分号开始。

(2)所有包含伪指令的语句必须在一行内完全指定。

(3)若使用标号,则标号必须从第一列开始。

(4)语句的每部分必须用一个或多个空格分开,Tab键与空格等效。

1.标号所有指令或大多数伪指令前面都可带有语句标号,供本程序的其他部分或其他程序调用。标号是任选项,标号后可以加也可以不加冒号(:)。标号必须从第一列开始,其最多可长达32个字符(A~Z,a~z,0~9,_和$),但第一个字符不能是数字。引用标号时,标号的大小写必须一致,标号的值就是段程序计数器(SPC)的当前值。若不用标号,则第一个字母必须为空格、分号或星号(*)。

2.助记符助记符跟在标号的后面。助记符不能从第一列开始。助记符包含指令、伪指令、宏命令和宏调用。作为指令,一般用大写;伪指令和宏命令则以句号(.)开始,且为小写。伪指令可以形成常数和变量,当用它控制汇编和链接过程时,可以不占存储空间。

3.操作数操作数是指指令中的操作数或伪指令中定义的内容。操作数之间必须用逗号(,)分开。有的指令无操作数,如指令NOP。指令中的操作数可以是寄存器、地址、常数、算术或逻辑表达式。

4.注释注释从分号(;)开始,可以放在指令或伪指令的后面,也可以单独占一行或数行。注释是任选项。如果注释从第1列开始,也可以用星号(*)。

4.1.2TMS320C54x汇编语言中的常数、字符串、符号与表达式

1.常数和字符串常数就是指令中出现的那些固定值。汇编器支持7种类型的常数:二进制数、十进制数、八进制数、十六进制数、字符常数、字符串和浮点常数。①二进制数:二进制数字(0或1),其后缀为B(或b)。②十进制数:用数字0~9表示,无后缀。③八进制数:用数字0~7表示,其后缀为Q或q。④十六进制数:用数字0~9及字母A~F表示,其后缀为h或H。⑤字符常数:是由单引号(‘’)括起来的1或2个字符组成的字符串,每个字符在内部表示为8位ASCII码。⑥字符串:是由双引号(“”)括起来的一串字符。⑦浮点常数:是一串十进制数,可带小数点、分数和指数部分。

2.符号符号用作标号、常数和替代符号。符号名可以是长达200个字符的字母(A~Z,a~z)、数字(0~9)加上$或下划线(_)。第一个字符不能是数字,符号中间不能有空格。符号分大小写,例如:Abc。

3.表达式

1)运算顺序影响表达式运算顺序的三个主要因素是:圆括号、优先级和同级运算顺序。圆括号内的表达式最先运算,不能用{}或[]来代替()。

TMS320C54x汇编器的优先级使用与C语言类似,优先级高的运算先执行。

2)表达式溢出在汇编的过程中执行算术运算后,汇编器将检查溢出状态。一旦出现上溢和下溢,它都发出值被截断了的警告信息,但在做乘法时,汇编器不检查溢出状态。

3)条件表达式汇编器在任何表达式中都支持关系操作,这对条件汇编特别有用。关系运算符如下:

=(等于)==(等于) !=(不等于) >=(大于等于)<=(小于等于)>(大于)<(小于)

4.1.3TMS320C54x伪指令

TMS320C54x伪指令给程序提供数据、控制汇编过程。具体实现以下任务:

(1)将数据和代码汇编到特定的段。

(2)为未初始化的变量保留存储空间。

(3)控制展开列表的形式。

(4)存储器初始化。

(5)汇编条件块。

(6)定义全局变量。

(7)指定汇编器可以获得宏的特定库。

(8)检查符号调试信息。常用的伪指令如表4-3所示。表4-3常用伪指令伪指令句法作用title.title“string”标题名。例如:.title“example.asm”end.end结束伪指令,放在汇编语言源程序的最后text.text[段起点]包含可执行程序代码data.data[段起点]包含初始化数据value1[,…,valuen]设置16位无符号整型量word.wordvalue1[,…,valuen]设置16位带符号整型量伪指令句法作用bss.bss符号,字数为未初始化的变量保留存储空间sect.sect“段名”[,段起点]建立包含代码和数据的自定义段usect符号.usect“段名”,字数为未初始化的变量保留存储空间的自定义段def.def变量1[,…,变量n]在当前模块中定义,并可在别的模块中使用ref.ref变量1[,…,变量n]在当前模块中使用,但在别的模块中定义伪指令句法作用global.global变量1[,…,变量n]可替代 .def和 .ref伪指令mmregs.mmregs定义存储器映像寄存器的替代符号

1.段定义伪指令 段定义伪指令有以下五个: ●.bss(未初始化段)●.data(已初始化段) ●.sect(已初始化段)●.text(已初始化段) ●.usect(未初始化段)

1)未初始化段

.bss和.usect命令建立未初始化段。未初始化段就是TMS320C54x存储器中的保留空间,它通常被定位在RAM区。在目标文件中,这些段中没有确切内容,在程序运行时,可以利用这些存储空间存放变量,变量一般存放于数据存储器区域中。这两条命令的句法如下:

.bss符号,字数符号.usect“段名”,字数

2)已初始化段

.text、.data和.sect命令建立已初始化段。已初始化段包括可执行代码或已初始化的数据。在目标文件中,这些段中都有确切内容,当加载程序时再将这些内容放到TMS320C54x的存储器中。每个初始化段都可以重新定位,也可以引用在其他段中定义的符号,链接器会自动处理段间的相互引用。这三条命令的句法如下:

.text[段起点].data[段起点].sect"段名”[,段起点]

.text后是汇编语言程序的正文。经汇编后,.text后的是可执行程序代码,一般存放于程序存储器区域中。

.data后是已初始化数据,有int和word两种数据形式。由命令文件可以将定义的数据存放于程序或数据存储器中。

.sect建立包含代码和数据的自定义段,常用于定义中断向量表。

2.常数初始化伪指令常数初始化伪指令如表4.3.3所示。

4.1.4TMS320C54x宏命令

TMS320C54x汇编器支持宏语言。宏命令是源程序中具有独立功能的一段程序代码,它可以根据用户的需要,由用户创建自己的指令。宏命令一经定义,便可在以后的程序中多次调用,从而可以简化和缩短源程序。

1.宏定义宏命令可以在源程序的任何位置定义,但必须在宏调用之前先定义好。宏定义也可以嵌套。定义如下:宏命令名

.macro <形式参数>

; 宏体 ;

.endm

2.调用宏命令定义好之后,就可以在源程序中将宏命令名作为指令来调用这个宏了。格式如下:宏命令名 <实际参数>

3.宏展开当源程序中调用宏命令时,汇编时就将宏命令展开。在宏展开时,汇编器将实际参数传递给形式参数,再用宏定义替代宏调用语句,并对其进行汇编。上例的宏展开如下:

11 00000 1000! LD abc,A1 00001 0000! ADD def,A1 00002 0000! ADD ghi,A1 00003 8000! STLA,adr4.2TMS320C54x汇编语言程序设计的

基本方法DSP的软件开发一般有以下几种方式:(1)直接编写汇编语言源程序;(2)编写C语言程序;(3)混合编程(既有C代码,又含汇编代码)。

4.2.1TMS320C54x汇编语言源程序的完整结构

汇编语言源程序中,以.asm为程序的扩展名,程序员用“段”伪指令来组织程序的结构。程序一般由数据段、堆栈段和代码段组成。在前面我们介绍了五个段定义伪指令,.data用于存放有初值的数据块;.usect用于为堆栈保留一块存储空间;.text用于设置代码段。另外,.bss用于为变量保留一块存储空间;.sect常用于定义中断向量表。 程序的基本结构有四种:顺序结构、分支结构、循环结构和子程序结构。

4.2.2顺序结构程序 顺序结构是最基本、最简单的程序结构形式,程序中的语句或结构被连续执行。

【例1】试编制程序,求出下列公式中z的值。

z=(x+y)×8-w

源程序编制如下:*************************************************ex41.asmz=(x+y)*8-w*************************************************.title"ex41.asm" .mmregsSTACK.usect “STACK”,10H ;开辟堆栈空间

.bss x,1 ;为变量分配4个字的空间

.bss y,1 .bss w,1 .bss z,1 .def start .datatable: .word 6,7,9 .textstart: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+y)*8 SUB @w,A ;A=(x+y)*8-w STLA,@zend: B end .end

4.2.3分支结构程序 程序的分支主要是靠条件转移指令来实现的。TMS320C54x具有丰富的程序控制与转移指令,利用这些指令可以执行分支转移、循环控制以及子程序操作。分支转移指令(如B、BACC、BC等)通过改写PC,以改变程序的流向。分支结构也称条件结构。【例2】试编制程序,求一个数的绝对值,并送回原处。源程序编制如下:*************************************************ex42.asmABSofpositiveornegative************************************************* .title "ex42.asm" .mmregsSTACK.usect"STACK",10H ;开辟堆栈空间

.bss x,1 ;为变量分配一个字的空间

.def start .datatable: .word -7 .textstart: STM #0,SWWSR;零等待状态

STM #STACK+10H,SP;设置堆栈指针

STM #x,AR1 MVPDtable,*AR1 LD *AR1,A BC end,AGET ;若A>0,则转至end,否则往下执行

ABS A STL A,@xend: Bend .end

4.2.4循环结构程序循环结构程序设计主要用于某些需要重复进行的操作,它简化程序,节约内存。循环结构程序的设计可分为设置循环初始状态、循环体和循环控制条件三部分。循环初始状态主要是指设置循环次数的计数初值,以及其他为能使循环体正常工作而设置的初始状态等(比如缓冲区首地址)。循环体是循环操作(重复执行)部分,包括循环的工作部分及修改部分。循环的工作部分是实现程序功能的主要程序段;循环的修改部分是指当程序循环执行时,对一些参数(如地址、变量)的有规律的修正。循环控制部分是循环程序设计的关键。每个循环程序必须选择一个控制循环程序运行和结束的条件。使用循环指令BANZ(当辅助寄存器不为0时转移)执行循环计数和操作是十分方便的。

【例3】试编制程序,在4项乘积aixi(i=1,2,3,4)中找出最大值,并存放在累加器A中。源程序编制如下:

.title "ex43.asm" .mmregsSTACK.usect "STACK",10H.bssa,4.bssx,4 .defstart .datatable: .word 1,2,3,4 .word 8,6,9,7 .textstart: 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中

MAXA

;累加器A和B比较,选大的存在A中

BANZloop1,*AR3-

;此循环中共进行3次乘法和比较end: Bend .end

4.2.5子程序结构子程序是一个独立的程序段,具有确定的功能,可被其他程序调用,调用它的程序一般为主程序。子程序调用指令(如:CALL、CALA、CC等)将一个返回地址压入堆栈,执行返回指令(如RET、RC等)时复原。子程序的定义和调用的格式为 子程序名:

RET子程序名

【例5】编写浮点乘法程序,完成x1×x2=0.3×(-0.8)运算。虽然TMS320C54x是定点DSP,但它可通过以下3条指令支持浮点运算:

EXP AST T,EXPONENTNORM A假设定点数放在A中,这样就可以将定点数转换为浮点数了。反之,若将浮点数转换为定点数,只要将指数取反即可。浮点数由尾数与指数两部分组成,其与定点数的关系如下:定点数=尾数×2-(指数)

指数与尾数均用补码表示。例如,本例中x1的定点数0x3333(0.4)用浮点数表示时,尾数为0x6666(0.8),指数为1,即0.8×2-1=0.4;x2的定点数0xb334(-0.6)用浮点数表示为-0.6=-0.6×2-0。程序中所用的数据变量如下:x1:定点被乘数;e1:被乘数的指数;m1:被乘数的尾数 ;x2:定点乘数;e2:乘数的指数 ;m2:乘数的尾数 ;ep:乘积的指数 ;mp:乘积的尾数 ;product:定点乘积 ;temp:暂存单元。首先将定点数x1、x2转换为浮点数,浮点数相乘即指数相加,尾数相乘,最后再将乘积(浮点数)转换为定点数。*************************************************ex45.asmx1*x2=0.4*(-0.6)************************************************* .title "EX45.asm" .mmregsSTACK.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 .datatable: .word4*32768/10 .word-6*32768/10 .textstart: STM #0,SWWSR STM #STACK+10H,SP ;设置堆栈指针

MVPDtable,@x1

;将x1、x2传送至数据存储器

MVPDtable+1,@x2

LD @x1,16,A

;先将x1加载至A(31~16位),因小数在高位

EX

温馨提示

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

评论

0/150

提交评论