汇编语言程序开发工具_第1页
汇编语言程序开发工具_第2页
汇编语言程序开发工具_第3页
汇编语言程序开发工具_第4页
汇编语言程序开发工具_第5页
已阅读5页,还剩111页未读 继续免费阅读

下载本文档

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

文档简介

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

内容提要

可编程DSP芯片开发需要一套完整的软、硬件开发工具。通常可分成代码生成工具和代码调试工具两大类。代码生成工具是指将高级语言或汇编语言编写的DSP程序转换成可执行的DSP芯片目标代码的工具程序,主要包括汇编器、链接器和C编译器以及一些辅助工具程序等。

代码调试工具包括C/汇编语言源码调试器、仿真器等。

本章主要介绍代码生成工具,包括’C54x软件开发流程、汇编语言程序的编写、编辑、汇编和链接过程、COFF段的一般概念、汇编器和链接器处理段的方法以及程序的重定位等。

2024/8/81第4章汇编语言程序开发工具

4.1

TMS320C54x软件开发过程

4.2汇编语言程序的编辑、汇编和链接过程4.3

COFF的一般概念4.4源程序的汇编4.5链接器的使用2024/8/82第4章汇编语言程序开发工具4.1TMS320C54x软件开发过程

’C54x的应用软件开发主要完成以下工作:(1)

选择编程语言编写源程序

’C54x提供2种编程语言,即汇编语言和C/C++语言。对于完成一般功能的代码,这两种语言都可使用,但对于一些运算量很大的关键代码,最好采用汇编语言来完成,以提高程序的运算效率。(2)

选择开发工具和环境

’C54x提供了两种开发环境。即非集成开发环境和集成开发环境CCS。

2024/8/83第4章汇编语言程序开发工具4.1TMS320C54x软件开发过程1.

’C54x应用软件开发流程

’C54x应用软件的开发可在TI公司提供的开发环境中进行,用户可以用C/C++语言或汇编语言编写源文件,经C编译器、汇编器生成COFF格式的目标文件,再用链接器进行链接,生成在’C54x上可执行的目标代码,然后利用调试工具对可执行的目标代码进行仿真和调试。

当调试完成后,通过Hex代码转换工具,将调试后的可执行目标代码转换成EPROM编程器能接受的代码,并将该代码固化到EPROM中或加载到用户的应用系统中,以便DSP目标系统脱离计算机单独运行。

2024/8/84第4章汇编语言程序开发工具1.

’C54x应用软件开发流程开发过程的目的是产生一个可以由’C54x目标系统执行的模块。C源文件C编译器汇编源文件汇编器汇编源文件COFF目标文件链接器可执行的COFF文件宏源文件存档器宏库存档器目标文件库建库工具运行时支持库EPROM编程器交叉引用列表器调试工具TMS320C54x绝对地址列表器HEX代码转换工具2024/8/85第4章汇编语言程序开发工具2.

’C54x的开发工具TI公司提供的DSP开发环境和工具主要包括以下三个局部:代码生成工具代码调试工具实时操作系统2024/8/86第4章汇编语言程序开发工具2.

’C54x的开发工具(1)代码生成工具:C编译器:用来将C/C++语言源程序自动编译为’C54x的汇编语言源程序。汇编器:用来将汇编语言源文件汇编成机器语言COFF目标文件。链接器:将汇编生成的、可重新定位的COFF目标模块组合成一个可执行的COFF目标模块。文档管理器:允许用户将一组文件〔源文件或目标文件〕集中为一个文档文件库。2024/8/87第4章汇编语言程序开发工具2.

’C54x的开发工具

助记符指令—代数式指令翻译器:用来将包含助记符指令的汇编语言源文件转换成包含代数式指令的汇编语言源文件。

建库实用程序:用来建立用户自己使用的、并用C/C++语言编写的支持运行的库函数。

十六进制转换程序:可以很方便地将COFF目标文件转换成TI、Intel、Motorola等公司的目标文件格式。(1)代码生成工具:2024/8/88第4章汇编语言程序开发工具2.

’C54x的开发工具(1)代码生成工具:

绝对制表程序:将链接后的目标文件作为输入,生成.abs输出文件。

交叉引用制表程序:利用目标文件生成一个交叉引用清单,列出链接的源文件中的符号以及它们的定义和引用情况。2024/8/89第4章汇编语言程序开发工具2.

’C54x的开发工具(2)代码调试工具:

C/汇编语言源码调试器:与软件仿真器、评价模块、软件开发系统、软件仿真器等配合使用。软件仿真器:是一种模拟DSP芯片各种功能并在非实时条件下进行软件调试的调试工具,它不需目标硬件支持,只需在计算机上运行。初学者工具DSK:是TI公司提供给初学者进行DSP编程练习的一套廉价的实时软件调试工具。2024/8/810第4章汇编语言程序开发工具2.

’C54x的开发工具(2)代码调试工具:

软件开发系统SWDS:是一块PC插卡,可提供低本钱的评价和实时软件开发,还可用来进行软件调试,程序可在DSP芯片上实时运行。可扩展的开发系统仿真器(XDS510):可用来进行系统级的集成调试,是进行DSP芯片软硬件开发的最正确工具。评价模块EVM板:是一种低本钱的开发板,可进行DSP芯片评价、性能评估和有限的系统调试。2024/8/811第4章汇编语言程序开发工具4.2汇编语言程序的编辑、汇编和链接过程

