第4章汇编语言程序的开发工具

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第4章汇编语言程序的开发工具知识要点:本章介绍了TMS320C54x软件开发流程、汇编语言程序的编写、编译和链接过程,重点介绍了COFF段的一般概念、汇编器和链接器处理段的方法以及程序的重定位方法等。4.1TMS320C54x软件开发流程’C54x的应用软件开发主要完成以下的工作:首先是选择编程语言编写源程序。’C54x提供两种编程语言:汇编语言和C/C++语言。当源程序编写好后,选择开发环境,’C54x提供了两种开发环境。一种是非集成开发环境,如图4.1.1。另一种是集成开发环境,简称CCS。CCS在Windows操作系统下运行,它集成了非集成开发环境的所有功能,并扩展了许多其他的功能。在后面的章节中会有介绍。如果源程序是C/C++语言,需调用’C54x的C编译器将其编译成汇编语言,并送入’C54x的汇编器进行汇编。对于用汇编语言编写的程序则直接送给汇编器进行汇编,汇编后产生COFF格式的目标文件,再用链接器进行链接,生成在’C54x可执行的COFF格式的目标代码,并利用调试工具对可执行的目标代码进行调试。对’C54x应用程序的开发提供以下几个开发调试工具:◇C/汇编语言源码调试器与软件仿真器、评价模块、软件开发系统、软件模拟器等开发工具配合使用。◇软件仿真模拟器◇集成开发环境CCS◇DSK◇软件开发系统SWDS◇可扩展的开发系统仿真器(XDS510)◇评价模块(EVM板)4.2汇编语言程序的编辑、汇编和链接过程汇编语言源程序可以在任何一种文本编辑器中进行。当汇编语言源程序完成后,还必须经过汇编和链接后才能进行。下图给出了汇编语言程序的编辑、汇编和链接过程:文本编辑器汇编器链接器调试程序.cmd链接命令文件.lst列表文件转换程序.asm源文件.obj目标文件.out输出文件-l-m.map存储器映像文件①编辑利用各种文本编辑器,如记事本、WORD、EDIT等,可编写汇编语言源程序。②汇编当汇编语言源程序编写好以后,可利用’C54x的汇编器ASM500,对一个或多个源程序进行汇编,生成.lst文件和.obj文件。常用汇编命令为:asm500%1-s-l-x③链接链接就是利用’C54x的链接器LNK500,根据链接器命令文件(.cmd)对已汇编过的一个或多个目标文件(.obj)进行链接,生成存储器映像文件(.map)和输出文件(.out)。常用链接命令为lnk500%1.cmd④调试对输出文件(.out)调试可以采用多种手段,现介绍如下:◆软件仿真器进行调试◆硬件仿真器进行调试◆评价模块进行调试⑤固化用户程序调试完成后,利用HEX500格式转换器对ROM编程,或对EPROM编程,最后安装到用户的的应用系统中。4.3COFF的一般概念汇编器和链接器生成的目标文件,是一个可以由’C54x器件执行的文件。这些目标文件的格式称为公共目标文件格式(CommonObjectFileFormat,缩写为COFF)。COFF采用代码段和数据段的形式,因此便于模块化的编程。4.3.1COFF文件的基本单元COFF文件有3种类型:COFF0、COFF1、COFF2。每种类型的COFF文件的标题格式都有所不同,但数据部分却是相同的。段是COFF文件中最重要的概念。每个目标文件都分成若干段。段是在存储器图中占据相邻空间的代码或数据块。所有的COFF目标文件都包含以下3种形式段:◆.text段,通常包含可执行代码;◆.data段,通常包含初始化数据;◆.bss段,通常为未初始化变量保留存储空间。此外,汇编器和链接器可以建立、命名和链接自定义段。这种自定义段是程序员自已定义的段,使用起来与.data、.text、及.bss段类似。它的好处是在目标文件中与.data、.text、及.bss分开汇编,链接时作为一个单独部分分配到存储器中。COFF目标文件有以下两种基本类型的段。①初始化段初始化段中包含有数据或程序代码。包括:◆.text段是已初始化段;◆.data段是已初始化段;◆.sect汇编器伪指令建立的自定义段也是已初始化段。②未初始化段在存储空间中,它为未初始化数据保留存储空间。包括:◆.bss段未初始化段;◆.usect汇编命令建立的自定义段也是未初始化段。链接器的一个任务就是分配存储单元,即把各个段重新定位到目标存储器中,如下图:链接器的功能之一是将目标文件中的段重新定位到目标系统的存储器中,该功能称为定位或分配。大多数系统都包含有几种存储器,通过对各个段的重新定位,可以使目标存储器得到更加有效的利用。4.3.2汇编器对段的处理汇编器对段的处理是通过段伪指令来区别各个段,并将段名相同的语句汇编在一起。汇编器有5条命令可识别汇编语言程序的各个部分。这5条命令是:◆.bss(未初始化段)◆.usect(未初始化段)◆.text(已初始化段)◆.data(已初始化段)◆.sect(已初始化段)①未初始化段.bss和.usect命令生成未初始化段。未初始化段就是’C54x存储器中的保留空间,通常将它们定位到RAM区。在目标文件中,这些段没有确切的内容;在程序运行时,可以利用这些存储空间存放变量。这两条命令句法如下:.bss符号,字数.usect“段名”,字数符号—对应于保留的存储空间第一个字的变量名称,可让其它段引用,也可以定义为全局符号;字数—表示在.bss段或标有名字的段中保留多少个存储单元;段名—程序员为自定义未初始化段起的名字。②已初始化段.text、.data和.sect命令生成已初始化段。已初始化段中包含有可执行代码或初始化数据。这些段中的内容都在目标文件中,当加载程序时再放到’C54x的存储器中。每一个已初始化段都是可以重新定位的,并且可以引用其他段中所定义的符号。3条初始化命令的句法如下:.text[段起点].data[段起点]·sect“段名”[,段起点]其中,段起点是任选项。如果选用,它就是为段计数器(SPC)定义的一个起始值。如果默认,则SPC从0开始。当汇编器遇到.text、.data和.sect命令时,将停止对当前段的汇编,然后将紧接着的程序代码或数据汇编到指定段中,直到再遇到另一条.text、.data和.sect命令为止。当汇编器遇到.bss或.usect命令时,并不结束当前段的汇编,只是暂时从当前段脱离出来,并开始对新的段进行汇编。段的构成要经过一个反复的过程。③命名段命名段由用户指定,与默认的.text,.data和.bss段的使用相同,但它们被分开汇编。例如,重复使用.text段建成单个.text段,在链接时,这个.text段被作为单个单元定位。假如不希望一部分可执行代码和.text段分配在一起,可将它们汇编进一个命名段,这样就可定位在与.text段不同的地方,也可将初始化的数据汇编到与.data段不同的地方,或者将未初始化的变量保留在与.bss段不同的位置。此时,可用以下两个产生命名段的伪指令:.usect伪指令产生类似.bss段,为变量在RAM中保留存储空间。.sect伪指令产生类似.text和.data段,可以包含代码和数据。.sect伪指令产生地址可重新定位的命名段。这两个伪指令的使用句法为:符号.usect“段名”,字数.sect“段名”可以产生多达32767不同的命名段。不同的伪指令不能使用相同的名字,也就是说,不能用.usect创建命名段,然后用.sect再创建一个相同名字的段。④子段子段是较大段中的小段。链接器可以像处理段一样处理子段。子段结构可用来对存储器间进行更紧凑的控制,可以使存储器图更加紧密。子段的命名的句法为:基段名:子段名例如,若要在.text段内建立一个称之为_func的子段,可以用如下的命令:.sect“.text:_func”⑤段程序计数器(SPC)汇编器为每个段都安排了一个单独的程序计数器——段程序计数器,简称SPC。SPC表示一个程序代码或数据段内当前的地址。开始时汇编器将每个SPC置0。当汇编器将程序代码或数据加到一个段内时,相应的SPC就增加。如果再继续对某个段汇编,则相应的SPC就在先前的数值上继续增加。链接器在链接时要对每个段重新定位。下例列出的是一个汇编语言程序汇编后的.lst文件。.lst文件由4个部分组成,即第一部分(Field1):源程序行号第二部分(Field2):段程序计数器第三部分(Field3):目标代码第四部分(Field4):源程序50000.data600000044coeff.word044h,055h,066h0001005500020066100000.bssbuffer,81400030456prt.word0456h180000.text190000100dadd:LD0Dh,A200001f010aloop:SUB#1,A00020001210003f842BCaloop,AGEQ2500040001’0004.data000400ccivals.word0CCh,0DDh,0EEh000500dd000600ee300000var2.usect“newvars”,2310001inbuf.usect“newvars”,8350005text360005110ampy:LD0Ah,B370006f166mloop:MPY#0Ah,B0007000a380008f86800090006’420000.sect“vectors”4300000044.word044h,088h4400010088在此例中,共建立了5个段:◆.text段内有10个字的程序代码◆.data段内有7个字的数据◆vectors是一个用.sect命令生成的自定义段,段内有2个字的已初始化数据◆.bss在存储器中为变量保留8个存储单元◆.newvars是一个用.usect命令建立的自定义段,它在存储器中为变量保留10个存储单元。在此例中建立的5个段如图4.3.2。4.3.3链接器对段的处理链接器是开发TMS320C54x器件必不可少的开发工具,它对段处理时有两个任务:其一是将一个或多个COFF目标文件中的各种段作为链接器的输入段,经链接后在一个执行的COFF输出模块中建立各个输出段;其二是为各个输出段选定存储器地址。链接器有2条伪指令支持上述任务。◆MEMORY伪指令。用来定义目标系统的存储器分配空间,包括对存储器各部分命名,及规定它们的起始地址和长度。◆SECTIONS伪指令。它告诉连接器如何将输入段组合成输出段,及将输出段放在存储器中的什么位置。①默认的存储器分配书图4.3.3说明了两个文件的链接过程。4.3.3两个文件的链接过程图4.3.3中,链接器对目标文件file1.obj和file2.obj进行链接。每个目标文件中,都有.text、.data和.bss段,此外还有自定义段。链接器将两个文件的.text段组合在一起,以形成一个.text段,然后再将两个文件的.data段和.bss段以及最后自定义段组合在一起。②段放入存储器空间图4.3.3说明了链接器结合段的默认方法,有时希望采用其他的结合方法。例如,可能不希望将所有的.text段结合在一起形成单个的.text段,或者希望将命名段放在.data的前面。若希望将段放在指定类型的存储器中,此时可采用MEMORY和SECTIONS伪指令。4.3.4链接器对程序的重新定位①链接器重新定位汇编器处理每个段都是从地址0开始,而所有需要重新定位的符号(标号)在段内都是相对于地址0的。事实上,所有段都不可能从存储器中地址0单元开始,因此链接器必须通过以下方法对各个段进行重新定位:◆将各个段定位到存储器空间中,这样一来每个段都能从一个恰当的地址开始;◆将符号变量调整到相对于新的段地址的位置;◆将引用调整到重新定位后的符号,这些符号反映了调整后的新符号值。汇编器在需要引用重新定位的符号处都留了一个重定位入口。链接器在对符号重新定位时,利用这些入口修正对符号的引用值。下面举例说明:1.refX;符号X、Y、Z需要重新定位2.refZ;X、Z是在另一个模块中定义的30000.text;Y是在这个模块的.text段定义的4

1 / 122
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功