汇编语言程序开发工具.ppt
2023/9/18,DSP原理及应用,1,第4章 汇编语言程序开发工具,内容提要 可编程DSP芯片开发需要一套完整的软、硬件开发工具。通常可分成代码生成工具和代码调试工具两大类。代码生成工具是指将高级语言或汇编语言编写的DSP程序转换成可执行的DSP芯片目标代码的工具程序,主要包括汇编器、链接器和C编译器以及一些辅助工具程序等。代码调试工具包括C/汇编语言源码调试器、仿真器等。本章主要介绍代码生成工具,包括C54x软件开发流程、汇编语言程序的编写、编辑、汇编和链接过程、COFF段的一般概念、汇编器和链接器处理段的方法以及程序的重定位等。,2023/9/18,DSP原理及应用,2,第4章 汇编语言程序开发工具,4.1 TMS320C54x软件开发过程 4.2 汇编语言程序的编辑、汇编和链接过程 4.3 COFF的一般概念 4.4 源程序的汇编4.5 链接器的使用,2023/9/18,DSP原理及应用,3,第4章 汇编语言程序开发工具,4.1 TMS320C54x软件开发过程,C54x的应用软件开发主要完成以下工作:(1)选择编程语言编写源程序 C54x提供2种编程语言,即汇编语言和C/C+语言。对于完成一般功能的代码,这两种语言都可使用,但对于一些运算量很大的关键代码,最好采用汇编语言来完成,以提高程序的运算效率。(2)选择开发工具和环境 C54x提供了两种开发环境。即非集成开发环境和集成开发环境CCS。,2023/9/18,DSP原理及应用,4,第4章 汇编语言程序开发工具,4.1 TMS320C54x软件开发过程,1.C54x应用软件开发流程,C54x应用软件的开发可在TI公司提供的开发环境中进行,用户可以用C/C+语言或汇编语言编写源文件,经C编译器、汇编器生成COFF格式的目标文件,再用链接器进行链接,生成在C54x上可执行的目标代码,然后利用调试工具对可执行的目标代码进行仿真和调试。当调试完成后,通过Hex代码转换工具,将调试后的可执行目标代码转换成EPROM编程器能接受的代码,并将该代码固化到EPROM中或加载到用户的应用系统中,以便DSP目标系统脱离计算机单独运行。,2023/9/18,DSP原理及应用,5,第4章 汇编语言程序开发工具,1.C54x应用软件开发流程,开发过程的目的是产生一个可以由C54x目标系统执行的模块。,2023/9/18,DSP原理及应用,6,第4章 汇编语言程序开发工具,2.C54x的开发工具,TI公司提供的DSP开发环境和工具主要包括以下三个部分:代码生成工具 代码调试工具 实时操作系统,2023/9/18,DSP原理及应用,7,第4章 汇编语言程序开发工具,2.C54x的开发工具,(1)代码生成工具:,C编译器:用来将C/C+语言源程序自动编译为C54x的汇编语言源程序。汇编器:用来将汇编语言源文件汇编成机器语言COFF目标文件。链接器:将汇编生成的、可重新定位的COFF目标模块组合成一个可执行的COFF目标模块。文档管理器:允许用户将一组文件(源文件或目标文件)集中为一个文档文件库。,2023/9/18,DSP原理及应用,8,第4章 汇编语言程序开发工具,2.C54x的开发工具,助记符指令代数式指令翻译器:用来将包含助记符指令的汇编语言源文件转换成包含代数式指令的汇编语言源文件。建库实用程序:用来建立用户自己使用的、并用C/C+语言编写的支持运行的库函数。十六进制转换程序:可以很方便地将COFF目标文件转换成TI、Intel、Motorola等公司的目标文件格式。,(1)代码生成工具:,2023/9/18,DSP原理及应用,9,第4章 汇编语言程序开发工具,2.C54x的开发工具,(1)代码生成工具:,绝对制表程序:将链接后的目标文件作为输入,生成.abs输出文件。交叉引用制表程序:利用目标文件生成一个交叉引用清单,列出链接的源文件中的符号以及它们的定义和引用情况。,2023/9/18,DSP原理及应用,10,第4章 汇编语言程序开发工具,2.C54x的开发工具,(2)代码调试工具:,C/汇编语言源码调试器:与软件仿真器、评价模块、软件开发系统、软件仿真器等配合使用。软件仿真器:是一种模拟DSP芯片各种功能并在非实时条件下进行软件调试的调试工具,它不需目标硬件支持,只需在计算机上运行。初学者工具DSK:是TI公司提供给初学者进行DSP编程练习的一套廉价的实时软件调试工具。,2023/9/18,DSP原理及应用,11,第4章 汇编语言程序开发工具,2.C54x的开发工具,(2)代码调试工具:,软件开发系统SWDS:是一块PC插卡,可提供低成本的评价和实时软件开发,还可用来进行软件调试,程序可在DSP芯片上实时运行。可扩展的开发系统仿真器(XDS510):可用来进行系统级的集成调试,是进行DSP芯片软硬件开发的最佳工具。评价模块EVM板:是一种低成本的开发板,可进行DSP芯片评价、性能评估和有限的系统调试。,2023/9/18,DSP原理及应用,12,第4章 汇编语言程序开发工具,4.2 汇编语言程序的编辑、汇编和链接过程,汇编语言源程序可以在任何一种文本编辑器中进行。如笔记本、WORD、EDIT、TC等。当汇编语言源程序编写完成后,还必须经过汇编和链接后才能运行。,2023/9/18,DSP原理及应用,13,第4章 汇编语言程序开发工具,4.2 汇编语言程序的编辑、汇编和链接过程,示意图,2023/9/18,DSP原理及应用,14,第4章 汇编语言程序开发工具,4.2 汇编语言程序的编辑、汇编和链接过程,1.编辑,利用各种文本编辑器,如笔记本、WORD、EDIT和TC等,可编写汇编语言源程序。,2.汇编,当汇编语言源程序编写好以后,可利用C54x的汇编器ASM500,对一个或多个源程序分别进行汇编,并生成列表文件(.lst)和目标文件(.obj)。,2023/9/18,DSP原理及应用,15,第4章 汇编语言程序开发工具,4.2 汇编语言程序的编辑、汇编和链接过程,2.汇编,常用的汇编命令:,asm500%1 s 1 x,调用汇编器命令,源文件名,将程序所有定义的符号放在目标文件的符号表中,生成一个列表文件.lst,生成一个交叉汇编表,2023/9/18,DSP原理及应用,16,第4章 汇编语言程序开发工具,4.2 汇编语言程序的编辑、汇编和链接过程,3.链接,所谓链接,就是利用C54x的链接器LNK500,根据链接器命令文件(.cmd)对已汇编过的一个或多个目标文件(.obj)进行链接,生成输出文件(.out)和存储器映像文件(.map)。,常用的汇编器命令:,lnk500%1.cmd,lnk500:调用链接器命令,%1.cmd:链接命令文件名,该文件须指明目标文件、输入文件、输出文件、链接选项和存储器配置要求等。,2023/9/18,DSP原理及应用,17,第4章 汇编语言程序开发工具,4.3 COFF的一般概念,汇编器和链接器生成的目标文件,是一个可以由C54x器件执行的文件。这些目标文件的格式称之为公共目标文件格式(COFF)。,在编写汇编语言程序时,COFF采用代码段和数据段的形式,以便于模块化的编程,使编程和管理变得更加方便。这些代码段和数据段简称为段。汇编器和链接器提供一些伪指令来建立和管理各种各样的段。,2023/9/18,DSP原理及应用,18,第4章 汇编语言程序开发工具,4.3 COFF的一般概念,COFF文件的基本单元,COFF文件有3种类型:COFF0、COFF1、COFF2。,每种类型的COFF文件,其标题格式都有所不同,但数据部分是相同的。,链接器能够读/写所有类型的COFF文件,默认时链接器生成的是COFF2文件,采用-vn链接选项可以选择不同类型的COFF文件。,C54x汇编器和C编译器产生的是COFF2文件。,2023/9/18,DSP原理及应用,19,第4章 汇编语言程序开发工具,COFF文件的基本单元,1.段(sections),是COFF文件中最重要的概念。每个目标文件都分成若干段。,段是存储器中占据相邻空间的代码或数据块。一个目标文件中的每个段都是分开的和各不相同的。,COFF目标文件都包含以下3种形式的段:.text 段(文本段),通常包含可执行代码;.data 段(数据段),通常包含初始化数据;.bss 段(保留空间段),通常为未初始化变量保留存储空间。,2023/9/18,DSP原理及应用,20,第4章 汇编语言程序开发工具,COFF文件的基本单元,2.段的基本类型,COFF目标文件中的段有两种基本类型。,初始化段 未初始化段,(1)初始化段,初始化段中包含有数据或程序代码。主要有:.text段已初始化段;.data段已初始化段;.sect段已初始化段,由汇编器伪指令建立 的自定义段。,2023/9/18,DSP原理及应用,21,第4章 汇编语言程序开发工具,COFF文件的基本单元,2.段的基本类型,COFF目标文件中的段有两种基本类型。,(2)未初始化段,在存储空间中,为未初始化数据保留存储空间。它包括:.bss段未初始化段;.usect段未初始化段,由汇编命令建立的命 名段(自定义段)。,2023/9/18,DSP原理及应用,22,第4章 汇编语言程序开发工具,COFF文件的基本单元,3.段与目标存储器的对应关系,汇编器的任务:在汇编过程中,根据汇编命令用适当的段将各部分程序代码和数据连在一起,构成目标文件。链接器的任务:就是分配存储单元,将目标文件中的段重新定位到目标系统的存储器中,这一过程称为定位或分配。,2023/9/18,DSP原理及应用,23,第4章 汇编语言程序开发工具,3.段与目标存储器的对应关系,目标文件中的段与目标存储器之间的关系,.bss,.data,.text,RAM,E2PROM,ROM,2023/9/18,DSP原理及应用,24,第4章 汇编语言程序开发工具,汇编器对段的处理,汇编器对段的处理是通过段伪指令来区别各个段的,并将段名相同的语句汇编在一起。汇编器有5条伪指令可识别汇编语言程序的各个部分:,.bss.usect.text.data.sect,定义未初始化段定义未初始化段定义已初始化段定义已初始化段定义已初始化段,2023/9/18,DSP原理及应用,25,第4章 汇编语言程序开发工具,汇编器对段的处理,未初始化段就是在C54x存储器中保留空间,通常它们被定位在RAM区。在目标文件中,这些段中没有确切的内容。由这些段定义的空间仅作为临时存储空间,在程序运行时,可以利用这些存储空间存放变量。未初始化段分为默认的和命名的两种,分别由汇编器伪指令.bss和.usect产生。,1.未初始化段,2023/9/18,DSP原理及应用,26,第4章 汇编语言程序开发工具,(1).bss伪指令,1.未初始化段,用于在bss段中保留若干个空间。格式:.bss 符号,字数,符号对应于保留的存储空间第一个字的变量名称。可以让其他段引用,也可以用.global命令定义为全 局符号。,字数表示在bss段或标有名字的段中保留若干个存储单元。,每调用一次.bss伪指令,汇编器在相应的段保留更多的空间。,2023/9/18,DSP原理及应用,27,第4章 汇编语言程序开发工具,1.未初始化段,(2).usect伪指令,用于为指定的命名段保留若干个空间。格式:符号.usect“段名”,字数,段名程序员为未初始化的命名段定义的名字。,每调用一次.usect伪指令,汇编器在指定的命名段保留更多的空间。,2023/9/18,DSP原理及应用,28,第4章 汇编语言程序开发工具,汇编器对段的处理,已初始化段中包含有可执行代码或初始化数据。这些段中的内容都在目标文件中,当加载程序时再放到C54x的存储器中。每个已初始化段都是可以重新定位的,并且可以引用其他段中所定义的符号。链接器在链接时会自动地处理段间的相互引用。已初始化段由.text、.data和.sect三个伪指令建立。,2.已初始化段,2023/9/18,DSP原理及应用,29,第4章 汇编语言程序开发工具,已初始化命令的句法:,2.已初始化段,.text 段起点.data 段起点.sect“段名”,段起点,段起点是任选项。若选用,它为段程序计数器SPC定义一个起始值。若默认,则SPC从0开始。,2023/9/18,DSP原理及应用,30,第4章 汇编语言程序开发工具,汇编器对段的处理,当汇编器遇到.text或.data或.sect命令时,将停止对当前段的汇编(相当于一条结束当前段汇编的命令),然后将紧接着的程序代码或数据汇编到指定的段中,直到再遇到另一条.text、.data或.sect命令为止。当汇编器遇到.bss或.usect命令时,并不结束当前段的汇编,只是暂时从当前段脱离出来,并开始对新的段进行汇编。.bss和.usect命令可以出现在一个已初始化段的任何位置,而不会对它的内容发生影响。,2023/9/18,DSP原理及应用,31,第4章 汇编语言程序开发工具,汇编器对段的处理,命名段由用户指定,与默认的.text,.data和.bss段的使用相同,但它们被分开汇编。假如一部分可执行代码(例如初始化程序)不希望和.text段分配在一起,可将它们汇编进一个命名段,这样就可定位在与.text不同的地方。也可将初始化的数据汇编到与.data段不同的地方,或者将未初始化的变量保留在与.bss段不同的位置。可用.usect和.sect两个伪指令产生命名段。,3.命名段(自定义段),2023/9/18,DSP原理及应用,32,第4章 汇编语言程序开发工具,.usect伪指令产生类似.bss的段,为变量在RAM中保留存储空间。.sect伪指令产生类似.text和.data的段,可以包含代码或数据。.sect伪指令产生可重新定位地址的命名段。,3.命名段,产生命名段伪指令格式:,符号.usect“段名”,字数.sect“段名”,可以产生多达32767个不同的命名段。段名可长达200个字符。,2023/9/18,DSP原理及应用,33,第4章 汇编语言程序开发工具,对于.sect和.usect伪指令,段名可以作为子段的参考。每次用一个新名字调用这些伪指令时,就产生一个新的命名段。若用已有的段名调用这些伪指令,则汇编器就将代码或数据(或保留空间)汇编进相应名称的段中。不同的伪指令不能使用相同的名字。即不能用.usect创建了命名段,然后又用.sect创建一个相同名字的段。,3.命名段,2023/9/18,DSP原理及应用,34,第4章 汇编语言程序开发工具,汇编器对段的处理,子段是较大段中的小段。链接器可以像处理其他段一样处理子段。子段结构可用来对存储器空间进行更紧凑的控制,可以使存储器空间分配更加紧密。,4.子段,子段命名格式:,基段名:子段名,子段名前为基段名,随后为冒号,最后为子段名。,2023/9/18,DSP原理及应用,35,第4章 汇编语言程序开发工具,对于子段,汇编器可以单独为其分配存储单元,或者在相同的基段名下与其他段组合在一起。用.sect命令建立的段是已初始化的子段;用.usect命令建立的段是未初始化的子段。,4.子段,例如,若要在.text段内建立一个称之为_func的子段,其命令格式:,.sect“.text:_func”,2023/9/18,DSP原理及应用,36,第4章 汇编语言程序开发工具,汇编器对段的处理,汇编器为每个段都安排了一个单独的程序计数器称之为段程序计数器SPC。SPC表示在程序代码或数据段内当前的地址。开始时汇编器将每个SPC置0。当汇编器将程序代码或数据加到段内时,增加相应的SPC值。若再继续对某个段汇编,则相应的SPC就在先前的数值上继续增加。链接器在链接时要对每个段进行重新定位。,5.段程序计数器SPC,2023/9/18,DSP原理及应用,37,第4章 汇编语言程序开发工具,【例】段命令应用举例。,汇编语言源程序:,.datacoeff.word 044h,055h,066h.bss buffer,8 prt.word 0456h.textadd:LD 0Dh,A aloop:SUB#1,A BC aloop,AGEQ.dataivals.word 0CCh,0DDh,0EEh,;初始化数据段;3组数据放入.data段;在.bss段保留8个单元;0456h放入.data段;初始化文本段;1字指令;2字指令;2字指令,共计5个字,;初始化数据段;3组数据放入.data段,2023/9/18,DSP原理及应用,38,第4章 汇编语言程序开发工具,汇编语言源程序:,var2.usect“newvars”,2 inbuf.usect“newvars”,8.text mpy:LD 0Ah,B mloop:MPY#0Ah,B BC mloop,BNOV.sect“vectors”.word 044h,088h,;建立newvars命名段,保留2个单元;在newvars段保留8个单元;初始化文本段;1字指令;2字指令;2字指令,共计5个字,;建立vectors命名段;2组数据放入vectors命名段,2023/9/18,DSP原理及应用,39,第4章 汇编语言程序开发工具,经汇编后,得列表文件(部分):,2*3*汇编一个初始化表到.data段*4*5 0000.data6 0000 0044 coeff.word 044h,055h,066h 0001 0055 0002 00667*8*在.bss段中为变量保留空间*9*10 0000.bss buffer,811*12*仍然在.data 段中*13*14 0003 0456 prt.word 0456h,2023/9/18,DSP原理及应用,40,第4章 汇编语言程序开发工具,15*16*汇编代码到.text段*17*18 0000.text19 0000 100d add:LD 0Dh,A20 0001 f010 aloop:SUB#1,A 0002 0001 21 0003 f842 BC aloop,AGEQ 0004 0001 22*23*汇编另一个初始化表到.data 段*24*25 0004.data 26 0004 00cc ivals.word 0CCh,0DDh,0EEh 0005 00dd 0006 00ee27*28*为更多的变量定义另一个段*29*30 0000 var2.usect“newvars”,2 31 0001 inbuf.usect“newvars”,8,2023/9/18,DSP原理及应用,41,第4章 汇编语言程序开发工具,32*33*汇编更多代码到.text段*34*35 0005.text 36 0005 110a mpy:LD 0Ah,B 37 0006 f166 mloop MPY#0Ah,B 0007 000a 38 0008 f868 BC mloop,BNOV 0009 0006 39*40*为中断向量.vectors定义一个自定义段*41*42 0000.sect“vectors”43 0000 0044.word 044h,088h 0001 0088,源程序的行号,段程序计数器,目标代码,汇编语言源程序,2023/9/18,DSP原理及应用,42,第4章 汇编语言程序开发工具,汇编语言源程序经过汇编后,共建立了5个段:.text段文本段,段内有10个字可执行 的程序代码。.data段已初始化的数据段,段内有7 个字的数据。vectors段用.sect命令生成的命名段,段内有2个字的初始化数据。.bss段未初始化的数据段,在存储器中 为变量保留8个存储单元。newvars段用.usect命令建立的命名段,为变量保留10个存储单元。,2023/9/18,DSP原理及应用,43,第4章 汇编语言程序开发工具,经汇编后,得列表文件(部分):,2*3*汇编一个初始化表到.data段*4*5 0000.data6 0000 0044 coeff.word 044h,055h,066h 0001 0055 0002 00667*8*在.bss段中为变量保留空间*9*10 0000.bss buffer,811*12*仍然在.data 段中*13*14 0003 0456 prt.word 0456h,5 0000.data,6 0000 0044 coeff.word 044h,055h,066h,10 0000.bss buffer,8,14 0003 0456 prt.word 0456h,.data,6,0044,6,0055,6,0066,10,.bss,没有数据保留8个字,14,0456,2023/9/18,DSP原理及应用,44,第4章 汇编语言程序开发工具,15*16*汇编代码到.text段*17*18 0000.text19 0000 100d add:LD 0Dh,A20 0001 f010 aloop:SUB#1,A 0002 0001 21 0003 f842 BC aloop,AGEQ 0004 0001 22*23*汇编另一个初始化表到.data 段*24*25 0004.data 26 0004 00cc ivals.word 0CCh,0DDh,0EEh 0005 00dd 0006 00ee27*28*为更多的变量定义另一个段*29*30 0000 var2.usect“newvars”,2 31 0001 inbuf.usect“newvars”,8,.text,18 0000.text,19 0000 100d add:LD 0Dh,A,19,100d,20 0001 f010 aloop:SUB#1,A,20,f010,20,0001,21 0003 f842 BC aloop,AGEQ,21,f842,21,0001,25 0004.data,26 0004 00cc ivals.word 0CCh,0DDh,0EEh,.data,26,00cc,26,00dd,26,00ee,30 0000 var2.usect“newvars”,2,newvars,30,保留2个字,31 0001 inbuf.usect“newvars”,8,31,保留8个字,2023/9/18,DSP原理及应用,45,第4章 汇编语言程序开发工具,32*33*汇编更多代码到.text段*34*35 0005.text 36 0005 110a mpy:LD 0Ah,B 37 0006 f166 mloop MPY#0Ah,B 0007 000a 38 0008 f868 BC mloop,BNOV 0009 0006 39*40*为中断向量.vectors定义一个自定义段*41*42 0000.sect“vectors”43 0000 0044.word 044h,088h 0001 0088,35 0005.text,.text,36 0005 110a mpy:LD 0Ah,B,36,110a,37 0006 f166 mloop MPY#0Ah,B,37,f168,37,000a,38 0008 f868 BC mloop,BNOV,38,f868,38,0006,42 0000.sect“vectors”,vectors,43 0000 0044.word 044h,088h,43,0044,43,0088,2023/9/18,DSP原理及应用,46,第4章 汇编语言程序开发工具,链接器对段的处理,链接器是开发C54x器件必不可少的开发工具之一,它对段处理时有2个主要任务:将一个或多个COFF目标文件中的各种段作为链接器的输入段,经链接后在一个执行的COFF输出模块中建立各个输出段;在程序装入时对其重新定位,为各个输出段选定存储器地址。,2023/9/18,DSP原理及应用,47,第4章 汇编语言程序开发工具,链接器对段的处理,链接器有2条伪指令支持上述任务:,MEMORY伪指令用来定义目标系统的存储器配置空间,包括对存储器各部分命名,以及规定它们的起始地址和长度。SECTIONS伪指令用来指定链接器将输入段组合成输出段方式,以及输出段在存储器中的位置,也可用于指定子段。若未使用伪指令,则链接器将使用目标处理器默认的方法将段放入存储空间。,2023/9/18,DSP原理及应用,48,第4章 汇编语言程序开发工具,链接器对段的处理,1.默认的存储器分配,链接器可对多个目标文件进行链接。若链接文件中不使用MEMORY和SECTIONS命令,则为默认方式。每个目标文件都有.text,.data、.bss段和命名段。若采用默认链接,链接器将对多个目标文件中的各个段进行组合,形成各自的对应段,并将各个段配置到所指定的存储器中,形成可执行的目标模块。在默认的方式下,链接器将从存储器的0080h开始,对组合后的各段进行存储器配置。,2023/9/18,DSP原理及应用,49,第4章 汇编语言程序开发工具,默认的存储器分配:将所有.text段组合在一起,形成一个.text段,并分配到程序存储器中;将多个目标文件中的.data段组合在一起,分配到紧接着.text段的程序存储空间中;将.bss段组合,配置到数据存储器中;组合命名段。初始化的命名段按顺序分配到紧随.data段的程序存储器,而未初始化命名段将被配置到紧随.bss段的数据存储器中。,1.默认的存储器分配,2023/9/18,DSP原理及应用,50,第4章 汇编语言程序开发工具,默认的存储器分配过程:,.text,.text1,.text2,.data,.data1,.data2,.bss,.bss1,.bss2,table,table_1,table_2,u_vars1,u_vars1,u_vars2,FFT,FFT,没有使用,没有配置,没有配置,没有使用,2023/9/18,DSP原理及应用,51,第4章 汇编语言程序开发工具,链接器对段的处理,2.段放入存储器空间,若不希望链接器将所有的.text段结合在一起形成单个的.text段,就不能采用默认的方式。由于DSP硬件系统中可能配置多种类型的存储器,若要把某一段分配到特定类型的存储器中,或将命名段配置特定的地址,则需采用MEMORY和SECTIONS伪指令来配置。若不采用默认的方式,通常需要建立一个链接命令文件,在命令文件中用MEMORY和SECTIONS伪指令定义存储器和配置段地址。,2023/9/18,DSP原理及应用,52,第4章 汇编语言程序开发工具,链接器对程序的重新定位,1.链接器重新定位,汇编器对每个段汇编时都是从0地址开始,而所有需要重新定位的符号(标号)在段内都是相对于0地址的。事实上,所有段都不可能从存储器中0地址单元开始,因此链接器必须对各个段进行重新定位。,重新定位的方法:将各个段配置到存储器中,使每个段都有一个 合适的起始地址;将符号变量调整到相对于新的段地址的位置;将引用调整到重新定位后的符号,这些符号 反映了调整后的新符号值。,2023/9/18,DSP原理及应用,53,第4章 汇编语言程序开发工具,1.链接器重新定位,汇编器在需要引用重新定位的符号处都留了一个重定位入口。链接器在对符号重新定位时,利用这些入口修正对符号的引用值。,【例】一段采用助记符指令编写的程序,经汇编后得列表文件如下:,1.ref X2.ref Z3 0000.text4 0000 F073 B Y;产生一个重定位入口 0001 00065 0002 F073 B Z;产生一个重定位入口 0003 0000!6 0004 F020 LD#X,A;产生一个重定位入口 0005 0000!7 0006 F7E0 Y:RESET,2023/9/18,DSP原理及应用,54,第4章 汇编语言程序开发工具,1.链接器重新定位,程序中有三个符号:X、Z是在另一个模块中定义的;Y在.text段中定义的。当程序汇编时,X、Z的值为0未定义的外部符号 Y的值为6相对于.text段地址0定义 汇编器形成了两个重定位入口:X和Z:在.text段中为一次外部引用,用符号!表示;Y:是一次内部引用,用符号表示。链接时,X重新定位在地址7100h.text段起始地址重新定位在7200h Y的重新定位值为7204h。,2023/9/18,DSP原理及应用,55,第4章 汇编语言程序开发工具,1.链接器重新定位,链接器利用两个重定位入口,对目标文件中的两次引用进行修正:,变成 f073 7204变成 f020 7100,f073 B Y 0004 f020 LD#X,A 0000!,2023/9/18,DSP原理及应用,56,第4章 汇编语言程序开发工具,链接器对程序的重新定位,2.运行时间重新定位,在实际运行中,有时需要将代码装入存储器的一个地方,而在另一个地方运行。如:一些关键的执行代码必须装在系统的ROM中,但运行时希望在较快的RAM中进行。利用SECTIONS伪指令选项可让链接器对其定位2次,其方法:使用装入关键字设置装入地址;使用运行关键字设置它的运行地址。,2023/9/18,DSP原理及应用,57,第4章 汇编语言程序开发工具,链接器对程序的重新定位,2.运行时间重新定位,装入地址确定段的原始数据或代码装入的位置,而任何对段的使用(例如其中的标号),则参考它的运行地址。在应用中必须将该段从装入地址复制到运行地址。如果只为段提供了一次定位(装入或运行),则该段将只定位一次,并且装入和运行地址相同。如果提供了2个地址,则段将被自动定位。,2023/9/18,DSP原理及应用,58,第4章 汇编语言程序开发工具,程序装入,链接器产生可执行的COFF目标文件。可执行的目标文件模块与链接器输入的目标文件具有相同的COFF格式。为了运行程序,在可执行模块中的数据必须传输或装入目标系统存储器中。,可以采用以下方法装入程序:,使用调试工具转入程序 C54x的调试工具包括软件模拟器,XDS仿真器和集成系统CCS。它们都具有内部的装入器,调用装入器的LOAD命令,装入器将程序复制到目标系统的存储器中。,采用Hex转换工具转入程序 可以使用转换工具Hex500,将可执行COFF目标模块转换成几种其他目标格式文件,然后将转换后的文件通过编程器将程序装(烧)进EPROM。,2023/9/18,DSP原理及应用,59,第4章 汇编语言程序开发工具,COFF文件中的符号,COFF文件中有一个符号表,主要用来存储程序中有关符号的信息。链接器在执行程序定位时,要使用符号表提供的信息,而调试工具也要使用该表来提供符号调试。,1.外部符号,是指在一个模块中定义、而在另一个模块中引用的符号。它可以用伪指令.def、.ref或.global来定义。.def在当前模块中定义,并可在别的模块中使用的符号;.ref 在当前模块中使用,但在别的模块中定义的符号;.global可以是上面的任何一种情况。,2023/9/18,DSP原理及应用,60,第4章 汇编语言程序开发工具,1.外部符号,【例】说明代码段中外部符号的定义。,x:ADD#56h,A B y.def x.ref y,;定义x;引用y;x在此模块中定义,可为别 的模块引用;y在这里引用,它在别的模 块中定义,2023/9/18,DSP原理及应用,61,第4章 汇编语言程序开发工具,COFF文件中的符号,2.符号表,每当遇到一个外部符号,无论是定义的还是引用的,汇编器都将在符号表中产生一个条目。汇编器还产生一个指到每段的专门符号,链接器使用这些符号将其他引用符号重新定位。,2023/9/18,DSP原理及应用,62,第4章 汇编语言程序开发工具,4.4 源程序的汇编,汇编器的作用是将汇编语言源程序转换成机器语言目标文件。这些目标文件都是公共目标文件格式(COFF)。汇编语言源程序文件可以包含汇编命令、汇编语言指令和宏指令。汇编命令用来控制汇编的过程,包括列表格式、符号定义和将源代码放入块的方式等。,2023/9/18,DSP原理及应用,63,第4章 汇编语言程序开发工具,4.4 源程序的汇编,汇编器包括如下功能:,将汇编语言源程序汇编成一个可重新定位的目标文件(.obj文件)。根据需要,可以生成一个列表文件(.lst文件),并对该列表进行控制。将程序代码分成若干个段,每个段的目标代码都有一个SPC(段程序计数器)管理。,2023/9/18,DSP原理及应用,64,第4章 汇编语言程序开发工具,4.4 源程序的汇编,汇编器包括如下功能:,定义和引用全局符号,如果需要可以在列表文件后面附加一张交叉引用表。对条件程序块进行汇编。支持宏功能,允许定义宏命令。为每个目标代码块设置一个程序计数器SPC。,2023/9/18,DSP原理及应用,65,第4章 汇编语言程序开发工具,4.4 源程序的汇编,汇编程序的运行,C54x的汇编程序名为asm500.exe。要运行汇编程序,可键入如下命令:,asm500 input file object file listing file-options,Asm500,:运行汇编程序asm 500.exe的命令。,input file,:汇编源文件名,默认扩展名为.asm。,object file,:汇编程序生成的C54x目标文件,扩展名为.obj。,若不提供目标文件名,则汇编程序就用输入文件 或目标文件名。,listing file,:汇编器产生的列表文件名,默认扩展名为.lst。,-options,:汇编器的选项,为汇编器的使用提供各种选择。,2023/9/18,DSP原理及应用,66,第4章 汇编语言程序开发工具,2023/9/18,DSP原理及应用,67,第4章 汇编语言程序开发工具,2023/9/18,DSP原理及应用,68,第4章 汇编语言程序开发工具,2023/9/18,DSP原理及应用,69,第4章 汇编语言程序开发工具,2023/9/18,DSP原理及应用,70,第4章 汇编语言程序开发工具,汇编时的列表文件,汇编器对源程序汇编时,如果采用-l选项,汇编后将生成一个列表文件。列表文件中包括源程序语句和目标代码。每个列表文件的顶部有两行汇编程序的标题、一行空行以及页号行。.title命令提供的文件名打印在页号行左侧;页号打印在此行的右侧。源文件的每一行都会在列表文件中生成一行。其内容包括行号、段程序计数器SPC的数值、汇编后的目标代码,以及源程序语句。一条指令可以生成1或2个字的目标代码。汇编器为第2字单独列一行,并列出了SPC的数值和目标代码。,2023/9/18,DSP原理及应用,71,第4章 汇编语言程序开发工具,汇编时的列表文件,可以看出,列表文件包括4个部分:源程序语句编号 段程序计数器 目标代码 源程序语句,2023/9/18,DSP原理及应用,72,第4章 汇编语言程序开发工具,1.源程序语句的行号,源程序语句的行号,用十进制数表示。汇编器在汇编时将源程序的行进行编号,有些语句(如.title)只列行号,不列语句。,汇编器还可能在一行的左边加一个字母,用来表示该行是从一个包含文件汇编的。,汇编器还可能在一行的左边加一个数字,表示嵌入的宏展开或循环程序块的等级。,2.段程序计数器,用十六进制数表示。所有的段都有SPC。有些伪指令对SPC不发生影响,此时这部分为空格。,2023/9/18,DSP原理及应用,73,第4章 汇编语言程序开发工具,3.目标代码,用十六进制数表示。所有指令经汇编都会产生目标代码。目标代码后面的一些记号表示在链接时需要重新定位。,!未定义的外部引用;,可重新定位的文本段;”可重新定位的数据段;+可重新定位的初始化命名段;-可重新定位的未初始化段;%复杂的重新定位的表达式。,4.源程序语句,这一部分包含被汇编器搜索到的源程序的所有字符。汇编器可以接受的每行字符数为200个。,2023/9/18,DSP原理及应用,74,第4章 汇编语言程序开发工具,汇编伪指令,汇编器伪指令是汇编语言程序的一个重要内容。用于为程序提供数据,并控制汇编程序如何汇编源程序。,将代码和数据汇编