汇编语言源程序可以在任何一种文本编辑器中进行。如笔记本、WORD、EDIT、TC等。

当汇编语言源程序编写完成后,还必须经过汇编和链接后才能运行。

2024/8/812第4章汇编语言程序开发工具4.2汇编语言程序的编辑、汇编和链接过程示意图汇编器调试程序链接器文本编辑器.asm源文件.obj目标文件.out输出文件.cmd链接命令文件.lst列表文件.map存储器映像文件十六进制转换程序HEX500-

o-

m-

l2024/8/813第4章汇编语言程序开发工具4.2汇编语言程序的编辑、汇编和链接过程1.

编辑

利用各种文本编辑器,如笔记本、WORD、EDIT和TC等,可编写汇编语言源程序。

2.

汇编当汇编语言源程序编写好以后,可利用’C54x的汇编器ASM500,对一个或多个源程序分别进行汇编,并生成列表文件(.lst)和目标文件(.obj)。

2024/8/814第4章汇编语言程序开发工具4.2汇编语言程序的编辑、汇编和链接过程2.

汇编常用的汇编命令:

asm500%1-s-1-x调用汇编器命令

源文件名

将程序所有定义的符号放在目标文件的符号表中

生成一个列表文件.lst

生成一个交叉汇编表

2024/8/815第4章汇编语言程序开发工具4.2汇编语言程序的编辑、汇编和链接过程3.

链接所谓链接,就是利用’C54x的链接器LNK500,根据链接器命令文件(d)对已汇编过的一个或多个目标文件(.obj)进行链接,生成输出文件(.out)和存储器映像文件(.map)。常用的汇编器命令:

lnk500%1dlnk500:

调用链接器命令

%1d:链接命令文件名,该文件须指明目标文件、输入文件、输出文件、链接选项和存储器配置要求等。2024/8/816第4章汇编语言程序开发工具4.3

COFF的一般概念

汇编器和链接器生成的目标文件,是一个可以由’C54x器件执行的文件。这些目标文件的格式称之为公共目标文件格式(COFF)。

在编写汇编语言程序时,COFF采用代码段和数据段的形式,以便于模块化的编程,使编程和管理变得更加方便。

这些代码段和数据段简称为段。汇编器和链接器提供一些伪指令来建立和管理各种各样的段。2024/8/817第4章汇编语言程序开发工具4.3

COFF的一般概念COFF文件的根本单元

COFF文件有3种类型:COFF0、COFF1、COFF2。

每种类型的COFF文件,其标题格式都有所不同,但数据局部是相同的。

链接器能够读/写所有类型的COFF文件,默认时链接器生成的是COFF2文件,采用-vn链接选项可以选择不同类型的COFF文件。

’C54x汇编器和C编译器产生的是COFF2文件。

2024/8/818第4章汇编语言程序开发工具COFF文件的根本单元1.

段(sections)

是COFF文件中最重要的概念。每个目标文件都分成假设干段。段——是存储器中占据相邻空间的代码或数据块。一个目标文件中的每个段都是分开的和各不相同的。COFF目标文件都包含以下3种形式的段:.text段(文本段),通常包含可执行代码;.data段(数据段),通常包含初始化数据;.bss段(保存空间段),通常为未初始化变量保存存储空间。2024/8/819第4章汇编语言程序开发工具COFF文件的根本单元2.段的根本类型COFF目标文件中的段有两种根本类型。

初始化段

未初始化段(1)

初始化段初始化段中包含有数据或程序代码。主要有:

.text段——已初始化段;

.data段——已初始化段;.sect段——已初始化段,由汇编器伪指令建立的自定义段。

2024/8/820第4章汇编语言程序开发工具COFF文件的根本单元2.段的根本类型COFF目标文件中的段有两种根本类型。(2)

未初始化段

在存储空间中,为未初始化数据保存存储空间。它包括:.bss段——未初始化段;.usect段——未初始化段,由汇编命令建立的命名段〔自定义段〕。2024/8/821第4章汇编语言程序开发工具COFF文件的根本单元3.

段与目标存储器的对应关系

汇编器的任务:在汇编过程中,根据汇编命令用适当的段将各局部程序代码和数据连在一起,构成目标文件。链接器的任务:就是分配存储单元,将目标文件中的段重新定位到目标系统的存储器中,这一过程称为定位或分配。2024/8/822第4章汇编语言程序开发工具3.

段与目标存储器的对应关系目标文件中的段与目标存储器之间的关系

目标文件目标存储器.bss.data.textRAME2PROMROM2024/8/823第4章汇编语言程序开发工具

汇编器对段的处理

汇编器对段的处理是通过段伪指令来区别各个段的,并将段名相同的语句汇编在一起。汇编器有5条伪指令可识别汇编语言程序的各个局部:

.bss

.usect

.text

.data

.sect——定义未初始化段——定义未初始化段——定义已初始化段——定义已初始化段——定义已初始化段2024/8/824第4章汇编语言程序开发工具

