TMS320C54x汇编语言程序设计.ppt

上传人:za****8 文档编号:3333203 上传时间:2019-12-11 格式:PPT 页数:187 大小:2.22MB
返回 下载 相关 举报
TMS320C54x汇编语言程序设计.ppt_第1页
第1页 / 共187页
TMS320C54x汇编语言程序设计.ppt_第2页
第2页 / 共187页
TMS320C54x汇编语言程序设计.ppt_第3页
第3页 / 共187页
点击查看更多>>
资源描述
第4章TMS320C54x汇编语言程序设计,4.1TMS320C54x汇编语言的基本概念4.2TMS320C54x汇编语言程序设计的基本方法4.3TMS320C54x汇编语言程序的编辑、汇编与链接过程4.4汇编器4.5链接器4.6汇编程序举例,1汇编语言源程序的句法格式,要点,以.asm为扩展名每一行由4个部分组成,格式,标号:空格助记符空格操作数空格;注释,中的内容为可选择部分,供本程序的其它部分或其它程序调用。标号是任选项,标号后面可以加也可以不加冒号“:”。,4.1TMS320C54x汇编语言的基本概念,要点,1.标号必须从第列写起,2.标号最多可达32个字符,可以是AZ,az,09,_,以及$,但标号的第1个字符不能是数字。3.引用标号时,标号的大小写必须一致。4.标号的值就是段程序计数器SPC的值。5.如果不用标号,则第一个字母必须为空格、分号或星号(*)。,要点,建议,标号:空格助记符空格操作数空格;注释,可以是助记符指令、汇编指令、宏指令和宏调用命令。,1.助记符指令,一般用大写;2.汇编命令和宏命令,以句号“.”开始,且为通常用小写。,要点,标号:空格助记符空格操作数空格;注释,1.指令中的操作数或汇编命令中定义的内容2.操作数之间必须用逗号“,”分开。,1.从分号“;”开始2.可以放在指令或汇编命令后面,也可以放在单独的一行或数行。,要点,2汇编语言源程序的数据型式,二进制:如1110001b或1111001B;八进制:226q或572Q;十进制:1234或+1234或-1234(缺省型)十六进制:0A40h或0A40H或0 xA40浮点数:1.623e-23(仅C语言程序中能用,汇编程序不能用)字符:D,每位字符由8位ASCII码表示;字符串:“thisisastring”,符号用作标号、常数和替代符号。符号名可以是长达200个字符的字母(AZ,az)、数字(09)加上$或下划线(_)。第一个字符不能是数字,符号中间不能有空格。符号分大小写,例如:Abc。,3汇编语言源程序的符号,4表达式1)运算顺序影响表达式运算顺序的三个主要因素是:圆括号、优先级和同级运算顺序。圆括号内的表达式最先运算,不能用或来代替()。TMS320C54x汇编器的优先级使用与C语言类似,优先级高的运算先执行。表4-1给出了表达式中可用的运算符及优先级。,表4-1表达式的运算符及优先级,2)表达式的合法性表达式在使用符号时,汇编器对符号在表达式中的使用具有一些限制,由于符号的属性不同(即定义不同),使表达式存在合法性问题。符号按属性可分为三种:外部符号、可重定位符号和绝对符号。,外部符号是那些在一个模块定义而被另一个模块引用的符号。(一般用.global定义)在汇编和执行阶段,符号值、符号地址不同的是可重定位符号,相同的是绝对符号。含有乘、除法的表达式中只能使用绝对符号(其值不能改变)。表达式中不能使用未定义的符号。,表4-2表达式符号的合法性,4.1.3TMS320C54x伪指令TMS320C54x伪指令给程序提供数据、控制汇编过程。具体实现以下任务:(1)将数据和代码汇编到特定的段。(2)为未初始化的变量保留存储空间。(3)控制展开列表的形式。(4)存储器初始化。(5)汇编条件块。(6)定义全局变量。(7)指定汇编器可以获得宏的特定库。(8)检查符号调试信息。,表4-3常用伪指令,1段定义伪指令段定义伪指令有以下五个:.bss(未初始化段).data(已初始化段).sect(已初始化段).text(已初始化段).usect(未初始化段),1)未初始化段.bss和.usect命令建立未初始化段。.bss伪指令为未初始化变量在.bss段中预留空间;.usect伪指令在一个未初始化的自定义段中预留空间。.usect伪指令与.bss类似,但是它可以把预留空间与.bss段分离。这两条命令的句法如下:.bss符号,字数符号.usect“段名”,字数,2)已初始化段.text、.data和.sect命令建立已初始化段。这三条命令的句法如下:.text段起点.data段起点.sect段名”,段起点,.text后是汇编语言程序的正文。经汇编后,.text后的是可执行程序代码,一般存放于程序存储器区域中。.data后是已初始化数据,有int和word两种数据形式。由命令文件可以将定义的数据存放于程序或数据存储器中。.sect建立包含代码和数据的自定义段,常用于定义中断向量表。,2常数初始化伪指令(1).bes和.space。汇编器对这些保留的位填0,将位数乘以16来实现保留字。当标号与.space连用时,标号指向保留位的第一个字;当标号与.bes连用时,标号指向保留位的最后一个字。(2).field。此指令可以把多个域打包成一个字,汇编器不会增加SPC的值,直至填满一个字。(3).float和.xfloat。这两个指令将32位浮点数存放在当前段的连续字中,高位字先存。.float伪指令能自动按长字(偶地址)边界排列,但.xfloat不能。,(4).long和.xlong。这两个指令将32位数存放在当前段的连续字中,高位字先存。.long伪指令能自动按长字(偶地址)边界排列,但.xlong不能。(5).string和.pstring。.string类似于.byte,把8位字符放到当前段的连续字中,每8位字符占一个字。(6).int和.word。例如“table:.int1,2,3,4”,或例“table:.word8,6,4,2”。,3段程序计数器定位伪指令段程序计数器定位伪指令的句法如下:.alignsizeinbits该指令使段程序计数器SPC对准1128字的边界,保证该指令后面的代码从一个字或页的边界开始。不同的操作数代表了不同的含义:“1”表示让SPC对准字边界;“2”表示让SPC对准长字/偶地址边界;“128”表示让SPC对准页边界。当.align不带操作数时,其缺省值为128,即对准页边界。,4条件汇编伪指令以下分两种情况介绍条件汇编伪指令。(1)第一种情况:.ifwell-definedexpression.elseifwell-definedexpression.else.endif,(2)第二种情况:.loopwell-definedexpression.breakwell-definedexpression.endloop,4.1.4TMS320C54x宏命令TMS320C54x汇编器支持宏语言。宏命令是源程序中具有独立功能的一段程序代码,它可以根据用户的需要,由用户创建自己的指令。宏命令一经定义,便可在以后的程序中多次调用,从而可以简化和缩短源程序。,1宏定义宏命令可以在源程序的任何位置定义,但必须在宏调用之前先定义好。宏定义也可以嵌套。定义如下:宏命令名.macro;宏体;.endm,2调用宏命令定义好之后,就可以在源程序中将宏命令名作为指令来调用这个宏了。格式如下:宏命令名,3宏展开当源程序中调用宏命令时,汇编时就将宏命令展开。在宏展开时,汇编器将实际参数传递给形式参数,再用宏定义替代宏调用语句,并对其进行汇编。,1*23*add34*5*ADDRP=P1+P2+P3;说明宏功能67add3.macrop1,p2,p3,ADDRP;定义宏89LDp1,A;将参数1赋给A10ADDp2,A;将参数2与A相加11ADDp3,A;将参数3与A相加12STLA,ADDRP;将结果A的低字存参数413.endm;结束宏141516.globalabc,def,ghi,adr;定义全局符号1718000000add3abc,def,ghi,adr;调用宏110000001000!LDabc,A;宏展开10000010000!ADDdef,A10000020000!ADDghi,A10000038000!STLA,adr,例4-2宏定义、宏调用和宏展开的一个例子。,4.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*,.titleex41.asm.mmregsSTACK.usectSTACK,10H;开辟堆栈空间.bssx,1;为变量分配4个字的空间.bssy,1.bssw,1.bssz,1.defstart.data,table:.word6,7,9.textstart:STM#0,SWWSR;零等待状态STM#STACK+10H,SP;设置堆栈指针STM#x,AR1;AR1指向xRPT#2;从程序存储器传送3个值至数据存储器MVPDtable,*AR1+LDx,A,ADDy,A;A=x+yLDA,3;A=(x+y)*8SUBw,A;A=(x+y)*8-wSTLA,zend:Bend.end,采用顺序结构编程时应注意:合理选取算法;采用合适的寻址方式进行指令选取;存储数据及结果时注意内存空间的分配和寄存器的使用。,4.2.3分支结构程序程序的分支主要是靠条件转移指令来实现的。TMS320C54x具有丰富的程序控制与转移指令,利用这些指令可以执行分支转移、循环控制以及子程序操作。分支转移指令(如B、BACC、BC等)通过改写PC,以改变程序的流向。分支结构也称条件结构。,【例2】试编制程序,求一个数的绝对值,并送回原处。源程序编制如下:*ex42.asmABSofpositiveornegative*.titleex42.asm.mmregs,STACK.usectSTACK,10H;开辟堆栈空间.bssx,1;为变量分配一个字的空间.defstart.datatable:.word-7.text,start:STM#0,SWWSR;零等待状态STM#STACK+10H,SP;设置堆栈指针STM#x,AR1MVPDtable,*AR1LD*AR1,ABCend,AGT;若A0,则转至end,否则往下执行ABSASTLA,xend:Bend.end,采用分支结构编程时应注意:正确选择条件运算符;正确选择相应指令;每个分支中要有完整的终结点;对于多分支程序,要检查每个程序正确与否。,4.2.4循环结构程序循环结构程序设计主要用于某些需要重复进行的操作,它简化程序,节约内存。循环结构程序的设计可分为设置循环初始状态、循环体和循环控制条件三部分。,循环初始状态主要是指设置循环次数的计数初值,以及其他为能使循环体正常工作而设置的初始状态等(比如缓冲区首地址)。循环体是循环操作(重复执行)部分,包括循环的工作部分及修改部分。循环的工作部分是实现程序功能的主要程序段;循环的修改部分是指当程序循环执行时,对一些参数(如地址、变量)的有规律的修正。循环控制部分是循环程序设计的关键。每个循环程序必须选择一个控制循环程序运行和结束的条件。,【例3】试编制程序,在4项乘积aixi(i=1,2,3,4)中找出最大值,并存放在累加器A中。源程序编制如下:.titleex43.asm.mmregsSTACK.usectSTACK,10H.bssa,4.bssx,4.defstart.data,table:.word1,2,3,4.word8,6,9,7.textstart:STM#0,SWWSRSTM#STACK+10H,SPSTM#a,AR1RPT#7MVPDtable,*AR1+STM#a,AR1STM#x,AR2STM#2,AR3LD*AR1+,TMPY*AR2+,A;第一个乘积在累加器A中,loop1:LD*AR1+,TMPY*AR2+,B;其他乘积在累加器B中MAXA;累加器A和B比较,选大的存在A中BANZloop1,*AR3-;此循环中共进行3次乘法和比较end:Bend.end,4.2.5子程序结构子程序是一个独立的程序段,具有确定的功能,可被其他程序调用,调用它的程序一般为主程序。子程序调用指令(如:CALL、CALA、CC等)将一个返回地址压入堆栈,执行返回指令(如RET、RC等)时复原。子程序的定义的格式为子程序名:RET,子程序名,【例4】试编制程序,求。这是一个典型的乘法累加运算,在数字信号处理中用得很多。,源程序编制如下:*ex44.asmy=a1*x1+a2*x2+a3*x3+a4*x4*.titleEX44.asm.mmregs,STACK.usectSTACK,10H;开辟堆栈空间.bssx,4;为变量分配9个字的空间.bssa,4.bssy,1.defstart.data,table:.word1*32768/10.word2*32768/10.word-3*32768/10.word4*32768/10.word8*32768/10.word6*32768/10.word-4*32768/10.word-2*32768/10.text,start:STM#0,SWWSR;零等待状态SSBXFRCTSTM#STACK+10H,SP;设置堆栈指针STM#x,AR1;AR1指向aRPT#7;从程序存储器传送8个值主数据存储器MVPDtable,*AR1+CALLSUM;调用SUM子程序,end:BendSUM:STM#x,AR2;子程序实现乘累加STM#a,AR3RPTZA,#3MAC*AR2+,*AR3+,ASTHA,yRET.end,【例5】编写浮点乘法程序,完成x1x2=0.3(-0.8)运算。虽然TMS320C54x是定点DSP,但它可通过以下3条指令支持浮点运算:EXPASTT,EXPONENTNORMA,假设定点数放在A中,这样就可以将定点数转换为浮点数了。反之,若将浮点数转换为定点数,只要将指数取反即可。浮点数由尾数与指数两部分组成,其与定点数的关系如下:定点数=尾数2(指数)指数与尾数均用补码表示。例如,本例中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.asmx1*x2=0.4*(-0.6)*.titleEX45.asm.mmregs,STACK.usectSTACK,10H.bssx1,1.bssx2,1.bsse1,1.bssm1,1.bsse2,1.bssm2,1.bssep,1.bssmp,1.bssproduct,1.bsstemp,1.defstart.data,table:.word4*32768/10.word-6*32768/10.textstart:STM#0,SWWSRSTM#STACK+10H,SP;设置堆栈指针MVPDtable,x1;将x1、x2传送至数据存储器MVPDtable+1,x2,LDx1,16,A;先将x1加载至A(3116位),因小数在高位EXPA;提取指数STT,e1;保存x1的指数NORMA;将x1规格化为浮点数,求得尾数STHA,m1;保存x1的尾数LDx2,16,AEXPASTT,e2;保存x2的指数,NORMASTHA,m2;保存x2的尾数CALLMULT;调用浮点乘法子程序done:BdoneMULT:SSBXFRCT;小数相乘消去冗余符号位SSBXSXM;符号位扩展LDe1,A:指数相加ADDe2,ASTLA,ep,LDm1,T;尾数相乘(有符号数),乘积左移1位MPYm2,AEXPA;对尾数乘积规格化STT,tempNORMASTHA,mp;保存乘积尾数LDtemp,A;修正乘积指数,ep+temp=epADDep,ASTLA,ep;保存乘积指数,NEGA;乘积指数反号,将浮点乘积转换为定点数STLA,tempLDtemp,TLDmp,16,ANORMASTHA,product;保存定点乘积RET.end,程序执行结果如下:,4.3TMS320C54x汇编语言程序的编辑、汇编与链接过程,软件开发过程,汇编语言源程序的编辑、汇编和链接过程,4.4汇编器,汇编器(Assembler)将汇编语言源文件汇编成机器语言COFF的目标文件。源文件中包括指令、汇编指令以及宏指令。汇编器的功能如下:将汇编语言源程序汇编成一个可重新定位的目标文件(.obj文件)。根据需要,可以生成一个列表文件(.lst文件)。根据需要,可以在列表文件后面附加一张交叉引用表。,将程序代码分成若干段,为每个目标代码段设置一个SPC(段程序计数器)。定义和引用全局符号。汇编条件程序块。支持宏功能,允许定义宏命令。,运行汇编程序,asm500inputfileobjectfilelistingfile-options,汇编器是名为asm500.exe的可执行程序,例如asm500cjy.asm-l-s-x源程序cjy.asm经汇编后将生成一个cjy.obj目标文件、列表文件、符号表(在目标文件中)以及交叉引用表(在列表文件中)。,建立公共目标文件格式的目标文件,汇编器和链接器功能的异同,相同点,不同点,汇编器建立的是相对地址COFF文件,即.obj文件链接器建立的是绝对地址COFF文件,即.out文件,汇编器根据汇编命令用适当的段将各部分程序代码和数据连在一起,构成目标文件;链接器的一个任务就是分配存储单元,即把各个段重新定位到目标存储器中。,不同种类的区别,COFF文件种类,C54x汇编器和C编译器建立的是COFF2文件。C54x能够读/写所有形式的COFF文件,缺省值下链接器生成的是COFF2文件,用链接器vn选项可以选择不同形式的COFF文件。,COFF0COFF1COFF2,标题格式不相同数据部分是相同,段(sections)的概念,特点,定义,分段的优点:在目标文件中将放置程序、数据、变量的代码分开,便于在链接时作为一个单独的部分分配存储器。由于大多数系统都有好几种形式的存储器,通过对各个段重新定位,可以使目标存储器得到更为有效的利用。,段是在存储器图中占据相邻空间的代码或数据块。,一个目标文件中的每一个段都是分开的和不相同的。,目标文件中的段与目标存储器之间的关系,COFF文件中的符号,用于处理符号的汇编命令,外部符号,在一个模块中定义的定义,可在另一个模块中引用的符号。,.def:在当前模块中定义,并可在别的模块中使用的符号。.ref:在当前模块中使用,但在别的模块中定义的符号。.global:可以是上面的随便哪一种情况。,.defx.refy.globalz.globalqq:BB3NOP4x:MVA0,A1MVKLy,B3Bzx在此模块中定义,可被别的模块引用;y在这里引用,它在别的模块中定义;q在此模块中定义,可被别的模块引用;z在这里引用,它在别的模块中定义。,注意,4.4.2汇编器对段的处理,用于定义段的汇编命令,.bss未初始化段.usect未初始化自定义段.text已初始化程序正文段.data已初始化程序数据段.sect已初始化自定义段,如果汇编语言程序中一个段命令都没有用,那么汇编器把程序中的内容都汇编到.text段。,注意,(1)未初始化段,未初始化段由.bss和.usect命令建立,位置,为变量保留存储器空间,作用,通常将它们定位到RAM区,使用方法,.bss符号,字数符号.usect“段名”,字数,对应于保留的存储空间第一个字的变量名称,程序员为自定义未初始化段起的名字,(2)已初始化段,已初始化段是由.text、.data的.sect命令建立,位置,包含有可执行代码或初始化数据,作用,通常将它们定位到EPROM区,使用方法,.text段起点.data段起点.sect“段名”,段起点,段程序计数器(SPC)定义的一个起始值。,程序员为自定义未初始化段起的名字,(3)段程序计数器(SPC),编址过程,表示一个程序代码段或数据段内的当前地址,作用,一开始,汇编器将每个SPC置0。当汇编器将程序代码或数据加到一个段内时,相应的SPC就增加。如果再继续对某个段汇编,则相应的SPC就在先前的数值上继续增加。链接器在链接时要对每个段进行重新定位。,当汇编器遇到.text,.data,.sect伪指令时,汇编器停止将随后的程序代码或数据编译进当前段,而是顺序编译进遇到的段中。当汇编器遇到.bss,.usect伪指令时,汇编器暂时脱离当前段,随后的程序代码或数据仍将顺序编译进当前段。汇编程序对源程序汇编时,如果采用-l(小写的L)选项,则汇编后将生成一个列表文件。下面给出了一个列表文件的例子,用来说明在汇编过程中段伪指令在不同的段之间来回交换,逐步建立COFF段的过程和SPC的修改过程。,列表文件中每行由四个区域组成,即Field1:源程序的行号。Field2:段程序计数器SPC。Field3:目标代码。Field4:源程序。,【例6】段定义伪指令应用举例。2*3*Assembleaninitializedtableinto.data.*4*50000.data600000011coeff.word011H,022H,033H00010022000200337*,8*Reservespacein.bssforavariable.*9*100000.bssbuffer,1011*12*Stillin.data.*13*1400030123ptr.word0123H15*16*Assemblecodeintothe.textsection.*17*,180000.text190000100Fadd:LD0FH,A200001F010aloop:SUB#1,A00020001210003F842BCaloop,AGEQ0004000122*23*Anotherinitializedtableinto.data.*24*250004.data,26000400aaivals.word0AAH,0BBB,0CCH000500bb000600cc27*28*Defineanothersectionformorevariables.*29*300000var2.usectnewvars,1310001inbuf.usectnewvars,732*,33*Assemblemorecodeinto.text.*34*350005.text360005ll0ampy:LD0AH,B370006f166mloop:MPY#0AH,B0007000a380008f868BCmloop,BNOV0009000639*40*Defineanamedsectionforint.vectors.*,41*420000.sectvectors4300000011.word011H,033H4400010033,此例共生成五个段:.text:包含10个字的目标代码。.data:包含7个字的数据。vectors:由.sect伪指令产生的自定义段,包含2个字的初始化数据。.bss:为变量保留10个字的存储空间。newvars:由.usect伪指令产生的自定义段,为变量保留8个字的存储空间。本例的目标代码如图4-3所示。,图4-3目标代码,4.5链接器,链接器的功能如下:将各个段配置到目标系统的存储器中。对各个符号和段进行重新定位,并给它们指定一个最终的地址。解决输入文件之间未定义的外部引用问题。,根据链接命令或链接命令文件(.cmd文件),将一个或多个COFF目标文件链接起来,生成存储器映象文件(.map)和可执行的输出文件(.out)(COFF目标模块),链接器的主要功能就是对程序定位,它采用的是一种相对的程序定位方式。程序的定位方式有三种:编译时定位(MCU采用,用ORG语句确定代码块和数据块的绝对地址);链接时定位(DSP采用,按.cmd文件中的段命令进行实际的定位);加载时定位(PC机采用,由操作系统对程序进行定位)。,运行链接程序,(1)键入命令lnk500(2)键入命令lnk500file1.objfile2.objo(3)键入命令lnk500linker.cmd,链接器是名为lnk500.exe的可执行程序,应包含如下内容:file1.objfile2.obj-olind.out,建立一个名为a.out(默认情况)的可重新定位的输出模块。,4.5.1链接器对段的处理链接器对段的处理具有两个功能。其一,将输入段组合生成输出段,即将多个.obj文件中的同名段合并成一个输出段;也可将不同名的段合并产生一个输出段。其二,将输出段定位到实际的存储空间中。链接器提供MEMORY和SECTIONS两个命令来完成上述功能。MEMORY命令用于描述系统实际的硬件资源;SECTIONS命令用于描述段如何定位到恰当的硬件资源上。链接器通过命令文件(.cmd)来获得上述信息。,链接器将输入段组合成一个可执行的目标模块,4.5.2链接器命令文件链接命令文件含有链接时所需要的信息。命令文件.cmd由三部分组成:输入/输出定义、MEMORY命令和SECTIONS命令。输入/输出定义这部分包括输入文件名(目标文件.obj、库文件.lib和交叉索引文件.map)、输出文件.out和链接器选项。,MEMORY命令用来定义目标系统中所包含的各种形式的存储器的存储器配置图,包括对存储器各部分命名,以及规定它们的起始地址和长度。,(1)MEMORY命令,功能,MEMORYPAGE0:name1(attr):origin=constant,length=constantPAGEn:namen(attr):origin=constant,length=constant,MEMORY命令的一般句法,对一个存储空间加以标记,每一个PAGE代表一个完全独立的地址空间。页号n最多可规定为255,取决于目标存储器的配置。通常PAGE0定为程序存储器,PAGE1定为数据存储器。如果没有规定PAGE,则链接器就目标存储器配置在PAGE0。,MEMORYPAGE0:name1(attr):origin=constant,length=constantPAGEn:namen(attr):origin=constant,length=constant,MEMORY命令的一般句法,名字可以包含8个字符,AZ、az、$、.、_均可。名字并没有特殊的含义,用来标记存储器的区间而已;名字都是内部记号,不需要保留在输出文件或者符号表中。不同PAGE上的存储器区间可以取相同的名字,但在同一PAGE内的名字不能相同,且不许重叠配置。,MEMORYPAGE0:name1(attr):origin=constant,length=constantPAGEn:namen(attr):origin=constant,length=constant,MEMORY命令的一般句法,任选项,为命名区规定14个属性。如果有选项,应写在括号内。当输出段定位到存储器时,可利用属性加以限制。,规定一个存储区的起始地址。键入origin、org或o都可以。这个值是一个16位二进制常数,可以用十进制数、八进制数或十六进制数表示。,规定一个存储区的长度,键入length、len或l都可以。,R规定可以对存储器执行读操作。W规定可以对存储器执行写操作。X规定存储器可以装入可执行的程序代码。I规定可以对存储器进行初始化。如果一项属性都没有选,就可以将输出段不受限制地定位到任何一个存储器位置。任何一个没有规定属性的存储器都默认有全部4项属性。fill:任选项,不常用,在句法中未列出,为没有定位输出段的存储器空单元填充一个数,键入fill或f均可。这是2个字节的整型常数,可以是十进制数、八进制数或十六进制数表示。如fill=0FFFFh。,属性选项一共有4项,例4-7MEMORY命令的使用方法。/*ExamplecommandfilewithMEMORYdirective*/file1.objfile2.obj/*Inputfiles*/-oprog.out/*Options*/MEMORYPAGE0:ROM:origin=cooh,length=1000hPAGE1:SCRTCH:origin=60h,length=20hONCHIP:origin=80h,length=200h,名为ROM的程序存储器:4K字ROM,起始地址C00h。,名为SCRATCH的数据存储器:32字RAM,起始地址60h。名为ONCHIP的数据存储器:512字RAM,起始地址为80h。,告诉链接器如何将输入段合成输出段在可执行程序中定义输出段规定输出段在存储器中的存放位置允许重新命名输出项。,(2)SECTIONS命令,功能,在链接器命令文件中,SECTIONS命令用大写字母,紧随其后并用大括号括起来的是关于输出段的详细说明。每一个输出段的说明都从段名开始。段名后面是一行说明段的内容和如何给段分配存储单元的性能参数。,注意,SECTIONSname:property,property,property,name:property,property,property,name:property,property,property,SECTIONS命令的一般句法,性能参数,1)loadallocation定义将输出段加载到存储器中的什么位置。句法:load=allocation或者用大于号代替“load=”allocation或者省掉“load=”allocation其中allocation是关于输出段地址的说明,即给输出段分配存储单元。,.text:load=0 x1000将输出段.text定位到一个特定地址。.text:ROM将输出段.text定位到名为ROM的存储区。.bss:(RW)将.bss段定位到属性为R、W的存储区。,2)Runallocation用来定义输出段在存储器的什么位置上开始运行。句法:run=allocation或者用大于号代替等号runallocation链接器为每个输出段在目标存储器中分配两个地址:一个是加载的地址,另一个是执行程序的地址。通常,这两个地址是相同的,可以认为每个输出段只有一个地址。有时要想把程序的加载和运行区分开(先将程序加载到ROM,然后在RAM中以较快的速度运行),只要用SECTIONS命令让链接器对这个段定位两次就行了。一次是设置加载地址,另一次是设置运行地址。例如:.fir:load=ROM,run=RAM,3)Inputsections用来定义由哪些输入段组成输出段。句法:input_sections大多数情况下,在SECTIONS命令中是不列出每个输入文件的输入段的段名的:SECTIONS.text:.data:.bss这样,在链接时,链接器就将所有输入文件的.text段链接成.text输出段,其它段也一样。,SECTIONS.text:/*建立.text输出段*/f1.obj(.text)/*链接源于f1.obj的.text段*/f2.obj(sec1)/*链接源于f2.obj的sec1段*/f3.obj/*链接源于f3.obj的所有段*/f4.obj(.text,sec2)/*链接源于f4.obj的.text段和sec2段*/,用文件名和段名来明确地规定输入段,如果没有利用MEMORY和SECTIONS命令,链接器就按默认算法来定位输出段:MEMORYPAGE0:PROG:origin=0 x0080,length=0 xFF00PAGE1:DATA:origin=0 x0080,length=0 xFF80SECTIONS.text:PAGE=0.data:PAGE=0.cinit:PAGE=0.bss:PAGE=1,(3)MEMORY和SECTIONS命令的默认算法,所有的.text输入段,链接成一个.text输出段,它是可执行的输出文件;,所有的.data输入段组合成.data输出段,所有的.bss输入段则组合成一个.bss输出段,.text和.data段定位到配置为PAGE0上的存储器,即程序存储空间。,【例8】链接ex42.cmd文件。ex42.obj-oex42.out-mex42.map-estartMEMORYPAGE0:EPROM:org=0E000H,len=100H,PAGE1:SPRAM:org=0060H,len=20HDARAM:org=0080H,len=100HSECTIONS.text:EPROMPAGE0.data:EPROMPAGE0.bss:SPRAMPAGE1STACK:DARAMPAGE1,4.5.3程序重定位汇编器处理每个段都是从地址0开始,每段中所有需要重新定位的符号(标号)都是相对于0地址而言的。事实上,所有段都不可能从存储器中的0地址开始,因此链接器必须通过下列方法对各个段进行重新定位:将各个段定位到存储器图中,使每个段有合适的起始地址。调整符号值,使之对应于新的段地址。调整对重新定位后符号的引用。,汇编器对源程序汇编时,汇编后将生成一个列表文件。列表文件中目标代码后面在需要引用重新定位的符号处留了一个重新定位入口,链接器就在符号重定位时,利用这些入口修正对符号的引用值。表示在链接时需要重新定位的符号如下:!:定义的外部引用。:.text段重新定位。:.data段重新定位。+:.sect段重新定位。-:.bss和.usect段重新定位。,例4-5列表文件中,汇编器为需要重新定位的符号所留的重定位入口。10100X.set0100h;给X赋值20000.text30000FO73BY;生成一个重定位入口0000000440002F020LD#X,A;生成一个重定位入口00030000!50004F7E0Y:RESET,在.text段对X的引用是一次外部引用,.text段内对Y的引用是一次内部引用,.text段内定义Y,另一个模块中定义的X。这里赋初值,假设链接时X重新定位在地址7100h,.text段重新定位到从地址7200h开始,那么Y的重定位值为7204h。链接器利用两个重定位入口,对目标文件中的两次引用进行修正:f073BY变成f07300047204f020LD#X,A变成f0200000!7100在COFF目标文件中有一张重定位入口表。链接器在处理完之后就将重定位入口消去,以防止在重新链接或加载时再次重新定位。,一个没有重定位入口的文件称为绝对文件,它的所有地址都是绝对地址。,4.7汇编程序举例,1多模块链接以例2中的ex42.asm源程序为例,将复位与中断在一起的向量文件列为一个单独的文件,对两个目标文件进行链接。(1)编写向量文件vector.asm。,【例20】向量文件vector.asm。*vectors.asm*Resetvector*.titlevectors.asm*Reset-Vector*.refstart.sect.vectorsBstart,*Interrupt-Vector*.refINT_2.sectINT_2BINT_2.end,(2)编写ex421.asm文件。只要在例2的基础上添加.def命令和开中断及中断服务子程序,就能完成只要一中断即将A累加器的内容左移8位。start,INT_2在ex421.asm中定义,在vectors.asm中使用。,【例21】源文件ex421.asm。.titleex421.asm.mmregsSTACK.usectSTACK,10H.bssx,1.defstart,INT_2.datatable:.word-7.text,start:STM#0,SWWSRSTM#STACK+10H,SPSTM#x,AR1MVPDtable,*AR1LD*AR1,ASTM#0,SWWSR;开中断RSBXINTMSTM#04H,IMRBCend,AGT,ABSASTLA,xend:BendINT_2:SFTAA,8;中断服务程序RETE.end,(3)分别对两个源文件ex421.asm和vector.asm进行汇编,生成目标文件ex421.obj和vector.obj。(4)编写链接命令文件ex421.cmd。此命令用来链接ex421.obj和vector.obj两个目标文件(输入文件),并生成一个映像文件ex421.map,以及一个可执行的输出文件ex421.out。标号“start”是程序的入口。,假设目标存储器的配置如下:程序存储器EPROME000hFFFFH(片外)数据存储器SPRAM0060H007FH(片内)DARAM0080H017FH(片内)链接器命令文件如例22所示。,【例22】链接器命令文件ex421.cmd。ex421.objvectors.obj-oex421.out-mex421.map-estartMEMORYPAGE0:,EPROM:org=0E000H,len=100Hvecs:org=0FF80H,len=04Hvecs1:org=0FFC8H,len=04HPAGE1:SPRAM:org=0060H,len=20HDARAM:org=0080H,len=100HSECTIONS,复位中断向量序号为0,当IPTR=1FF,中断向量地址为0FF80.,INT2中断向量序号为18,当IPTR=1FF,中断向量地址为0FFC8.,.text:EPROMPAGE0.bss:SPRAMPAGE1.data:EPROMPAGE0STACK:DARAMPAGE1.vectors:vecsPAGE0INT_2:vecs1PAGE0,另外,要用软件仿真外部中断信号,为此建立一个数据文件INT_2.DAT:INT_2.DAT(+2000)rpteos在INT_2处设置断点,在命令行发PINC命令将INT_2.DAT与引脚INT2相连,运行程序累加器A的内容左移8位,表明执行了中断服务程序。,(5)链接。链接后生成一个可执行的输出文件ex421.out和映像文件ex421.map(见例23)。,【例23】映像文件ex421.map。*TMS320C54xCOFFLinkerVersion1.10*ThuAug1915:35:352004OUTPUTFILENAME:,ENTRYPOINTSYMBOL:startaddress:0000E000MEMORYCONFIGURATIONnameoriginlengthattributesfill-PAGE0:EPROM0000E000000000100RWIXvecs0000FF80000000004RWIXvecs10000FFC8000000004RWIX,PAGE1:SPRAM00000060000000020RWIXDARAM00000080000000100RWIXSECTIONALLOCATIONMAPoutputattributes/sectionpageoriginlengthinputsections-,.text00000E000000000160000E00000000016ex421.obj(.text)0000E01600000000vectors.obj(.text).bss10000006000000001UNINITIALIZED0000006000000001ex421.obj(.bss)0000006100000000vectors.obj(.bss),.data00000E016000000010000E01600000001ex421.obj(.data)0000E01700000000vectors.obj(.data)STACK10000008000000010UNINITIALIZED0000008000000010ex421.obj(STACK).vectors00000FF80000000020000FF8000000002vectors.obj(.vectors),INT_200000FFC8000000020000FFC800000002vectors.obj(INT_2).xref00000000000000082COPYSECTION000000000000005Eex421.obj(.xref)0000005E00000024vectors.obj(.xref)GLOBALSYMBOLS,addressnameaddressname-00000060.bss00000060.bss0000E016.data00000061end0000E000.text0000E000.text0000E014INT_20000E000start0000E017edata0000E014INT_200000061end0000E016.data0000E016etext0000E016etext0000E000start0000E017edata8symbols,用DSP实现FIR滤波器,1FIR滤波器基本概念,1.FIR滤波器没有反馈回路,因此它是无条件稳定系统,其单位冲激响应h(n)是一个有限长序列。2.FIR滤波算法实际上是一种乘法累加运算。,要点,C54x片内没有I/O资源,CPU通过外部译码可以寻址64K的I/O单元。有两条实现输入和输出的指令:PORTRPA,Smem;将为PA的端口内容送;数据存储器SmemPORTWSmem,PA;将地址为Smem的数据;存储器内容送端口PA,数据的输入/输出,2.FIR滤波器中z-1的实现,对于N级的FIR滤波器,在数据存储器中开辟一个称之为滑窗的N个单元的缓冲区,存放最新的N个输入样本;从最老的样本开始,每读一个样本后,将此样本向下移位,读完最后一个样本后,输入最新样本至缓冲区的顶部。用线性缓冲区实现z-1的优点是,新老数据在存储器中存放的位置直接明了。,特点,(1)用线性缓冲区法实现z-1,N=6的线性缓冲区存储器图,使用存储器延时指令DELAY,可以将数据存储单元中的内容向较高地址的下一单元传送。实现z-1的运算指令为:DELAYSmem;(Smem)Seme+1,即数据存储;器单元的内容送下一高地址单元DELAY*AR2;AR2指向源地址,即将AR2所指单;元内容复制到下一高地址单元中,存储器的延时操作,延时指令与其它指令的结合,LT+DELAYLTD指令;单数据存储器的值装入;T寄存器并送下一单元延时MAC+DELAYMACD指令;操作数与程序存储器值相乘;后累加并送下一单元延时,在数据存储器中开辟一个称之为滑窗的N个单元的缓冲区,滑窗中存放最新的N个输入样本;每次输入新样本时,以新样本改写滑窗中的最老的数据,而滑窗中的其它数据不作移动;利用片内BK(循环缓冲区长度)寄存器对滑窗进行间接寻址,循环缓冲区地址首尾相邻。利用循环缓冲区实现Z-1的优点是不需要移动数据,不存在一个机器周期中要求能一次读和一次写的数据存储器,因而可以将循环缓冲区定位在数据存储器的任何位置(线性缓冲区要求定位在DARAM)。,特点,(2)用循环缓冲区法实现z-1,N=6的循环缓冲区存储器图,3F
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!