![汇编语言程序的开发工具演示文稿_第1页](http://file4.renrendoc.com/view/20844bb277d6320da5437f36c0ecfcef/20844bb277d6320da5437f36c0ecfcef1.gif)
![汇编语言程序的开发工具演示文稿_第2页](http://file4.renrendoc.com/view/20844bb277d6320da5437f36c0ecfcef/20844bb277d6320da5437f36c0ecfcef2.gif)
![汇编语言程序的开发工具演示文稿_第3页](http://file4.renrendoc.com/view/20844bb277d6320da5437f36c0ecfcef/20844bb277d6320da5437f36c0ecfcef3.gif)
![汇编语言程序的开发工具演示文稿_第4页](http://file4.renrendoc.com/view/20844bb277d6320da5437f36c0ecfcef/20844bb277d6320da5437f36c0ecfcef4.gif)
![汇编语言程序的开发工具演示文稿_第5页](http://file4.renrendoc.com/view/20844bb277d6320da5437f36c0ecfcef/20844bb277d6320da5437f36c0ecfcef5.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
汇编语言程序的开发工具演示文稿当前1页,总共121页。
知识要点:本章介绍了TMS320C54x软件开发流程、汇编语言程序的编写、编译和链接过程,重点介绍了COFF段的一般概念、汇编器和链接器处理段的方法以及程序的重定位方法等。当前2页,总共121页。4.1TMS320C54x软件开发流程’C54x的应用软件开发主要完成以下的工作:首先是选择编程语言编写源程序。’C54x提供两种编程语言:汇编语言和C/C++语言。当源程序编写好后,选择开发环境,’C54x提供了两种开发环境。一种是非集成开发环境,如图。另一种是集成开发环境,简称CCS。CCS在Windows操作系统下运行,它集成了非集成开发环境的所有功能,并扩展了许多其他的功能。在后面的章节中会有介绍。当前3页,总共121页。
当前4页,总共121页。
如果源程序是C/C++语言,需调用’C54x的C编译器将其编译成汇编语言,并送入’C54x的汇编器进行汇编。对于用汇编语言编写的程序则直接送给汇编器进行汇编,汇编后产生COFF格式的目标文件,再用链接器进行链接,生成在’C54x可执行的COFF格式的目标代码,并利用调试工具对可执行的目标代码进行调试。当前5页,总共121页。
对’C54x应用程序的开发提供以下几个开发调试工具:
C/汇编语言源码调试器与软件仿真器、评价模块、软件开发系统、软件模拟器等开发工具配合使用。
软件仿真模拟器
集成开发环境CCS
DSK
软件开发系统SWDS
可扩展的开发系统仿真器(XDS510)
评价模块(EVM板)
当前6页,总共121页。4.2汇编语言程序的编辑、
汇编和链接过程
汇编语言源程序可以在任何一种文本编辑器中进行。当汇编语言源程序完成后,还必须经过汇编和链接后才能进行。下图给出了汇编语言程序的编辑、汇编和链接过程:文本编辑器汇编器链接器调试程序.cmd链接命令文件.lst列表文件转换程序.asm源文件.obj目标文件.out输出文件-l-m.map存储器映像文件当前7页,总共121页。①编辑利用各种文本编辑器,如记事本、WORD、EDIT等,可编写汇编语言源程序。②汇编当汇编语言源程序编写好以后,可利用’C54x的汇编器ASM500,对一个或多个源程序进行汇编,生成.lst文件和.obj文件。常用汇编命令为:
asm500%1 -s-l-x当前8页,总共121页。③链接链接就是利用’C54x的链接器LNK500,根据链接器命令文件(.cmd)对已汇编过的一个或多个目标文件(.obj)进行链接,生成存储器映像文件(.map)和输出文件(.out)。
常用链接命令为
lnk500%1.cmd当前9页,总共121页。④调试对输出文件(.out)调试可以采用多种手段,现介绍如下:
◆软件仿真器进行调试
◆硬件仿真器进行调试
◆评价模块进行调试⑤固化用户程序调试完成后,利用HEX500格式转换器对ROM编程,或对EPROM编程,最后安装到用户的的应用系统中。当前10页,总共121页。4.3COFF的一般概念
汇编器和链接器生成的目标文件,是一个可以由’C54x器件执行的文件。这些目标文件的格式称为公共目标文件格式(CommonObjectFileFormat,缩写为COFF)。
COFF采用代码段和数据段的形式,因此便于模块化的编程。当前11页,总共121页。4.3.1COFF文件的基本单元COFF文件有3种类型:COFF0、COFF1、COFF2。每种类型的COFF文件的标题格式都有所不同,但数据部分却是相同的。段是COFF文件中最重要的概念。每个目标文件都分成若干段。段是在存储器图中占据相邻空间的代码或数据块。当前12页,总共121页。
所有的COFF目标文件都包含以下3种形式段:
◆
.text段,通常包含可执行代码;
◆
.data段,通常包含初始化数据;
◆
.bss段,通常为未初始化变量保留存储空间。此外,汇编器和链接器可以建立、命名和链接自定义段。这种自定义段是程序员自已定义的段,使用起来与.data、.text、及.bss段类似。它的好处是在目标文件中与.data、.text、及.bss分开汇编,链接时作为一个单独部分分配到存储器中。当前13页,总共121页。COFF目标文件有以下两种基本类型的段。①初始化段初始化段中包含有数据或程序代码。包括:
◆
.text段是已初始化段;
◆
.data段是已初始化段;
◆
.sect汇编器伪指令建立的自定义段也是已初始化段。当前14页,总共121页。②未初始化段在存储空间中,它为未初始化数据保留存储空间。包括:
◆
.bss段未初始化段;
◆
.usect汇编命令建立的自定义段也是未初始化段。当前15页,总共121页。
链接器的一个任务就是分配存储单元,即把各个段重新定位到目标存储器中,如下图:当前16页,总共121页。
链接器的功能之一是将目标文件中的段重新定位到目标系统的存储器中,该功能称为定位或分配。大多数系统都包含有几种存储器,通过对各个段的重新定位,可以使目标存储器得到更加有效的利用。当前17页,总共121页。4.3.2汇编器对段的处理
汇编器对段的处理是通过段伪指令来区别各个段,并将段名相同的语句汇编在一起。汇编器有5条命令可识别汇编语言程序的各个部分。这5条命令是:
◆
.bss(未初始化段)
◆
.usect(未初始化段)
◆
.text(已初始化段)
◆
.data(已初始化段)
◆
.sect(已初始化段)当前18页,总共121页。①未初始化段
.bss和.usect命令生成未初始化段。未初始化段就是’C54x存储器中的保留空间,通常将它们定位到RAM区。在目标文件中,这些段没有确切的内容;在程序运行时,可以利用这些存储空间存放变量。这两条命令句法如下:
.bss 符号,字数
.usect “段名”,字数当前19页,总共121页。
符号—对应于保留的存储空间第一个字的变量名称,可让其它段引用,也可以定义为全局符号;字数—表示在.bss段或标有名字的段中保留多少个存储单元;段名—程序员为自定义未初始化段起的名字。②已初始化段
.text、.data和.sect命令生成已初始化段。已初始化段中包含有可执行代码或初始化数据。这些段中的内容都在目标文件中,当加载程序时再放到’C54x的存储器中。每一个已初始化段都是可以重新定位的,并且可以引用其他段中所定义的符号。当前20页,总共121页。3条初始化命令的句法如下:
.text [段起点].data [段起点]·sect “段名”[,段起点]
其中,段起点是任选项。如果选用,它就是为段计数器(SPC)定义的一个起始值。如果默认,则SPC从0开始。当汇编器遇到.text、.data和.sect命令时,将停止对当前段的汇编,然后将紧接着的程序代码或数据汇编到指定段中,直到再遇到另一条.text、.data和.sect命令为止。当前21页,总共121页。
当汇编器遇到.bss或.usect命令时,并不结束当前段的汇编,只是暂时从当前段脱离出来,并开始对新的段进行汇编。段的构成要经过一个反复的过程。当前22页,总共121页。③命名段命名段由用户指定,与默认的.text,.data和.bss段的使用相同,但它们被分开汇编。例如,重复使用.text段建成单个.text段,在链接时,这个.text段被作为单个单元定位。
当前23页,总共121页。
假如不希望一部分可执行代码和.text段分配在一起,可将它们汇编进一个命名段,这样就可定位在与.text段不同的地方,也可将初始化的数据汇编到与.data段不同的地方,或者将未初始化的变量保留在与.bss段不同的位置。此时,可用以下两个产生命名段的伪指令:
.usect伪指令产生类似.bss段,为变量在RAM中保留存储空间。
.sect伪指令产生类似.text和.data段,可以包含代码和数据。.sect伪指令产生地址可重新定位的命名段。当前24页,总共121页。
这两个伪指令的使用句法为:符号 .usect“段名”,字数
.sect“段名”可以产生多达32767不同的命名段。不同的伪指令不能使用相同的名字,也就是说,不能用.usect创建命名段,然后用.sect再创建一个相同名字的段。当前25页,总共121页。④子段子段是较大段中的小段。链接器可以像处理段一样处理子段。子段结构可用来对存储器间进行更紧凑的控制,可以使存储器图更加紧密。子段的命名的句法为:基段名: 子段名例如,若要在.text段内建立一个称之为_func的子段,可以用如下的命令:
.sect “.text:_func”当前26页,总共121页。⑤段程序计数器(SPC)汇编器为每个段都安排了一个单独的程序计数器——段程序计数器,简称SPC。
SPC表示一个程序代码或数据段内当前的地址。开始时汇编器将每个SPC置0。当汇编器将程序代码或数据加到一个段内时,相应的SPC就增加。如果再继续对某个段汇编,则相应的SPC就在先前的数值上继续增加。链接器在链接时要对每个段重新定位。
当前27页,总共121页。
下例列出的是一个汇编语言程序汇编后的.lst文件。.lst文件由4个部分组成,即第一部分(Field1):源程序行号第二部分(Field2):段程序计数器第三部分(Field3):目标代码第四部分(Field4):源程序当前28页,总共121页。5 0000 .data6 00000044coeff.word 044h,055h,066h 00010055 0002006610 0000 .bssbuffer,814 00030456prt.word 0456h18 0000 .text19 0000 100d add: LD 0Dh,A20 0001 f010 aloop: SUB #1,A 0002 000121 0003 f842 BC aloop,AGEQ25 0004 0001’ 0004 .data 0004 00cc ivals .word 0CCh,0DDh,0EEh 0005 00dd 0006 00ee当前29页,总共121页。30 0000 var2 .usect “newvars”,231 0001 inbuf .usect “newvars”,835 0005 text36 0005 110a mpy: LD 0Ah,B37 0006 f166 mloop: MPY #0Ah,B 0007 000a38 0008 f868 0009 0006’42 0000 .sect “vectors”43 0000 0044 .word 044h,088h44 0001 0088当前30页,总共121页。
在此例中,共建立了5个段:
◆.text段内有10个字的程序代码
◆.data段内有7个字的数据
◆
vectors是一个用.sect命令生成的自定义段,段内有2个字的已初始化数据
◆.bss在存储器中为变量保留8个存储单元
◆.newvars是一个用.usect命令建立的自定义段,它在存储器中为变量保留10个存储单元。当前31页,总共121页。
在此例中建立的5个段如图。
当前32页,总共121页。4.3.3链接器对段的处理
链接器是开发TMS320C54x器件必不可少的开发工具,它对段处理时有两个任务:其一是将一个或多个COFF目标文件中的各种段作为链接器的输入段,经链接后在一个执行的COFF输出模块中建立各个输出段;其二是为各个输出段选定存储器地址。当前33页,总共121页。
链接器有2条伪指令支持上述任务。
◆MEMORY伪指令。用来定义目标系统的存储器分配空间,包括对存储器各部分命名,及规定它们的起始地址和长度。◆SECTIONS伪指令。它告诉连接器如何将输入段组合成输出段,及将输出段放在存储器中的什么位置。
当前34页,总共121页。①默认的存储器分配书图说明了两个文件的链接过程。4.3.3两个文件的链接过程当前35页,总共121页。
图中,链接器对目标文件file1.obj和file2.obj进行链接。每个目标文件中,都有.text、.data和.bss段,此外还有自定义段。链接器将两个文件的.text段组合在一起,以形成一个.text段,然后再将两个文件的.data段和.bss段以及最后自定义段组合在一起。当前36页,总共121页。②段放入存储器空间图说明了链接器结合段的默认方法,有时希望采用其他的结合方法。例如,可能不希望将所有的.text段结合在一起形成单个的.text段,或者希望将命名段放在.data的前面。若希望将段放在指定类型的存储器中,此时可采用MEMORY和SECTIONS伪指令。当前37页,总共121页。4.3.4链接器对程序的重新定位①链接器重新定位汇编器处理每个段都是从地址0开始,而所有需要重新定位的符号(标号)在段内都是相对于地址0的。事实上,所有段都不可能从存储器中地址0单元开始,因此链接器必须通过以下方法对各个段进行重新定位:当前38页,总共121页。
◆
将各个段定位到存储器空间中,这样一来每个段都能从一个恰当的地址开始;
◆将符号变量调整到相对于新的段地址的位置;
◆将引用调整到重新定位后的符号,这些符号反映了调整后的新符号值。当前39页,总共121页。
汇编器在需要引用重新定位的符号处都留了一个重定位入口。链接器在对符号重新定位时,利用这些入口修正对符号的引用值。下面举例说明:1 .ref X;符号X、Y、Z需要重新定位2 .ref Z;X、Z是在另一个模块中定义的3 0000 .text;Y是在这个模块的.text段定义的4 0000 F073 B Y;产生一个重新定位入口
0001 0006’;Y的值为6,X和Z值为05 0002 F073 B Z;产生一个重新定位入口
0003 0000!6 0004 F020 LD #X, A;产生一个重新定位入口
0005 0000!7 0006 F7E0 Y: RESET当前40页,总共121页。
假设链接时X重新定位地址7100H,.text段重新定位到从地址7200H开始,那么Y的重新定位值为7204H。链接器利用重定位入口,对目标文件中的两次引用进行修正。f073BY变成f0730004’7204’f020LD#X,A变成f0200000’7100②运行时间重新定位有时,希望将代码装入存储器的一个地方,而在另一个地方运行。当前41页,总共121页。
例如一些关键的执行代码必须装在系统的ROM中,但希望在较快的RAM中运行,链接器提供了一个处理该问题的简单方法,利用SECTIONS伪指令选项可让链接器定位两次,第一次使用装入关键字设置装入地址,再使用运行关键字设置它的运行地址。如果只为段提供一次定位,则该段将只定位一次,并且装入和运行地址相同。未初始化的段(例如.bss)不能装入,所以它仅有的有意义的地址为运行地址,链接器只对没有初始化的段定位一次。当前42页,总共121页。4.3.5程序装入
链接器产生可执行的COFF目标文件。可执行的目标文件模块与链接器输入的目标文件具有相同的COFF格式,但在可执行的目标文件中,对段进行结合并在目标存储器中进行重新定位。为了运行程序,在可执行模块中的数据必须传输或装入目标系统存储器。当前43页,总共121页。
有两种方法可以用来装入程序,选哪种方法取决于执行环境。
◆TMS320C54x调试工具。包括软件模拟器、XDS仿真器和集成系统CCS。它们都具有内部装入器,包含调用LOAD命令。装入器读取可执行文件,将程序复制到目标系统的存储器中。
◆采用Hex转换工具。例如Hex500,将可执行COFF目标模块转换成几种其他目标格式文件,然后将转换后的文件写入EPROM。当前44页,总共121页。4.3.6COFF文件中的符号COFF文件中有一个符号表,主要用来存储程序中有关符号的消息,链接时对符号进行重新定位要用到该表,调试程序也要用到它。当前45页,总共121页。①外部符号外部符号,是在一个模块中定义、又可以在另一个模块中引用的符号。可以用伪指令.def、.ref或.global来定义某些符号为外部符号。
◆.def指令在当前模块中定义,并可在别的模块中使用的符号
◆
.ref指令在当前模块中使用在别的模块中定义的符号
◆
.global指令可以是上面的任何一种情况当前46页,总共121页。
例:以下的代码段说明上面的定义
x: ADD #56h, A B y.def x.ref y
汇编时,汇编器把x和y都放在目标文件的符号表中。当这个文件与其它目标文件链接时,遇到x,就定义了其它文件不能识别的x,同样遇到符号y时,链接器就检查其他文件对y的定义。总之链接器必须使所引用的符号与相应的定义相匹配。当前47页,总共121页。②符号表每当遇到一个外部符号,汇编器都将符号表中产生一个条目。汇编器还产生一个指到每段的专门符号,链接器使用这些符号来对其他符号重新定位。当前48页,总共121页。4.4源程序的汇编
汇编器的作用是将汇编语言源程序转换成机器语言目标文件。这些目标文件都是公共目标文件格式(COFF)。汇编语言源程序文件包括汇编命令、汇编语言指令和宏指令。汇编命令用来控制汇编的过程,包括列表格式、符号定义和将源代码放入块的方式等。当前49页,总共121页。
汇编器包括如下功能:①将汇编语言源程序汇编成一个可重新定位的目标文件;②根据需要,可以生成一个列表文件,并对该列表进行控制;③将程序代码分成若干个段,每个段的目标代码都有一个SPC管理;
当前50页,总共121页。④定义和引用全局符号,如果需要可以在列表文件后面附加一张交叉引用表;⑤对条件程序块进行汇编;⑥支持宏功能,允许定义宏命令;⑦为每个目标代码块设置一个程序计数器
SPC。当前51页,总共121页。4.4.1汇编程序的运行’C54x的汇编程序名为asm500.exe。要运行汇编程序,可输入如下命令:
asm500 [inputfile[objectfile[listingfile]]][-options]inputfile—汇编源文件名,默认扩展名.asm。objectfile—汇编程序生成的目标文件。.objlistingfile—汇编程序生成的列表文件。.lst-options—汇编器使用的各种选项,表当前52页,总共121页。4.4.2汇编时的列表文件
汇编器对源程序汇编时,如果采用-l选项,汇编后将产生一个列表文件。列表文件中包括源程序语句和目标代码。下面是一个列表文件的例子,用来说明它的各部分的内容。当前53页,总共121页。.globalRESET,INT0,INT1,INT2.globalTINT,RINT,XINT,USER.globalISR0,ISR1,ISR2.globaltime,rcv,xmt,proc
Initmac.macro*initializemacroSSBXOVMLD#0,DPLD#7,ARPLD#037h,ARSBXINTM.endm*******************************复位中断向量******************************000000 .sect“reset”000000F073RESET:Binit0000010008+000002F073
INT0:BISR00000030000!000004F073INT2:BISR10000050000!000006F073INT2:BISR20000070000!2223*000000.sect
“ints”000000F073TINTBtime0000010000!000002F073XINTBrcv0000030000!000004F073XINTBxmt0000050000!000006F073USERBproc0000070000!29**********************30*初始化处理器31**********************当前54页,总共121页。000008init:initmac1*initializemacro1 000008 F7B9 SSBX OVM1 000009 EA00 LD#0,DP1 00000a F4A7 LD#7,ARP1 00000b E837 LD#37H,A1 00000c F6BB RSBX INTM︸行号SPC目标代码源程序语句当前55页,总共121页。
如例所示,列表文件可以分成4个部分。
◆
Field1:源程序语句的行号码,用十进制数表示。
◆
Field2:段程序计数器,用十六进制表示。
◆
Field3:目标代码,用十六进制表示。后面的记号表示在链接时需要重新定位。!:未定义的外部引用’:.text段重新定位”:.data段重新定位
+:.sect段重新定位
-:.bss和.usect段重新定位◆
Field4:源程序语句。当前56页,总共121页。4.4.3汇编伪指令
汇编伪指令用于为程序提供数据并指示汇编程序如何汇编源程序,是汇编语言程序的一个重要内容。
当前57页,总共121页。
汇编伪指令可完成以下工作:
◆将代码和数据汇编进指定的段;
◆为未初始化的变量在存储器中保留空间;
◆控制清单文件是否产生;
◆初始化存储器;
◆汇编条件代码块;
◆定义全局变量;
◆为汇编器指定可以获得宏的库;
◆考察符号调试的信息。当前58页,总共121页。’C54x汇编器共有64条汇编伪指令,根据他们的功能,可以将其分成8类:
①对各种段进行定义的命令,如.bss、.data等②对常数(数据和存储器)进行初始化的命令,如.bes、byte、.field、float等③调整SPC(段寄存器),如.align④对输出列表文件格式化的命令,如.drlist⑤引用其他文件的命令,如copy⑥控制条件汇编的命令,如.break⑦在汇编时定义符号的命令,如.asg⑧执行其他功能的命令,如.algebraic当前59页,总共121页。①定义段的伪指令定义段的伪指令用于定义相应的汇编语言程序段。表列出了定义段的伪指令的助记符以及语法格式和注释。.text—此段存放程序代码。.data—此段存放初始化了的数据。.bss—此段存入未初始化的变量。.sect'名称'—定义一个有名段,放初始化了的数据或程序代码。当前60页,总共121页。
例以实例说明如何应用定义段的伪指令。该例是一个输出清单文件,第一列为行号,第二列位SPC的值,每段有它自己的SPC。当代码第一次放在段中时,其SPC等于0。在其他的代码段被汇编后,若继续将代码汇编进该段,则它的SPC继续计数,就好像没有受到干扰。当前61页,总共121页。
例中伪指令执行以下任务:
◆
.text初始化值为1,2,3,4,5,6,7,8的字;
◆
.data初始化值为9,10,11,12,13,14,15,16var_defs初始化值为17,18字
◆
.bss保留19个字的空间
◆
.usect保留20个字的空间
◆
.bss和.usect伪指令既不结束当前的段也不开始新段,它们保留指定数量的空间,然后汇编器开始将代码或数据汇编当前的段。当前62页,总共121页。123000000 .text0000000001 .word1,200000100020000020003 .word3,4000003000478910000000 .data0000000009 .word9,10000001000A000002000B .word11,12000003000C1415161718000000 .sect“var_defs”200000000011 .word17,18000001001221222324000004 .data000004000D .word13000000 .bsssym,19000006000F .word15,16000007001029303132000004 .text0000040005 .word5,60000040006000000usym .usect“xy”,200000060007.word
0000070008当前63页,总共121页。②初始化常数的伪指令初始化常数的伪指令为当前段的汇编常数值。表列出了初始化常数的伪指令的助记符以及语法格式和注释。.bytevalue1[,…valuen]初始化当前段里的一个或多个连续字,每个值的宽度限制为8位。fieldvalue[,sizeinbits]初始化一个可变长度的域,将单个值放入当前字的指定位域中。.wordvalue1[,…valuen]初始化一个或多个16位整数,即把16位的值放到当前段的连续字中。.longvalue1[,…valuen]初始化一个或多个32位整数,即把32位的值放到当前段的2个连续字中。当前64页,总共121页。
例4.4.3
图比较了.byte,.int,.long,.xlong,.float,.xloat,.word,.string指令。见p117当前65页,总共121页。
在这个例子中假定已经汇编了以下的代码:
00000000aa .byte 0AAh,0BBh00000000bb0000020ccc .word 0CCCh0000030eee .xlong 0EEEEFFFh 000004efff000006eeee .long 0EEEEFFFFh 000007ffff000008dddd .int 0DDDDh0000093fff .xfloat 1.99999900000affac00000c3fff .float 1.999999 00000dffac00000e0068 00000f0065 000010006c 0000110070当前66页,总共121页。③对准段程序计数器的伪指令对准段程序计数器的伪指令包括:.align伪指令和.even伪指令。表列出了对准段程序计数器的伪指令的助记符以及语法格式和注释。伪指令助记符及格式
描述.align.even用于将段程序计数器对准在1~128字的边界用于使SPC指到下一个字的边界表4.4.4对准段程序计数器的伪指令当前67页,总共121页。⑴.align伪指令的操作必须是在20~216之间且等于2的幂。例如:操作数为1时,对准SPC到字的边界;操作数为2时,对准SPC到长字/偶字的边界;操作数为128时,对准SPC到页面的边界;没有操作数时,.align伪指令默认为页面边界。
当前68页,总共121页。⑵.even伪指令等效于指定.align伪指令的操作数为1的情形。当.even操作数为2时,将SPC对准到下一个长字的边界。任何在当前字中没有使用的位都填充0.当前69页,总共121页。
图说明了.align伪指令的使用情况。
当前70页,总共121页。
假定汇编了以下的代码:
0000004000 .field2,30000004160 .field11,8 .align20000020045.string“Errorcnt” 0000030072 0000040072 000005006f 0000060072 0000070063 000008006e 00000900745 .align0000800004 .byte4当前71页,总共121页。④格式化输出清单文件的伪指令格式化输出清单文件的伪指令用于格式化输出清单文件,如表
当前72页,总共121页。⑤引用其他文件的伪指令引用其他文件的伪指令为引用其他文件提供信息。如表:
当前73页,总共121页。⑥条件汇编伪指令条件汇编伪指令用来通知汇编器按照表达式计算出的结果的真假,决定是否对某段代码进行汇编。有两组伪指令用于条件代码块的汇编:⑴.if/.elseif/.else/.endif伪指令用于通知汇编器按照表达式的计算结果,对某段代码块进行条件汇编。⑵.loop/.break/.endloop伪指令用于通知汇编器按照表达式的计算结果重复汇编一个代码块。当前74页,总共121页。
条件汇编伪指令的助记符及语法格式见表:
当前75页,总共121页。⑦定义宏的伪指令常用的定义宏的伪指令如表:
当前76页,总共121页。⑧汇编时间符号伪指令汇编时间符号伪指令用于使符号名与常数值或字符串等价起来。汇编时间符号伪指令如表:
当前77页,总共121页。.struct/.endstruct伪指令允许将信息组织到结构体中,以便将同类的元素分在一组。然后由汇编器完成结构体成员偏离地址的计算。.struct/.endstruct伪指令不分配存储器,只是简单地产生一个可重复使用的符号模板。
.tag将结构体与一个标号联系起来,.tag伪指令不分配存储器,且结构体的标记符必须使用之前先定义好。当前78页,总共121页。
例.struct/.endstruct伪指令举例
1 REAL_REC.struct;结构体标记
2 0000NOM .int;member1=030001DEN.int;member2=140002REAL_LEN.endstruct;real_len=2560000000001-ADD7;访问结构体成员
89000000 .bssREAL,REAL_LEN
REAL+REAL_REC.DEN,A当前79页,总共121页。.union/.endunion伪指令通过创建符号模板,提供在相同的存储区域内管理多种不同的数据类型方法。.union不分配任何存储器,它允许类型和大小不同的定义临时存储在相同存储器空间。当前80页,总共121页。
例.union/.endunion伪指令举例
1 .globalemployid2xample.union;union标记
30000ival.word;menber1=int40000fval.float;menber2=float50000sval.string;menber3=string60002real_len.endunion;real_len=278000000.bssemplyid,real_len;指定空间
910employid.tagxample;声明结构实例
110000000000-ADDemplyid.fval,A;访问union成员当前81页,总共121页。⑨混合伪指令书中表列出了常用的混合伪指令:
当前82页,总共121页。.newblock伪指令用于复位局部标号。局部标号是形式为$n或name?的符号。当它们出现在标号域时被定义。局部标号可用作跳转指令的操作数。.newblock伪指令通过在它们被使用后将它们复位的方式来限制局部标号的使用范围。当前83页,总共121页。4.4.4宏定义和宏调用’C54x汇编器支持宏指令语言。利用宏指令,可以使源程序变得简短。宏的使用以下3个步骤。①定义宏。有两种方法定义宏:
◆可在源文件的开始定义宏,或者在.include/.copy的文件中定义。
◆在宏库中定义。②调用宏。③扩展宏。
当前84页,总共121页。
宏指令与子程序一样,都是重复执行某一段程序,但两者是有区别的,有以下两点:①宏指令和子程序都可以被多次调用,但是把子程序汇编成目标代码的过程只进行一次,而在用到宏指令的每个地方都要对宏指令中的语句逐条地进行汇编。②在调用之前,由于子程序不使用参数,故子程序所需要的寄存器等都必须事先设置好,而对于宏指令来说,由于可以使用参数,调用时只要直接代入参数就行了。当前85页,总共121页。
宏定义格式如下:
macname.macro[parameter1][,…,parametern]modelstatementsormacrodirectives[.mexit].endm当前86页,总共121页。
宏调用格式如下:
[label][:]macname[parameter1][,…,parametern]当前87页,总共121页。
例4.4.7宏定义、宏调用和宏展开举例
1*23*add34*5* ADDRP=P1+P2+P367add3 .macro P1,P2,P3,ADDRP8 9LDP1,A10ADDP2,A11 ADDP3,A当前88页,总共121页。12 STLA,ADDRP13 .endm141516 .globalabc,def,ghi,adr17000000add3abc,def,ghi,adr10000001000! LDabc,A10000010000!ADDdef,A10000020000!ADDghi,A10000048000!STLA,adr当前89页,总共121页。4.5链接器的使用
链接器的主要任务是:根据链接命令文件,将一个或多个COFF目标文件链接起来,生成存储器映像文件和可执行的输出文件,如下图:
LNK500链接命令或链接命令文件(.cmd文件)存储器映像文件(.map文件)一个或多个目标文件(.out文件)可执行输出文件(.out文件)当前90页,总共121页。
在链接过程中,链接器将各个目标文件合并起来,并完成以下工作:
◆将各个段配置到目标系统的存储器。
◆对各个符号和段进行重新定位,并给它们指定一个最终的地址。
◆解决输入文件之间未定义的外部引用。当前91页,总共121页。4.5.1链接器的运行①运行链接程序’C54x的链接器名为lnk500.exe。运行链接器有三种命令:
lnk500lnk500file1.objfile2.obj-olink.outlnk500linker.cmd说明:⒈使用第一种命令时,链接器会提示有关信息。当前92页,总共121页。⒉使用第二种命令时,链接器是以file1.obj和file2.obj为目标文件进行链接,生成一个名为link.out的可执行输出文件。⒊使用第三种命令时,需将链接的目标文件、连接选项以及存储器配置要求等编写到链接命令文件linker.cmd中。以第二种命令为例,链接命令文件linker.cmd应包含如下内容。
file1.objfile2.obj-olink.out②链接器选项表列出了常用’C54x链接器选项。在链接时,一般通过链接器选项(如-o)控制连接器操作。当前93页,总共121页。4.5.2链接器命令文件的编写与使用
链接命令文件是将链接的信息放在一个文件中,这在多次使用同样的链接信息时,可以方便调用。
在命令文件中可使用两个十分有用的伪指令MEMORY和SECTIONS,用来指定实际应用中的存储器结构和地址的映射。当前94页,总共121页。
在命令行中不能使用这两个伪指令,命令文件都是ASCⅡ文件,可包含以下内容:①输入文件名,用来指定目标文件、存档库或其他命令文件。②链接器选项,它们在命令文件中的使用方法与在命令行中相同。③MEMORY和SECTIONS链接伪指令,MEMORY用来指定目标存储器结构,SECTIONS用来控制段的构成与地址分配。④赋值说明,用于给全局符号定义和赋值。当前95页,总共121页。
对于如下链接器命令:
lnk500a.objb.obj-mprog.map-oprog.out
可以将上述命令行中的内容写成一个链接器命令文件link.cmd,内容如下:
a.obj /*第一个输入文件名*/b.obj/*第二个输入文件名*/-mprog.map/*指定map文件的选项*/-oprog.out/*指定输出文件的选项*/当前96页,总共121页。
执行链接器命令:
lnk500 link.cmd
就可以将两个目标文件a.obj和b.obj链接起来,并生成一个映像文件prog.map和一个可执行的输出文件prog.out,其效果与前面带-m和带-o选项的链接器命令完全一样。当前97页,总共121页。
例链接器命令文件举例
a.objb.obj/*输入文件名*/-oprog.out/*指定输出文件的选项*/-mprog.map/*指定map文件的选项*/MEMORY/*MEMORY伪指令*/{PAGE0:ROM:orgin=1000h,length=0100hPAGE1:RAM:orgin=0100h,length=0100h}SECTIONS/*SECTIONS伪指令*/{.text:>ROM.data:>ROM.bss:>RAM}当前98页,总共121页。
链接器命令文件都是ASCⅡ码文件,由上例可见,主要包含如下内容:①输入文件名,就是要链接的目标文件和文档库文件,或者是其他的命令文件。②链接器选项,这些选项既可以用在链接命令行,也可以编在命令文件中。③MEMORY和SECTIONS都是链接器命令,MEMORY命令定义目标存储器的配置,SECTIONS命令规定各个段放在存储器的什么位置。
当前99页,总共121页。4.5.3目标库
目标库是包含完全目标文件作为成员的存档文件。通常将一组有关的模块组合在一起形成一个库。使用目标库可减少链接的时间和可执行模块的长度。指定库的次序是很重要的,因为链接器在搜索库时仅仅包括那些具有可用来分辨没有定义的符号的成员。当前100页,总共121页。
下面是链接几个文件和库的例子,假设:①输入文件f1.obj和f2.obj均引用了一个名为clrscr的外部函数;②输入文件f1.obj引用了符号origin;③输入文件f2.obj引用了符号fillclr;④库libc.libc的成员Member0包含orign的定义;⑤库libc.liba的成员Member3包含fillclr的定义;⑥两个库成员Member3包含fillclr定义;当前101页,总共121页。
若输入命令:
lnk500f1.objliba.libf2.objlibc.lib
则引用分辨如下:①库libc.liba的成员Member1满足对clrscr引用,因为f2.obj引用它之前,库被搜索并定义了clrscr。②库libc.libc的成员Member0满足对origin的引用。③库libc.liba的成员Member3满足对fillclr的引用。当前102页,总共121页。
但如果输入命令:
lnk500f1.objf2.objlibc.libliba.lib
则所有对clrscr的引用都由库libc.libc的成员Member1满足。当前103页,总共121页。4.5.4MEMORY命令
链接器应当确定输出各段放在存储器的什么位置。要达到这个目的,首先应当有一个目标存储器的模型。
MEMORY命令就是用来规定目标存储器的模型。通过这条命令,可以定义系统中所包含的各种形式的存储器,以及它们占据的地址范围。当前104页,总共121页。
例4.5.2使用MEMORY伪指令的链接器命令文件的例子
file1.objfile2.obj-oProg.outMEMORY{PAGE0:ROM: origin=C00h,length=1000hPAGE1:SCRATCH:origin=60h,length=20h ONCHIP:origin=80h,length=200h}当前105页,总共121页。
例中MEMORY命令所定义的系统,其存储器配置如下:程序存储器:4KROM,起始地址C00h,取名为ROM。数据存储器:32字RAM,起始地址60h,取名为SCRATCH。
512字RAM,起始地址80h,取名为ONCHIP.当前106页,总共121页。MEMORY命令一般句法如下:
MEMORY{PAGE0:name1[(attr)]:origin=constant,length=constant;PAGEn:namen[(attr)]:oringin=constant,length=constant;}当前107页,总共121页。PAGE—代表一个完全独立的存储空间,页号n最多为255。通常PAGE0定为程序存储器,PAGE1定为数据存储器。如果没规定,默认为PAGE0。name—对存储区间取名。attr—这是任选项,为命名区规定1~4个属性:
R—可对存储器执行读操作;
W—可对存储器执行写操作;
X—存储器可以装入可执行的程序代码;
I—可对存储器进行初始化。如果一项属性都没选,则存储器具有全部4项属性。Origin—规定存储区的起始地址。Length—指定存储空间的长度。当前108页,总共121页。4.5.5SECTIONS命令SECTIONS命令的任务如下:
◆说明如何将输入段组合成输出段。
◆在可执行程序中定义输出段。
◆规定输出段在存储器中的存放位置。
◆允许重新命名输出段。当前109页,总共121页。SECTIONS命令一般句法如下:
SECTIONS{name:[property,property,property,…]name:[property,property,property,…]name:[property,property,property,…]}
在连接命令文件中,SECTIONS命令用大写字母,紧随其后并用大括号括起来的是关于输出段的详细说明。每一个输出段的说明都从段名开始,段名后面是一行说明段的内容和如何给段分配存储单元的性能参数。一个段可能的性能参数有:当前110页,总共121页。◆Loadallocation,由它定义将输出段加载到存储器中的什么位置。句法:load=allocation
或>allocation
或allocation具体写法有多种形式,例如.text:load=0x1000.text:load>ROM.text:PAGE0.bss:load>(RW)当前111页,总共121页。◆runallocation,由它定义输出段在存储器的什么位置上开始运行。句法:run=allocation
或run>
allocation
链接器为每个输出段在目标存储器中分配两个地址:一个是加载的地址,另一个是执行程序的地址。通常,这两个地址是相同的,可以认为每个输出段只有一个地址。当前112页,总共121页。
有时要把程序的加载区分开,只要用SECTIONS命令让链接器对这个段定位两次就行了。一次是设置加载地址,另一次是设置运行地址。例如:
.fir: load=ROM, run=RAM◆Input_sections,用它定义有哪些输入段组成输出段。句法:{Input_sections}当前113页,总共121页。
多数情况下,在SECTIONS命令中不列出每个输入文件的输入段的段名,即
SECTIONS{.text:.data:.bss}
这样,在链接时,链接器就将所有输入文件的.text段链接成.text输出段(其他段也一样)当前114页,总共121页。
当然,也可以明确地用文件名和段名来规定输入段,即
SECTIONS{.text: /*创建.text输出段*/{f1.obj(.text)/*链接来自f1.obj文件中的.text段*/f2.obj(sec1)/*链接来自f2.obj文件中的sec1段*/f3.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 安全教育主题公益广告投放计划
- 抑郁症的自我管理及应对策略
- 高一下学期语法专题练习
- 集合的概念与关系讲义 高一上学期数学人教A版(2019)必修第一册
- 第23课 和平发展合作共赢的时代潮流导学案 高一下学期统编版(2019)必修中外历史纲要下册
- 2021员工采购工作总结5篇
- 【新教材】六年级新版部编版道德与法治上册全册教案教学设计
- 个人发展的五年计划
- 与人合作的合同
- 一月至目前工作情况汇报
- 教育家精神专题讲座课件
- 籍贯对照表完整版
- 玻璃幕墙使用维护说明书
- 0-6岁以内儿童健康检查记录表
- 1-2-8工会委员会主席、副主席选举结果统计表
- 农村自建房以包工包料合同书农村建房包工不包料合同书
- 施工现场安全操作规程(全集)
- 双绞线讲解PPT课件
- 百消散_经验各种秘方辑要_方剂加减变化汇总
- 测绘成果检查验收报告
- 电缆移位施工方案及措施)
评论
0/150
提交评论