汇编器对段的处理

未初始化段就是在’C54x存储器中保存空间,通常它们被定位在RAM区。在目标文件中,这些段中没有确切的内容。由这些段定义的空间仅作为临时存储空间,在程序运行时,可以利用这些存储空间存放变量。未初始化段分为默认的和命名的两种,分别由汇编器伪指令.bss和.usect产生。1.未初始化段

2024/8/825第4章汇编语言程序开发工具(1).bss伪指令1.未初始化段

用于在bss段中保存假设干个空间。格式:.bss符号,字数符号——对应于保存的存储空间第一个字的变量名称。可以让其他段引用,也可以用.global命令定义为全局符号。字数——表示在bss段或标有名字的段中保存假设干个存储单元。每调用一次.bss伪指令,汇编器在相应的段保存更多的空间。2024/8/826第4章汇编语言程序开发工具1.未初始化段

(2).usect伪指令用于为指定的命名段保存假设干个空间。格式:符号.usect“段名〞,字数段名——程序员为未初始化的命名段定义的名字。每调用一次.usect伪指令,汇编器在指定的命名段保存更多的空间。2024/8/827第4章汇编语言程序开发工具

汇编器对段的处理

已初始化段中包含有可执行代码或初始化数据。

这些段中的内容都在目标文件中,当加载程序时再放到’C54x的存储器中。每个已初始化段都是可以重新定位的,并且可以引用其他段中所定义的符号。链接器在链接时会自动地处理段间的相互引用。

已初始化段由.text、.data和.sect三个伪指令建立。2.

已初始化段2024/8/828第4章汇编语言程序开发工具已初始化命令的句法:

2.

已初始化段.text[段起点].data[段起点].sect“段名〞[,段起点]段起点——是任选项。假设选用,它为段程序计数器SPC定义一个起始值。假设默认,那么SPC从0开始。2024/8/829第4章汇编语言程序开发工具

汇编器对段的处理

当汇编器遇到.text或.data或.sect命令时,将停止对当前段的汇编(相当于一条结束当前段汇编的命令),然后将紧接着的程序代码或数据汇编到指定的段中,直到再遇到另一条.text、.data或.sect命令为止。

当汇编器遇到.bss或.usect命令时,并不结束当前段的汇编,只是暂时从当前段脱离出来,并开始对新的段进行汇编。.bss和.usect命令可以出现在一个已初始化段的任何位置,而不会对它的内容发生影响。2024/8/830第4章汇编语言程序开发工具

汇编器对段的处理

命名段由用户指定,与默认的.text,.data和.bss段的使用相同,但它们被分开汇编。假设一局部可执行代码〔例如初始化程序〕不希望和.text段分配在一起,可将它们汇编进一个命名段,这样就可定位在与.text不同的地方。也可将初始化的数据汇编到与.data段不同的地方,或者将未初始化的变量保存在与.bss段不同的位置。可用.usect和.sect两个伪指令产生命名段。3.命名段〔自定义段〕2024/8/831第4章汇编语言程序开发工具.usect伪指令产生类似.bss的段,为变量在RAM中保存存储空间。.sect伪指令产生类似.text和.data的段,可以包含代码或数据。.sect伪指令产生可重新定位地址的命名段。3.

命名段产生命名段伪指令格式:符号.usect“段名〞,字数.sect“段名〞

可以产生多达32767个不同的命名段。段名可长达200个字符。

2024/8/832第4章汇编语言程序开发工具对于.sect和.usect伪指令,段名可以作为子段的参考。每次用一个新名字调用这些伪指令时,就产生一个新的命名段。假设用已有的段名调用这些伪指令,那么汇编器就将代码或数据〔或保存空间〕汇编进相应名称的段中。不同的伪指令不能使用相同的名字。即不能用.usect创立了命名段,然后又用.sect创立一个相同名字的段。3.

命名段2024/8/833第4章汇编语言程序开发工具

汇编器对段的处理

子段是较大段中的小段。链接器可以像处理其他段一样处理子段。

子段结构可用来对存储器空间进行更紧凑的控制,可以使存储器空间分配更加紧密。

4.

子段子段命名格式:基段名:子段名

子段名前为基段名,随后为冒号,最后为子段名。

2024/8/834第4章汇编语言程序开发工具对于子段,汇编器可以单独为其分配存储单元,或者在相同的基段名下与其他段组合在一起。

用.sect命令建立的段是已初始化的子段;用.usect命令建立的段是未初始化的子段。4.

子段例如,假设要在.text段内建立一个称之为_func的子段,其命令格式:.sect“.text:_func〞2024/8/835第4章汇编语言程序开发工具

汇编器对段的处理

汇编器为每个段都安排了一个单独的程序计数器称之为段程序计数器SPC。SPC表示在程序代码或数据段内当前的地址。开始时汇编器将每个SPC置0。当汇编器将程序代码或数据加到段内时,增加相应的SPC值。假设再继续对某个段汇编,那么相应的SPC就在先前的数值上继续增加。链接器在链接时要对每个段进行重新定位。5.

段程序计数器SPC2024/8/836第4章汇编语言程序开发工具【例】段命令应用举例。

