1、3.1 TMS320C54x应用软件开发过程应用软件开发过程3.2 汇编语言程序的编辑、汇编和链接过程汇编语言程序的编辑、汇编和链接过程3.3 汇编伪指令汇编伪指令3.4 汇编宏指令汇编宏指令3.5 COFF的一般概念的一般概念3.6 C语言程序设计概述语言程序设计概述3.7 混合编程混合编程3.8 小结小结TMS320C54x应用软件开发过程应用软件开发过程将C语言源程序自动地编译为C54x 的汇编语言源程序。即生成.asm文件。将汇编语言源文件汇编成基于公用目标文件格式的机器语言目标文件。即生成.obj文件。将汇编生成的、可重新定位的COFF目标模块组合成一个可执行的COFF目标模块。将一
2、组文件(源文件或目标文件)集中为一个文档文件库。将包含助记符指令的汇编语言源文件转换成包含代数指令的汇编语言源文件。建立用户自己用的、C语言编写的支持运行的库函数。建立用户的C语言运行支持库。标准运行支持库在rts.src 里提供源代码,在rts.lib里提供目标代码。将COFF目标文件转换TI、Intel、Motorola或Tektronix公司的目标文件格式。生成abs输出文件。对abs文件汇编产生包含绝对地址(而不是相对地址)的清单。生成一个交叉引用清单,列出所链接的源文件中的符号及其定义和引用情况。开发目的:产生一个可由C54x目标系统执行的模块。调试工具:软件仿真器(Simulato
3、r)可扩展的开发系统硬件仿真器XDS510(Emulator)评价模块(EVM)DSK开发套件 需要开发人员编写的文件:源程序(.c或.asm)链接命令文件(.cmd)中断向量表TMS320C54x应用软件开发过程应用软件开发过程汇编语言程序的编辑、汇编和链接过程汇编语言程序的编辑、汇编和链接过程.asm源文件源文件.obj目标文件目标文件.out输出文件输出文件.cmd链接命链接命令文件令文件.lst列表文件列表文件.map存储器存储器映像文件映像文件-o-m-l汇编伪指令汇编伪指令8种伪指令:1)段定义伪指令;2)常数初始化伪指令;3)段程序计数器定位伪指令;4)输出列表格式伪指令;5)引
4、用其他文件的伪指令;6)条件汇编伪指令;7)汇编时符号定义伪指令;8)其他汇编伪指令。1)段定义伪指令.bss symbol,size in words,blocking flag,alignment flag 为未初始化变量在为未初始化变量在.bss段内保留空间,可在段内保留空间,可在RAM中分配变量。中分配变量。symbol.usect“段名段名”,字数字数 ,blocking flag,alignment flag 在一个未初始化的命名段中保留空间。在一个未初始化的命名段中保留空间。.data 包含初始化数据。使汇编器开始把源代码中的初始化包含初始化数据。使汇编器开始把源代码中的初始化数
5、据汇编到数据汇编到.data段内,且段内,且.data变为当前段。变为当前段。.sect“section name”:定义包含代码或数据的已初始化命名定义包含代码或数据的已初始化命名段,将紧随其后的代码或数据存入该段。段,将紧随其后的代码或数据存入该段。.text:包含可执行的代码。如果还没有代码被汇编到包含可执行的代码。如果还没有代码被汇编到.text段中,那么段中,那么段程序计数器被设置为段程序计数器被设置为0,否则段程序计数器恢复到它原先在,否则段程序计数器恢复到它原先在段内的值。段内的值。.text是默认段,除非规定了另外的伪指令,否则在是默认段,除非规定了另外的伪指令,否则在汇编开始
6、时,汇编器将把代码汇编到汇编开始时,汇编器将把代码汇编到.text段。段。汇编伪指令汇编伪指令2)常数初始化伪指令.bes size in bits .space size in bits 在当前段中保留在当前段中保留size个数的个数的位位,汇编器对这些保留的位填,汇编器对这些保留的位填0,可用位数乘以可用位数乘以16来实现保留字。来实现保留字。.byte value1,,valuen:在当前段内初始化一个或多个:在当前段内初始化一个或多个 连续的连续的8位字。位字。.field value,size in bits:将单个值放进当前字的指定:将单个值放进当前字的指定位域。此指令可将数值放入
7、当前字中规定的位数,并从最高位域。此指令可将数值放入当前字中规定的位数,并从最高有效位开始。在字被填满前,汇编器不增加段程序计数器有效位开始。在字被填满前,汇编器不增加段程序计数器(SPC)的值。)的值。汇编伪指令汇编伪指令.float value1,valuen:计算以:计算以IEEE格式表示的单格式表示的单 精度(精度(32位)浮点数,并将它存储在当前段的两个连位)浮点数,并将它存储在当前段的两个连 续的字中,先存最高有效位。续的字中,先存最高有效位。.int value1,valuen .word value1,valuen两指令等价,将一个或多个值放在当前段的连续的两指令等价,将一个或
8、多个值放在当前段的连续的16位域中。位域中。.long value1,valuen:将将32位的值存储在当前段的两个连续字中,先存最高有效位。位的值存储在当前段的两个连续字中,先存最高有效位。.string“string1”,“stringn”.pstring“string1”,“stringn”将一个或多个字符串中的将一个或多个字符串中的8位字符放进当前段。位字符放进当前段。汇编伪指令汇编伪指令3)段程序计数器定位伪指令 .alignsize根据根据size 的值将段程序计数器(的值将段程序计数器(SPC)对准在)对准在1128字的字的边界,这保证了在伪指令后面的代码开始在某个字或页面边界,
9、这保证了在伪指令后面的代码开始在某个字或页面的边界上。的边界上。(1)操作数为)操作数为1,对准,对准SPC到字的边界;到字的边界;(2)操作数为)操作数为2,对准,对准SPC到长字(偶数地址)的边界;到长字(偶数地址)的边界;(3)操作数为)操作数为128,对准,对准SPC到页面的边界;到页面的边界;(4)没有操作数时,默认为页面边界。)没有操作数时,默认为页面边界。汇编伪指令汇编伪指令4)输出列表格式伪指令 .drnolist 在列表文件中禁止打印下述伪指令,在列表文件中禁止打印下述伪指令,.drlist 允许下述伪指令在列表文件中出现。允许下述伪指令在列表文件中出现。.asg .fcno
10、list .ssnolist .break .mlist .var .emsg .wmsg .mmsg .eval .mnolist .fclist .sslist .fclist 允许列出条件为假的代码块,缺省方式。允许列出条件为假的代码块,缺省方式。.fcnolist 禁止列出条件为假的代码块。禁止列出条件为假的代码块。.length 页面长度页面长度 控制文件列表的页面长度。控制文件列表的页面长度。.nolist 在列表文件中不打印所选择的源语句。在列表文件中不打印所选择的源语句。.list 在列表文件中打印所选择的源语句。在列表文件中打印所选择的源语句。汇编伪指令汇编伪指令 .mnol
11、ist 禁止宏扩展和循环块在列表文件中出现禁止宏扩展和循环块在列表文件中出现 .mlist 允许宏扩展和循环块在列表文件中出现,这是允许宏扩展和循环块在列表文件中出现,这是 汇编的默认行为。汇编的默认行为。.page 在列表文件中产生新的一页。在列表文件中产生新的一页。.ssnolist 禁止替代符号扩展的列出。禁止替代符号扩展的列出。.sslist 允许替代符号扩展的列出。允许替代符号扩展的列出。.tab size 定义制表符的大小。定义制表符的大小。.title“string”提供了汇编器在每页顶部打印的标题。提供了汇编器在每页顶部打印的标题。.width page width 控制列表文
12、件页面的宽度。控制列表文件页面的宽度。汇编伪指令汇编伪指令5)引用其他文件和符号伪指令 .include“filename”告诉汇编器开始从其他文件读取告诉汇编器开始从其他文件读取 源代码语句,源语句源代码语句,源语句不不出现在列表文件中。其内容可以出现在列表文件中。其内容可以 是程序、数据、符号定义等。是程序、数据、符号定义等。.copy“filename”告诉汇编器开始从其他文件读取告诉汇编器开始从其他文件读取 源代码语句,源语句出现在列表文件中。其内容可以是源代码语句,源语句出现在列表文件中。其内容可以是 程序、数据、符号定义等。程序、数据、符号定义等。.def 符号名符号名1,符号名,
13、符号名n在当前文件中定义一个或在当前文件中定义一个或 多个符号,该符号可以被其他文件使用。多个符号,该符号可以被其他文件使用。.ref 符号名符号名1,符号名,符号名n在其他文件中定义一个或在其他文件中定义一个或 多个符号,该符号可以在本文件中使用。多个符号,该符号可以在本文件中使用。汇编伪指令汇编伪指令6)条件汇编伪指令 .if.elseif/else.endif 告诉汇编器按照表达式值的告诉汇编器按照表达式值的 条件汇编一段代码。条件汇编一段代码。.loop/.break/.endloop 告诉汇编器按照表达式的值告诉汇编器按照表达式的值 循环汇编一段代码。循环汇编一段代码。汇编伪指令汇编
14、伪指令 .global符号名符号名1,符号名,符号名n定义全局符号,在连接定义全局符号,在连接 时可为其他文件使用。其作用相当于时可为其他文件使用。其作用相当于.def、.ref效果之和。效果之和。.mlib 向汇编器提供一个包含了宏定义的文档库的名称。向汇编器提供一个包含了宏定义的文档库的名称。当汇编器见到一个在当前库中没有定义的宏,就在当汇编器见到一个在当前库中没有定义的宏,就在.mlib 确认的宏库中查找。确认的宏库中查找。7)汇编时符号定义伪指令 .asg “character string”substitution symbol 把字符串赋给替代符号。把字符串赋给替代符号。.equ/
15、.set把常数赋给符号,存放在符号表中,且不能够把常数赋给符号,存放在符号表中,且不能够 被清除。如被清除。如 IMR.set 0000H。.eval 计算一个表达式的值并把结果传送到一个与替代计算一个表达式的值并把结果传送到一个与替代 符号等同的字符串中。符号等同的字符串中。.label 定义一个特殊的符号,表示段内装载时的地址。定义一个特殊的符号,表示段内装载时的地址。.struct/.endstruct 建立一个类似建立一个类似C语言结构的定义。语言结构的定义。.tag 给类似于给类似于C的结构特性分配一个标号。的结构特性分配一个标号。汇编伪指令汇编伪指令8)其他汇编伪指令 .algeb
16、raic 告诉汇编器输入文件是代数指令源代码。告诉汇编器输入文件是代数指令源代码。.end 结束汇编。结束汇编。.mmregs 定义存储器映射寄存器的替代符号,这样就定义存储器映射寄存器的替代符号,这样就 可以用可以用AR0、PMST等助记符替换实际的存储器地址。等助记符替换实际的存储器地址。.version 确定所用指令系统的确定所用指令系统的DSP名。名。.emsg 把用户定义的错误信息发送到标准输出设备中,把用户定义的错误信息发送到标准输出设备中,并增加错误计数,阻止汇编器产生目标文件。并增加错误计数,阻止汇编器产生目标文件。.mmsg 把汇编信息发送到标准输出设备中,不设置计数。把汇编
17、信息发送到标准输出设备中,不设置计数。.wmsg 把警告信息发送到标准输出设备中,增加警告计数。把警告信息发送到标准输出设备中,增加警告计数。汇编伪指令汇编伪指令汇编伪指令汇编伪指令汇编宏指令汇编宏指令宏语言的主要功能包括:宏语言的主要功能包括:1)定义自己的宏和重新定义已存在的宏;)定义自己的宏和重新定义已存在的宏;2)简化较长的或较复杂的汇编代码;)简化较长的或较复杂的汇编代码;3)访问归档器创建的宏库;)访问归档器创建的宏库;4)处理一个宏中的字符串;)处理一个宏中的字符串;5)控制宏扩展列表。)控制宏扩展列表。使用一个宏分3个过程:定义宏、调用宏和扩展宏。1、宏定义宏定义 在源文件的开
18、始,或者在在源文件的开始,或者在.include/.copy文件中定义宏,文件中定义宏,格式为:格式为:宏名宏名.macro 形参形参1,形参,形参2,形参,形参3,助记符指令与宏指令助记符指令与宏指令.endm 在宏库中定义宏在宏库中定义宏 宏库是由文档管理器建立的,采用归档格式的文件集合。宏库是由文档管理器建立的,采用归档格式的文件集合。归档文件(宏库)的每一个成员可包含一个与成员名相归档文件(宏库)的每一个成员可包含一个与成员名相 对应的宏定义。可通过使用对应的宏定义。可通过使用.mlib伪指令来访宏库。伪指令来访宏库。汇编宏指令汇编宏指令汇编宏指令汇编宏指令2、宏调用宏调用 对宏定义的
19、调用称为宏调用,由一条宏指令实现:对宏定义的调用称为宏调用,由一条宏指令实现:宏定义名宏定义名 实参表实参表 实参表中的每一项为实际参数,相互之间用逗号隔开。实参表中的每一项为实际参数,相互之间用逗号隔开。3、宏扩展、宏扩展 当源程序被汇编时,汇编程序对每个宏调用作宏展开。当源程序被汇编时,汇编程序对每个宏调用作宏展开。宏展开就是用宏展开就是用宏定义体取代源程序中的宏指令宏定义体取代源程序中的宏指令,而且,而且用实用实 参取代宏定义中的形参参取代宏定义中的形参。取代时实参和形参应该一一对。取代时实参和形参应该一一对 应,即第一个实参取代第一个形参,第二个实参取代第二应,即第一个实参取代第一个形
20、参,第二个实参取代第二 个形参,依次类推。在默认的情况下,宏扩展将出现在列个形参,依次类推。在默认的情况下,宏扩展将出现在列 表文件中,可通过表文件中,可通过.mnolist伪指令来关闭宏扩展清单。伪指令来关闭宏扩展清单。汇编宏指令汇编宏指令例3-1:宏定义、宏调用和宏展开的一个例子。*add3*ADDRP=P1+P2+P3 ;说明宏功能说明宏功能 add3 .macro p1,p2,p3,ADDRP ;定义宏定义宏 LD p1,A ;将参数将参数1赋给赋给A ADD p2,A ;将参数将参数2与与A相加相加 ADD p3,A ;将参数将参数3与与A相加相加 STL A,ADDRP ;将累加器
21、将累加器A的低字存入参数的低字存入参数4 .endm ;结束宏结束宏 .global abc,def,ghi,adr ;定义全局符号定义全局符号 add3 abc,def,ghi,adr ;调用宏调用宏 LD abc,A ;宏展开宏展开 ADD def,A ADD ghi,A STL A,adr汇编宏指令汇编宏指令例3-2:编写计算y=a1*x1+a2*x2+a3*x3+a4*x4 的汇编源程序*example.asm y=a1*x1+a2*x2+a3*x3+a4*x4 *.title“example.asm”.mmregs Stack .usect “STACK”,10h .bss a,4
22、.bss x,4 .bss y,1 .def _c_int00 .datatable:.word 1,2,3,4 .word 8,6,4,2 .text汇编宏指令汇编宏指令_c_int00:STM#0,SWWSR STM#stack+10h,SP STM#a,AR1 RPT#7 MVPD table,*AR1+CALL SUMend:B endSUM:STM#a,AR3 STM#x,AR4 RPTZ A,#3 MAC *AR3+,*AR4+,A STL A,y RET .end公共目标文件格式的一般概念公共目标文件格式的一般概念 汇编器和链接器建立的目标文件,是一个可以在汇编器和链接器建立的目
23、标文件,是一个可以在TMS320C54x器件上执行的文件。这些目标文件的格式器件上执行的文件。这些目标文件的格式称之为称之为公共目标文件格式公共目标文件格式,即,即COFF(Common Object File Format)格式。)格式。1、段的定义 段:连续占有存储空间的一个数据或代码块。段:连续占有存储空间的一个数据或代码块。一个目标文件中的每一个段都是分开的和各不相同的。一个目标文件中的每一个段都是分开的和各不相同的。所有的所有的COFF格式目标文件都至少包含以下格式目标文件都至少包含以下3种种 形式的段:形式的段:.text 段段 此段通常包含可执行代码;此段通常包含可执行代码;.d
24、ata 段段 此段通常包含初始化数据;此段通常包含初始化数据;.bss 段段 此段通常为未初始化变量保留存储空间。此段通常为未初始化变量保留存储空间。公共目标文件格式的一般概念公共目标文件格式的一般概念公共目标文件格式的一般概念公共目标文件格式的一般概念2、段的分类1)已初始化段)已初始化段 已初始化段中包含有数据或程序代码。已初始化段中包含有数据或程序代码。.text段和段和.data段都是已初始化段;段都是已初始化段;用用.sect汇编命令建立的自定义段也是已初始化段。汇编命令建立的自定义段也是已初始化段。2)未初始化段)未初始化段 作用:是为未初始化数据保留存储空间。作用:是为未初始化数
25、据保留存储空间。.bss 段是未初始化段;段是未初始化段;用汇编命用汇编命.usect 建立的自定义段也是未初始化段。建立的自定义段也是未初始化段。公共目标文件格式的一般概念公共目标文件格式的一般概念目标文件目标文件目标存储器目标存储器.bss.data.textRAME2PROMROM公共目标文件格式的一般概念公共目标文件格式的一般概念 汇编器的任务:汇编器的任务:在汇编过程中,根据汇编命令用适当的段将各部分在汇编过程中,根据汇编命令用适当的段将各部分 程序代码和数据连在一起,构成目标文件。程序代码和数据连在一起,构成目标文件。汇编器靠汇编器靠5条命令识别汇编语言程序的各个部分:条命令识别汇
26、编语言程序的各个部分:.bss 末初始化段;末初始化段;.usect 未初始化自定义段;未初始化自定义段;.text 已初始化段;已初始化段;.data 已初始化段;已初始化段;.sect 已初始化自定义段。已初始化自定义段。公共目标文件格式的一般概念公共目标文件格式的一般概念1、未初始化段建立未初始化段的两条命令的句法如下:建立未初始化段的两条命令的句法如下:公共目标文件格式的一般概念公共目标文件格式的一般概念2、已初始化段建立己初始化段的建立己初始化段的3条初始化命令的句法如下:条初始化命令的句法如下:公共目标文件格式的一般概念公共目标文件格式的一般概念3、子段子段是大段中的小段。子段是大
27、段中的小段。子段命名的句法为:子段命名的句法为:例如,若要在例如,若要在.text段内建立一个称之为段内建立一个称之为_func的子段,的子段,可以用如下命令:可以用如下命令:子段也有子段也有2种:种:用用.sect命令建立的是已初始化段命令建立的是已初始化段;用用.usect命令建立的段是未初始化段命令建立的段是未初始化段;公共目标文件格式的一般概念公共目标文件格式的一般概念4、命名段 缺省段由缺省段由.text、.data和和.bss命令建立命令建立,伪指令本身就伪指令本身就 是段名是段名;自定义段是由自定义段是由.sect和和.usect命令建立命令建立,需要自己定义段名需要自己定义段名
28、;不要把两个伪指令当做段名;不要把两个伪指令当做段名;不能用不同的伪指令处理名字相同的段。不能用不同的伪指令处理名字相同的段。5、段程序计数器(SPC)SPC表示一个程序代码段或数据段内当前的地址。表示一个程序代码段或数据段内当前的地址。链接器在链接时要对每个段进行重新定位。链接器在链接时要对每个段进行重新定位。公共目标文件格式的一般概念公共目标文件格式的一般概念 .title“example.asm”*Assemble an initialized table into.data *.datacoeff .word 011h,022h,033h*Reserve space in.bss fo
29、r a variable *.bss buffer,10*still in .data *ptr .word 044h.data.data011h022h033h044hcoeffcoeffptrptr.bss.bssbufferbufferBuffer+1Buffer+1Buffer+9Buffer+9公共目标文件格式的一般概念公共目标文件格式的一般概念*Assemble code into the.text section*.textadd:LD#0,DP ;1 word LD#2,A ;1 word ADD 60H,A ;1 word*Another initialized table
30、into.data *.dataivals .word 0AAh,0BBh,0CCh*Define another section for more variables *var2 .usect “newvars”,1inbuf .usect “newvars”,7*Define a named section for int.vectors *.sect “vectors”.word 011h,033h.text.textLDLDADDaddadd.data.data011h022h033h044h0AAh0BBh0CChcoeffcoeffptrptrivalsivalsnewvarsne
31、wvarsvar2var2inbufinbufinbuf+6inbuf+6vectorsvectors011h033h公共目标文件格式的一般概念公共目标文件格式的一般概念汇编语言源程序经过汇编后,共建立了5个段:.text段段 文本段,段内有文本段,段内有3个字可执行的程序代码。个字可执行的程序代码。.data段段 已初始化的数据段,段内有已初始化的数据段,段内有7个字的数据。个字的数据。vectors段段用用.sect命令生成的命名段命令生成的命名段,段内有段内有2个字的个字的 初始化数据。初始化数据。.bss段段 未初始化的数据段,在存储器中为变量未初始化的数据段,在存储器中为变量 保留保
32、留10个存储单元。个存储单元。newvars段段用用.usect命令建立的命名段命令建立的命名段,为变量保留为变量保留 8个存储单元。个存储单元。.text.textLDLDADDaddadd.data.data011h022h033h044h0AAh0BBh0CChcoeffcoeffptrptrivalsivalsvectorsvectors011h033h.bss.bssbufferbufferBuffer+1Buffer+1Buffer+9Buffer+9newvarsnewvarsvar2var2inbufinbufinbuf+6inbuf+6公共目标文件格式的一般概念公共目标文件格
33、式的一般概念 主要功能:根据链接命令或链接命令文件主要功能:根据链接命令或链接命令文件(.cmd文件文件),将一个或多个将一个或多个COFF目标文件目标文件(.obj文件文件)链接起来,生成存储器映象文件链接起来,生成存储器映象文件(.map)和和 可执行的输出文件可执行的输出文件(.out)(COFF目标模块目标模块)。链接器链接器建立的是绝对地址建立的是绝对地址COFFCOFF文件,即文件,即.out.out文件文件注意注意公共目标文件格式的一般概念公共目标文件格式的一般概念 两个任务:两个任务:1)把一个或多个)把一个或多个COFF目标文件目标文件(.obj文件文件)中的各种段中的各种段
34、 作为链接器的输入段,经链接后在一个可执行的作为链接器的输入段,经链接后在一个可执行的 COFF输出模块中建立各个输出段。输出模块中建立各个输出段。2)在程序装入时对其重新定位,为各个输出段选定)在程序装入时对其重新定位,为各个输出段选定 存储器地址。存储器地址。命令支持:命令支持:1)MEMORY 命令。命令。此条命令用来定义目标系统的存储器配置空间,包括对此条命令用来定义目标系统的存储器配置空间,包括对 存储器各部分命名,以及规定它们的起始地址和长度;存储器各部分命名,以及规定它们的起始地址和长度;2)SECTIONS 命令。命令。此命令告诉链接器如何将输入段组合成输出段,以及此命令告诉链
35、接器如何将输入段组合成输出段,以及 将输出段在存储器中的什么位置。将输出段在存储器中的什么位置。公共目标文件格式的一般概念公共目标文件格式的一般概念1、默认的存储器分配、默认的存储器分配 在默认的方式下,链接器将从存储器的在默认的方式下,链接器将从存储器的0080h开始,开始,对组合后的各段进行存储器配置。对组合后的各段进行存储器配置。File1.obj.text1.data1.bss1table_1(初始化的命名段初始化的命名段)u_vars1(未初始化的命名段未初始化的命名段)File2.obj.text2.data2.bss2table_2(初始化的命名段初始化的命名段)u_vars2(
36、未初始化的命名段未初始化的命名段)FFT(初始化的命名段初始化的命名段)程序存储器程序存储器数据存储器数据存储器公共目标文件格式的一般概念公共目标文件格式的一般概念2、将段放入存储器空间、将段放入存储器空间 若不采用默认的方式,通常需要建立一个链接命令文件,若不采用默认的方式,通常需要建立一个链接命令文件,在命令文件中用在命令文件中用MEMORY和和SECTIONS伪指令定义存伪指令定义存储器和配置段地址。储器和配置段地址。公共目标文件格式的一般概念公共目标文件格式的一般概念(1)键盘命令:公共目标文件格式的一般概念公共目标文件格式的一般概念(2)键入命令:公共目标文件格式的一般概念公共目标文
37、件格式的一般概念(3)命令文件控制方式:公共目标文件格式的一般概念公共目标文件格式的一般概念1、链接器选项链接命令选项链接命令选项选选 项项含含 义义 -a 生成一个绝对地址的、可执行的输出模块。所建立的绝生成一个绝对地址的、可执行的输出模块。所建立的绝 对地址输出文件中不包含重新定位信息。如果既不用对地址输出文件中不包含重新定位信息。如果既不用-a 选项,也不用选项,也不用-r选项,链接器就像规定选项,链接器就像规定-a选项那样处理。选项那样处理。-ar 生成一个可重新定位、可执行的目标模块。这里采用了生成一个可重新定位、可执行的目标模块。这里采用了 -a和和-r两个选项两个选项(可以分开写
38、成可以分开写成-a-r,也可以连在一起,也可以连在一起 写作写作-ar),与,与-a选项相比,选项相比,-ar选项还在输出文件中保留选项还在输出文件中保留 有重新定位信息。有重新定位信息。-e global_symbol 定义一个全局符号,这个符号所对应的程序存储器地址,定义一个全局符号,这个符号所对应的程序存储器地址,就是使用开发工具调试这个链接后的可执行文件时程序就是使用开发工具调试这个链接后的可执行文件时程序 开始执行时的地址开始执行时的地址(称为入口地址称为入口地址)。当加载器将一个程。当加载器将一个程 序加载到目标存储器时,程序计数器序加载到目标存储器时,程序计数器(PC)被初始化到
39、入被初始化到入 口地址,然后从这个地址开始执行程序。口地址,然后从这个地址开始执行程序。公共目标文件格式的一般概念公共目标文件格式的一般概念链接命令选项链接命令选项选选 项项含含 义义-f fill_vale 对输出模块各段之间的空单元设置一个对输出模块各段之间的空单元设置一个1616位数值位数值 (fill_value),(fill_value),如果不用如果不用-f-f选项,则这些空单元都置选项,则这些空单元都置0 0。-i dir 更改搜索文档库算法,先到更改搜索文档库算法,先到dirdir(目录)中搜索。此选项(目录)中搜索。此选项 必须出现在必须出现在-l-l选项之前。选项之前。-l
40、 filename 命名一个文档库文件作为链接器的输入文件;命名一个文档库文件作为链接器的输入文件;filenamefilename 为文档库的某个文件名。此选项必须出现在为文档库的某个文件名。此选项必须出现在-i-i选项之后。选项之后。-m filename 生成一个生成一个.map映像文件,映像文件,filename是映像文件的文件名。是映像文件的文件名。.map文件中说明存储器配置、输入、输出段布局以及外文件中说明存储器配置、输入、输出段布局以及外 部符号重定位之后的地址等。部符号重定位之后的地址等。-o filename 对可执行输出模块命名。如果默认,则此文件名为对可执行输出模块命名
41、。如果默认,则此文件名为a.out。-r 生成一个可重新定位的输出模块。当利用生成一个可重新定位的输出模块。当利用-r选项且不用选项且不用 -a选项时,链接器生成一个不可执行的文件。选项时,链接器生成一个不可执行的文件。公共目标文件格式的一般概念公共目标文件格式的一般概念2、链接器命令文件格式a.obj b.obj /*输入文件名输入文件名*/-o prog.out /*链接器选项链接器选项*/-m prog.map /*链接器选项链接器选项*/MEMORY /*MEMORY 命令命令*/PAGE0:ROM:origin=1000h,length=0100h PAGE1:RAM:origin=
42、0100h,length=0100hSECTIONS /*SECTIONS 命令命令*/.text:ROM.data:ROM.bss:RAM输入输入输出输出定义定义描述描述系统系统硬件硬件资源资源描述描述段如段如何定何定位位公共目标文件格式的一般概念公共目标文件格式的一般概念链接命令文件可包含以下内容:链接命令文件可包含以下内容:(1)输入文件名,用来指定目标文件、存档库或输入文件名,用来指定目标文件、存档库或 其他命令文件。其他命令文件。(2)链接器选项,它们在命令文件中的使用方法链接器选项,它们在命令文件中的使用方法 与在命令行中相同。与在命令行中相同。(3)MEMORY和和SECTION
43、S链接伪指令,用来指定链接伪指令,用来指定 目标存储器结构和地址分配。目标存储器结构和地址分配。公共目标文件格式的一般概念公共目标文件格式的一般概念注意:注意:(1)注释的内容应当用)注释的内容应当用/*和和*/符号括起来。符号括起来。(2)如果程序中有)如果程序中有C语言,则在语言,则在cmd文件的输入输出部分文件的输入输出部分 应该加上:应该加上:-l rts.lib语句。语句。(3)如果程序中有)如果程序中有C语言,则在语言,则在cmd文件的输入输出部分文件的输入输出部分 应该加上:应该加上:-c。(4)在链接器命令文件中,不能采用下列符号作为段名或)在链接器命令文件中,不能采用下列符号
44、作为段名或 符号名符号名 align DSECT len o run ALIGN f length align DSECT len o run ALIGN f length org RUN attr fill LENGTH origin SECTIONS org RUN attr fill LENGTH origin SECTIONS ATTR FILL load ORIGIN spare block group LOAD ATTR FILL load ORIGIN spare block group LOAD page type BLOCK GROUP MEMORY PAGE TYPE pa
45、ge type BLOCK GROUP MEMORY PAGE TYPE COPY l(COPY l(小写小写L)NOLOAD range UNIONL)NOLOAD range UNION公共目标文件格式的一般概念公共目标文件格式的一般概念3、MEMORY命令 功能:功能:MEMORY命令用来定义目标系统中实际存在的并且可命令用来定义目标系统中实际存在的并且可在程序中使用的存储器区间,包括对存储器各部分命名,在程序中使用的存储器区间,包括对存储器各部分命名,以及规定它们的起始地址和长度。以及规定它们的起始地址和长度。注意:注意:“MEMORY”必须大写必须大写MEMORYMEMORY PAG
46、E 0:name 1 PAGE 0:name 1(attrattr):origin=constant,length=constant:origin=constant,length=constantPAGE n:name n PAGE n:name n(attrattr):origin=constant,length=constant:origin=constant,length=constant MEMORYMEMORY命令的一般句法命令的一般句法公共目标文件格式的一般概念公共目标文件格式的一般概念MEMORYMEMORY PAGE 0:name 1 PAGE 0:name 1(attratt
47、r):origin=constant,length=constant:origin=constant,length=constantPAGE n:name n PAGE n:name n(attrattr):origin=constant,length=constant:origin=constant,length=constant 对一个存储空间加以标记,每一个对一个存储空间加以标记,每一个PAGEPAGE代表一个代表一个完全独立的地址空间。页号完全独立的地址空间。页号n n最多可规定为最多可规定为255255,取决于目标存储器的配置。取决于目标存储器的配置。通常通常PAGE 0PAGE 0
48、定为程序定为程序存储器,存储器,PAGE 1PAGE 1定为数据存储器。定为数据存储器。如果没有规定如果没有规定PAGEPAGE,则链接器就把目标存储器配置在,则链接器就把目标存储器配置在PAGE 0PAGE 0。可以包含可以包含1 18 8个字符,个字符,A AZ Z,a az z,$,.,_ _均可。均可。名字并没有特殊的含义,用来标记存储器的区间而已;名字并没有特殊的含义,用来标记存储器的区间而已;不同不同PAGEPAGE上的存储器区间可以取相同的名字,但在同上的存储器区间可以取相同的名字,但在同一一PAGEPAGE内的名字不能相同,且不许重叠配置。内的名字不能相同,且不许重叠配置。任选
49、项,为命名区规定任选项,为命名区规定1 14 4个属性。如果有选项,应个属性。如果有选项,应写在括号内。属性选项一共有写在括号内。属性选项一共有4 4项项:R R 规定可以对存储器执行读操作。规定可以对存储器执行读操作。W W 规定可以对存储器执行写操作。规定可以对存储器执行写操作。X X 规定存储器可以装入可执行的程序代码。规定存储器可以装入可执行的程序代码。I I 规定可以对存储器进行初始化。规定可以对存储器进行初始化。没有规定属性的存储器都默认有没有规定属性的存储器都默认有全部全部4 4项项属性。属性。规定一个存储区的起始地址。键规定一个存储区的起始地址。键入入originorigin、
50、orgorg或或o o都可以。这个都可以。这个值是一个值是一个1616位二进制常数,可以位二进制常数,可以用十进制数、八进制数或十六进用十进制数、八进制数或十六进制数表示。制数表示。规定一个存储区的长度,键入规定一个存储区的长度,键入lengthlength、lenlen或或l l都都可以。这个值是一个可以。这个值是一个1616位二进制常数,可以用十位二进制常数,可以用十进制数、八进制数或十六进制数表示。进制数、八进制数或十六进制数表示。公共目标文件格式的一般概念公共目标文件格式的一般概念两个输入文件两个输入文件链接命令选项链接命令选项指令字指令字页面名称页面名称区间名称区间名称起始地址起始地