汇编语言源程序:

.datacoeff.word044h,055h,066h.bssbuffer,8prt.word0456h.textadd:LD0Dh,Aaloop:SUB#1,A

BCaloop,AGEQ.dataivals.word0CCh,0DDh,0EEh;初始化数据段;3组数据放入.data段;在.bss段保存8个单元;0456h放入.data段;初始化文本段;1字指令;2字指令;2字指令共计5个字

;初始化数据段

;3组数据放入.data段2024/8/837第4章汇编语言程序开发工具汇编语言源程序:var2.usect“newvars〞,2inbuf.usect“newvars〞,8.textmpy:LD0Ah,Bmloop:MPY#0Ah,BBCmloop,BNOV.sect“vectors〞.word044h,088h;建立newvars命名段,保存2个单元;在newvars段保存8个单元;初始化文本段;1字指令;2字指令;2字指令共计5个字;建立vectors命名段

;2组数据放入vectors命名段2024/8/838第4章汇编语言程序开发工具经汇编后,得列表文件〔局部〕:2**********************************3**汇编一个初始化表到.data段**4**********************************50000.data600000044coeff.word044h,055h,066h00010055000200667**********************************8**在.bss段中为变量保存空间**9**********************************100000.bssbuffer,811**********************************12**仍然在.data段中**13**********************************1400030456prt.word0456h2024/8/839第4章汇编语言程序开发工具15**********************************16**汇编代码到.text段**17**********************************180000.text190000100dadd:LD0Dh,A200001f010aloop:SUB#1,A00020001210003f842BCaloop,AGEQ00040001’22**********************************23**汇编另一个初始化表到.data段**24**********************************250004.data26000400ccivals.word0CCh,0DDh,0EEh000500dd000600ee27**********************************28**为更多的变量定义另一个段**29**********************************300000var2.usect“newvars〞,2310001inbuf.usect“newvars〞,82024/8/840第4章汇编语言程序开发工具32****************************************33**汇编更多代码到.text段**34****************************************350005.text360005110ampy:LD0Ah,B370006f166mloopMPY#0Ah,B0007000a380008f868BCmloop,BNOV00090006’39****************************************40**为中断向量.vectors定义一个自定义段**41****************************************420000.sect“vectors〞4300000044.word044h,088h00010088源程序的行号

段程序计数器目标代码汇编语言源程序2024/8/841第4章汇编语言程序开发工具汇编语言源程序经过汇编后,共建立了5个段:●.text段——文本段,段内有10个字可执行的程序代码。●.data段——已初始化的数据段,段内有7个字的数据。●vectors段——用.sect命令生成的命名段,段内有2个字的初始化数据。●.bss段——未初始化的数据段,在存储器中为变量保存8个存储单元。●newvars段——用.usect命令建立的命名段,为变量保存10个存储单元。2024/8/842第4章汇编语言程序开发工具经汇编后,得列表文件〔局部〕:2*******************************3**汇编一个初始化表到.data段**4*******************************50000.data600000044coeff.word044h,055h,066h00010055000200667*******************************8**在.bss段中为变量保存空间**9*******************************100000.bssbuffer,811*******************************12**仍然在.data段中**13*******************************1400030456prt.word0456h行号目标代码段名100df0100001f8420001110af166000aF8680006004400550066045600cc00dd00ee00440088

没有数据保留10个字50000.data600000044coeff.word044h,055h,066h100000.bssbuffer,81400030456prt.word0456h.data

6

00446

00556

006610

.bss

没有数据保存8个字14

04562024/8/843第4章汇编语言程序开发工具15********************************16**汇编代码到.text段**17********************************180000.text190000100dadd:LD0Dh,A200001f010aloop:SUB#1,A00020001210003f842BCaloop,AGEQ00040001’22**********************************23**汇编另一个初始化表到.data段**24**********************************250004.data26000400ccivals.word0CCh,0DDh,0EEh000500dd000600ee27********************************28**为更多的变量定义另一个段**29********************************300000var2.usect“newvars〞,2310001inbuf.usect“newvars〞,8行号目标代码段名100df0100001f8420001110af166000aF868000666614004400550066045600cc00dd00ee.data00440088

10没有数据保留8个字.bss没有数据保留10个字.text

180000.text190000100dadd:LD0Dh,A19

100d200001f010aloop:SUB#1,A20

f01020

0001210003f842BCaloop,AGEQ21

f84221

0001250004.data26000400ccivals.word0CCh,0DDh,0EEh.data

26

00cc26

00dd26

00ee300000var2.usect“newvars〞,2newvars

30

保存2个字310001inbuf.usect“newvars〞,831

保存8个字2024/8/844第4章汇编语言程序开发工具32*********************************33**汇编更多代码到.text段**34*********************************350005.text360005110ampy:LD0Ah,B370006f166mloopMPY#0Ah,B0007000a380008f868BCmloop,BNOV00090006’39****************************************40**为中断向量.vectors定义一个自定义段**41****************************************420000.sect“vectors〞4300000044.word044h,088h00010088行号目标代码段名1920202121100df0100001f8420001110af166000aF8680006.text66614262626004400550066045600cc00dd00ee.data00440088

10没有数据保留8个字.bss3031没有数据保留10个字newvars350005.text.text

360005110ampy:LD0Ah,B36

110a370006f166mloopMPY#0Ah,B37

f16837

000a380008f868BCmloop,BNOV38

f86838

0006420000.sect“vectors〞vectors

4300000044.word044h,088h43

004443

00882024/8/845第4章汇编语言程序开发工具

链接器对段的处理

链接器是开发’C54x器件必不可少的开发工具之一,它对段处理时有2个主要任务:

将一个或多个COFF目标文件中的各种段作为链接器的输入段,经链接后在一个执行的COFF输出模块中建立各个输出段;

②在程序装入时对其重新定位,为各个输出段选定存储器地址。

2024/8/846第4章汇编语言程序开发工具

链接器对段的处理

链接器有2条伪指令支持上述任务:

●MEMORY伪指令——用来定义目标系统的存储器配置空间,包括对存储器各局部命名,以及规定它们的起始地址和长度。●SECTIONS伪指令——用来指定链接器将输入段组合成输出段方式,以及输出段在存储器中的位置,也可用于指定子段。假设未使用伪指令,那么链接器将使用目标处理器默认的方法将段放入存储空间。2024/8/847第4章汇编语言程序开发工具

链接器对段的处理1.默认的存储器分配链接器可对多个目标文件进行链接。假设链接文件中不使用MEMORY和SECTIONS命令,那么为默认方式。每个目标文件都有.text,.data、.bss段和命名段。假设采用默认链接,链接器将对多个目标文件中的各个段进行组合,形成各自的对应段,并将各个段配置到所指定的存储器中,形成可执行的目标模块。在默认的方式下,链接器将从存储器的0080h开始,对组合后的各段进行存储器配置。2024/8/848第4章汇编语言程序开发工具默认的存储器分配:

①将所有.text段组合在一起,形成一个.text段,并分配到程序存储器中;

②将多个目标文件中的.data段组合在一起,分配到紧接着.text段的程序存储空间中;

③将.bss段组合,配置到数据存储器中;

④组合命名段。初始化的命名段按顺序分配到紧随.data段的程序存储器,而未初始化命名段将被配置到紧随.bss段的数据存储器中。

1.默认的存储器分配2024/8/849第4章汇编语言程序开发工具默认的存储器分配过程:File1.obj.text1.data1.bss1table_1(初始化的命名段)u_vars1(未初始化的命名段)File2.obj.text2.data2.bss2table_2(初始化的命名段)u_vars2(未初始化的命名段)FFT(初始化的命名段)程序存储器数据存储器.text.text1.text2.data.data1.data2.bss.bss1.bss2tabletable_1table_2u_vars1u_vars1u_vars2FFTFFT没有使用没有配置没有配置没有使用2024/8/850第4章汇编语言程序开发工具

链接器对段的处理2.段放入存储器空间假设不希望链接器将所有的.text段结合在一起形成单个的.text段,就不能采用默认的方式。由于DSP硬件系统中可能配置多种类型的存储器,假设要把某一段分配到特定类型的存储器中,或将命名段配置特定的地址,那么需采用MEMORY和SECTIONS伪指令来配置。假设不采用默认的方式,通常需要建立一个链接命令文件,在命令文件中用MEMORY和SECTIONS伪指令定义存储器和配置段地址。2024/8/851第4章汇编语言程序开发工具

链接器对程序的重新定位1.

链接器重新定位汇编器对每个段汇编时都是从0地址开始,而所有需要重新定位的符号(标号)在段内都是相对于0地址的。事实上,所有段都不可能从存储器中0地址单元开始,因此链接器必须对各个段进行重新定位。

重新定位的方法:将各个段配置到存储器中,使每个段都有一个适宜的起始地址;将符号变量调整到相对于新的段地址的位置;将引用调整到重新定位后的符号,这些符号反映了调整后的新符号值。2024/8/852第4章汇编语言程序开发工具1.

链接器重新定位汇编器在需要引用重新定位的符号处都留了一个重定位入口。链接器在对符号重新定位时,利用这些入口修正对符号的引用值。

【例】一段采用助记符指令编写的程序,经汇编后得列表文件如下:

1

.refX2

.refZ30000.text40000F073

BY

;产生一个重定位入口

00010006’50002F073

BZ

;产生一个重定位入口

00030000!60004F020

LD#X,A

;产生一个重定位入口

00050000!70006F7E0

Y:RESET

2024/8/853第4章汇编语言程序开发工具1.

链接器重新定位程序中有三个符号:

X、Z——是在另一个模块中定义的;Y——在.text段中定义的。当程序汇编时,X、Z的值为0——未定义的外部符号

Y的值为6——相对于.text段地址0定义汇编器形成了两个重定位入口:

X和Z:在.text段中为一次外部引用,用符号!表示;Y:是一次内部引用,用符号’表示。链接时,X重新定位在地址7100h

.text段起始地址重新定位在7200hY的重新定位值为7204h。2024/8/854第4章汇编语言程序开发工具1.

链接器重新定位

链接器利用两个重定位入口,对目标文件中的两次引用进行修正:变成

f073

7204变成

f020

7100

f073

BY

0004’

f020

LD#X,A

0000!

2024/8/855第4章汇编语言程序开发工具

链接器对程序的重新定位2.

运行时间重新定位在实际运行中,有时需要将代码装入存储器的一个地方,而在另一个地方运行。

如:一些关键的执行代码必须装在系统的ROM中,但运行时希望在较快的RAM中进行。

利用SECTIONS伪指令选项可让链接器对其定位2次,其方法:

①使用装入关键字设置装入地址;

②使用运行关键字设置它的运行地址。2024/8/856第4章汇编语言程序开发工具

链接器对程序的重新定位2.

运行时间重新定位装入地址确定段的原始数据或代码装入的位置,而任何对段的使用〔例如其中的标号〕,那么参考它的运行地址。在应用中必须将该段从装入地址复制到运行地址。如果只为段提供了一次定位〔装入或运行〕,那么该段将只定位一次,并且装入和运行地址相同。如果提供了2个地址,那么段将被自动定位。2024/8/857第4章汇编语言程序开发工具

程序装入

链接器产生可执行的COFF目标文件。可执行的目标文件模块与链接器输入的目标文件具有相同的COFF格式。为了运行程序,在可执行模块中的数据必须传输或装入目标系统存储器中。

可以采用以下方法装入程序:

使用调试工具转入程序

’C54x的调试工具包括软件模拟器,XDS仿真器和集成系统CCS。它们都具有内部的装入器,调用装入器的LOAD命令,装入器将程序复制到目标系统的存储器中。采用Hex转换工具转入程序可以使用转换工具Hex500,将可执行COFF目标模块转换成几种其他目标格式文件,然后将转换后的文件通过编程器将程序装〔烧〕进EPROM。2024/8/858第4章汇编语言程序开发工具

COFF文件中的符号

COFF文件中有一个符号表,主要用来存储程序中有关符号的信息。链接器在执行程序定位时,要使用符号表提供的信息,而调试工具也要使用该表来提供符号调试。

1.

外部符号

是指在一个模块中定义、而在另一个模块中引用的符号。它可以用伪指令.def、.ref或.global来定义。

●.def在当前模块中定义,并可在别的模块中使用的符号;

●.ref在当前模块中使用,但在别的模块中定义的符号;

●.global可以是上面的任何一种情况。

2024/8/859第4章汇编语言程序开发工具1.

外部符号【例】说明代码段中外部符号的定义。

x:ADD#56h,ABy.defx

.refy

;定义x

;引用y

;x在此模块中定义,可为别

的模块引用

;y在这里引用,它在别的模

块中定义

2024/8/860第4章汇编语言程序开发工具

COFF文件中的符号2.

符号表每当遇到一个外部符号,无论是定义的还是引用的,汇编器都将在符号表中产生一个条目。汇编器还产生一个指到每段的专门符号,链接器使用这些符号将其他引用符号重新定位。

2024/8/861第4章汇编语言程序开发工具4.4源程序的汇编

汇编器的作用是将汇编语言源程序转换成机器语言目标文件。这些目标文件都是公共目标文件格式(COFF)。汇编语言源程序文件可以包含汇编命令、汇编语言指令和宏指令。汇编命令用来控制汇编的过程,包括列表格式、符号定义和将源代码放入块的方式等。2024/8/862第4章汇编语言程序开发工具4.4源程序的汇编

汇编器包括如下功能:①将汇编语言源程序汇编成一个可重新定位的目标文件(.obj文件)。②根据需要,可以生成一个列表文件(.lst文件),并对该列表进行控制。③将程序代码分成假设干个段,每个段的目标代码都有一个SPC(段程序计数器)管理。2024/8/863第4章汇编语言程序开发工具4.4源程序的汇编

汇编器包括如下功能:

定义和引用全局符号,如果需要可以在列表文件后面附加一张交叉引用表。

对条件程序块进行汇编。

支持宏功能,允许定义宏命令。

为每个目标代码块设置一个程序计数器SPC。

2024/8/864第4章汇编语言程序开发工具4.4源程序的汇编

汇编程序的运行

’C54x的汇编程序名为asm500.exe。要运行汇编程序,可键入如下命令:asm500

[inputfile

[objectfile

[listingfile]]]

[-options]

Asm500

:运行汇编程序asm

500.exe的命令。

inputfile

:汇编源文件名,默认扩展名为.asm。

objectfile

:汇编程序生成的’C54x目标文件,扩展名为.obj。假设不提供目标文件名,那么汇编程序就用输入文件或目标文件名。listingfile

:汇编器产生的列表文件名,默认扩展名为.lst。-options

:

汇编器的选项,为汇编器的使用提供各种选择。2024/8/865第4章汇编语言程序开发工具

汇编时的列表文件

汇编器对源程序汇编时,如果采用-l选项,汇编后将生成一个列表文件。列表文件中包括源程序语句和目标代码。

每个列表文件的顶部有两行汇编程序的标题、一行空行以及页号行。.title命令提供的文件名打印在页号行左侧;页号打印在此行的右侧。

源文件的每一行都会在列表文件中生成一行。其内容包括行号、段程序计数器SPC的数值、汇编后的目标代码,以及源程序语句。一条指令可以生成1或2个字的目标代码。汇编器为第2字单独列一行,并列出了SPC的数值和目标代码。

2024/8/866第4章汇编语言程序开发工具4.5

链接器的使用链接器的主要任务是根据链接命令文件(d),将一个或多个COFF目标文件链接起来,生成存储器映像文件(.map)和可执行的输出文件(.out)。

在链接过程中,链接器将各个目标文件合并,并完成以下工作:●

将各个段配置到目标系统的存储器。

对各个符号和段进行重新定位,并给它们指定一个最终的地址。

解决输入文件之间未定义的外部引用。2024/8/867第4章汇编语言程序开发工具

链接器的运行

1.

运行链接程序

’C54x链接器的运行命令:

lnk500

[-options]filename1…filenamen

lnk500:

运行链接器命令。-options:

链接命令选项。可以出现在命令行或链接命令文件的任何位置。filenames:

文件名。可以是目标文件、链接命令文件或文件库。所有文件扩展名的默认值为.obj。2024/8/868第4章汇编语言程序开发工具1.

运行链接程序

’C54x链接器的运行,有三种方法:

(1)键入命令:

lnk500

链接器会提示如下信息:

Commandfiles:Objectfiles[.obj]:OutputFiles[a.out]:Options:(要求键入一个或多个命令文件)

(要求键入一个或多个需要链接的目标文件)(要求键入一个链接器所生成的输出文件名)(要求附加一个链接选项)2024/8/869第4章汇编语言程序开发工具1.

运行链接程序

(2)

键入命令:

lnk500

file1.obj

file2.obj

-olink.out

在命令行中指定选项和文件名。

目标文件:

file1.obj、file2.obj

命令选项:

-o

输出文件:

link.out

将两个目标文件进行链接,生成一个可执行的输出文件link.out。2024/8/870第4章汇编语言程序开发工具1.

运行链接程序

(3)

键入命令:

lnk500linkerdlinkerd:链接命令文件。在执行上述命令之前,需将链接的目标文件、链接命令选项以及存储器配置要求等编写到链接命令文件linkerd中。

例如:希望完成第二种命令的链接,在链接命令文件中,应包含如下内容:

file1.objfile2.obj-olink.out

2024/8/871第4章汇编语言程序开发工具

链接器的运行

2.

链接命令选项在链接时,连接器通过链接命令选项控制链接操作。链接命令选项可以放在命令行或命令文件中,所有选项前面必须加一短划线“-〞。除-l和-i选项外,其他选项的先后顺序并不重要。选项之间可以用空格分开。最常用选项为-m和-o,分别表示输出的地址分配表映像文件名和输出可执行文件名。2024/8/872第4章汇编语言程序开发工具2.

链接命令选项链接命令选项选项含义-a

生成一个绝对地址的、可执行的输出模块。所建立的绝对地址输出文件中不包含重新定位信息。如果既不用-a

选项,也不用-r选项,链接器就像规定-a选项那样处理。

-ar

生成一个可重新定位、可执行的目标模块。这里采用了-a和-r两个选项(可以分开写成-a-r,也可以连在一起写作-ar),与-a选项相比,-ar选项还在输出文件中保留有重新定位信息。

-eglobal_symbol

定义一个全局符号,这个符号所对应的程序存储器地址,就是使用开发工具调试这个链接后的可执行文件时程序开始执行时的地址(称为入口地址)。当加载器将一个程序加载到目标存储器时,程序计数器(PC)被初始化到入口地址,然后从这个地址开始执行程序。

2024/8/873第4章汇编语言程序开发工具2.

链接命令选项链接命令选项选项含义-ffill_vale

对输出模块各段之间的空单元设置一个16位数值(fill_value),如果不用-f选项,则这些空单元都置0。

-idir

更改搜索文档库算法,先到dir(目录)中搜索。此选项必须出现在-l选项之前。

-lfilename命名一个文档库文件作为链接器的输入文件;filename为文档库的某个文件名。此选项必须出现在-i选项之后。

-mfilename生成一个.map映像文件,filename是映像文件的文件名。.map文件中说明存储器配置、输入、输出段布局以及外部符号重定位之后的地址等。

-ofilename

对可执行输出模块命名。如果默认,则此文件名为a.out。

-r

生成一个可重新定位的输出模块。当利用-r选项且不用-a选项时,链接器生成一个不可执行的文件。

2024/8/874第4章汇编语言程序开发工具

链接器命令文件的编写与使用链接命令文件用来为链接器提供链接信息,可将链接操作所需的信息放在一个文件中,这在屡次使用同样的链接信息时,可以方便地调用。在链接命令文件中,可使用MEMORY和SECTIONS伪指令,为实际应用指定存储器结构和地址的映射。MEMORY——用来指定目标存储器结构。SECTIONS——用来控制段的构成与地址分配。2024/8/875第4章汇编语言程序开发工具

链接器命令文件的编写与使用链接命令文件为ASCⅡ文件,可包含以下内容:

(1)

输入文件名,用来指定目标文件、存档库或其他命令文件。

(2)

链接器选项,它们在命令文件中的使用方法与在命令行中相同。

(3)

MEMORY和SECTIONS链接伪指令,用来指定目标存储器结构和地址分配。

(4)

赋值说明,用于给全局符号定义和赋值。2024/8/876第4章汇编语言程序开发工具例如:可根据给出链接命令,编写完成该命令操作的链接器命令文件linkd。

lnk500a.objb.obj-mprog.map-oprog.out该命令是将两个目标文件a.obj和b.obj进行链接,生成一个映像文件prog.map和一个可执行的输出文件prog.out。链接命令文件的内容如下:

a.obj/*第一个输入文件名*/b.obj/*第二个输入文件名*/-mprog.map/*指定map文件的选项*/-oprog.out/*指定输出文件的选项*/2024/8/877第4章汇编语言程序开发工具

【例】链接器命令文件举例。

a.objb.obj/*输入文件名*/

-oprog.out/*指定输出文件的选项*/-mprog.map/*指定map文件的选项*/

MEMORY/*MEMORY伪指令*/

{PAGE0:ROM:origin=1000h,length=0100hPAGE1:RAM:origin=0100h,length=0100h}SECTIONS/*SECTIONS伪指令*/

{.text:>ROM.data:>ROM.bss:>RAM}

2024/8/878第4章汇编语言程序开发工具注意:在命令文件中,不能采用以下符号作为段名或符号名:

alignDSECTlenorunALIGNflengthorgRUNattrfillLENGTHoriginSECTIONSATTRFILLloadORIGINspareblockgroupLOADpagetypeBLOCKGROUPMEMORYPAGETYPECOPYl(小写L)NOLOADrangeUNION2024/8/879第4章汇编语言程序开发工具4.5.4MEMORY指令

MEMORY指令用来规定目标存储器的结构。在实际的应用中,目标系统所配置的存储器是各不相同的,通过MEMORY指令,可以进行各种各样的存储器配置。MEMORY指令的句法:

MEMORY{PAGE0:name1[(attr)]:origin=constant,length=constant;PAGEn:namen[(attr)]:origin=constant,length=constant;}

指令字存储区间说明语句书写方式:①已大写MEMORY指令字开始;

②由大括号括起来的存储器区间说明。存储区间:存储页面区间名称区间属性起始地址区间长度2024/8/880第4章汇编语言程序开发工具4.5.4MEMORY指令存储区间说明语句:

PAGE:指定存储器空间页面,最多为255页,取决于目标存储器的配置。每一个PAGE代表一个完全独立的地址空间。通常,PAGE0用于程序存储器;PAGE1用于数据存储器。假设没有规定PAGE,那么链接器默认为PAGE0。2024/8/881第4章汇编语言程序开发工具4.5.4MEMORY指令存储区间说明语句:

name:存储器区间名称。可由用字母、$、.、_等组成。存储器区间为内部记号,因此不需要保存在输出文件或者符号表中。不同PAGE上的存储器区间可以取相同的名字,但在同一PAGE内的名字不能相同,且不许重叠配置。2024/8/882第4章汇编语言程序开发工具4.5.4MEMORY指令存储区间说明语句:

attr:

为任选项,用来为命名的存储器区间规

定1~4个属性。

当对输出段定位时,可利用属性限制输出段分配到一定的存储区间。

属性选项共有4项:

R

规定可以对存储器执行读操作。

W规定可以对存储器执行写操作。

X

规定存储器可以装入可执行的程序代码。I规定可以对存储器进行初始化。假设未选属性,可将输出段不受限制地定位到任何一个存储器的位置。任何一个没有规定属性的存储器(包括所有默认方式的存储器)都有全部4项属性。2024/8/883第4章汇编语言程序开发工具4.5.4MEMORY指令存储区间说明语句:

origin:用来指定存储区间的起始地址,可简写为org或o。其值以字为单位,可以用十进制、八进制或十六进制数表示。

Length:

用来指定存储器空间的长度,可简写为len或l,其值以字为单位,可以用十进制、八进制或十六进制数表示。2024/8/884第4章汇编语言程序开发工具4.5.4MEMORY指令存储区间说明语句:

fill:

为任选项。用来为没有定位输出段的存储器空单元充填一个数,键入fill或f均可。该值是2个字节的整型常数,可以是十进制数、八进制数或十六制数。2024/8/885第4章汇编语言程序开发工具【例】用MEMORY伪指令编写连接命令文件。要求:

程序存储器:4K字ROM,起始地址为C00h,取名为ROM。

数据存储器:32字RAM,起始地址为60h,取名为SCR。

512字RAM,起始地址为80h,取名为CHIP。file1.objfiel2.obj-oProg.outMEMORY{

PAGE0:

ROM:origin=C00h,length=1000h

PAGE1:

SCR:origin=60h,length=20h

CHIP:origin=80h,length=200h}

两个输入文件链接命令选项指令字页面名称区间名称起始地址区间长度2024/8/886第4章汇编语言程序开发工具【例】用MEMORY伪指令编写连接命令文件。file1.objfiel2.obj-oProg.outMEMORY{ PAGE0:

ROM:org=C00h,len=1000hPAGE1:

SCR:org=60h,len=20h

CHIP

温馨提示

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

评论

0/150

提交评论