1、2018年4月23日,DSP原理及应用,1,第4章 汇编语言程序开发工具,内容提要 可编程DSP芯片开发需要一套完整的软、硬件开发工具。通常可分成代码生成工具和代码调试工具两大类。 代码生成工具是指将高级语言或汇编语言编写的DSP程序转换成可执行的DSP芯片目标代码的工具程序,主要包括汇编器、链接器和C编译器以及一些辅助工具程序等。 代码调试工具包括C/汇编语言源码调试器、仿真器等。 本章主要介绍代码生成工具,包括C54x软件开发流程、汇编语言程序的编写、编辑、汇编和链接过程、COFF段的一般概念、汇编器和链接器处理段的方法以及程序的重定位等。,2018年4月23日,DSP原理及应用,2,第4
2、章 汇编语言程序开发工具,4.1 TMS320C54x软件开发过程 4.2 汇编语言程序的编辑、汇编和链接过程 4.3 COFF的一般概念 4.4 源程序的汇编4.5 链接器的使用,2018年4月23日,DSP原理及应用,3,第4章 汇编语言程序开发工具,4.1 TMS320C54x软件开发过程,C54x的应用软件开发主要完成以下工作:(1) 选择编程语言编写源程序 C54x提供2种编程语言,即汇编语言和C/C+语言。 对于完成一般功能的代码,这两种语言都可使用,但对于一些运算量很大的关键代码,最好采用汇编语言来完成,以提高程序的运算效率。(2) 选择开发工具和环境 C54x提供了两种开发环境
3、。即非集成开发环境和集成开发环境CCS。,2018年4月23日,DSP原理及应用,4,第4章 汇编语言程序开发工具,4.1 TMS320C54x软件开发过程,1. C54x应用软件开发流程,C54x应用软件的开发可在TI公司提供的开发环境中进行,用户可以用C/C+语言或汇编语言编写源文件,经C编译器、汇编器生成COFF格式的目标文件,再用链接器进行链接,生成在C54x上可执行的目标代码,然后利用调试工具对可执行的目标代码进行仿真和调试。 当调试完成后,通过Hex代码转换工具,将调试后的可执行目标代码转换成EPROM编程器能接受的代码,并将该代码固化到EPROM中或加载到用户的应用系统中,以便D
4、SP目标系统脱离计算机单独运行。,2018年4月23日,DSP原理及应用,5,第4章 汇编语言程序开发工具,1. C54x应用软件开发流程,开发过程的目的是产生一个可以由C54x目标系统执行的模块。,2018年4月23日,DSP原理及应用,6,第4章 汇编语言程序开发工具,2. C54x的开发工具,(1)代码生成工具:, C编译器:用来将C/C+语言源程序自动编译为C54x的汇编语言源程序。 汇编器:用来将汇编语言源文件汇编成机器语言COFF目标文件。 链接器:将汇编生成的、可重新定位的COFF目标模块组合成一个可执行的COFF目标模块。 文档管理器:允许用户将一组文件(源文件或目标文件)集中
5、为一个文档文件库。,2018年4月23日,DSP原理及应用,7,第4章 汇编语言程序开发工具,2. C54x的开发工具,(2)代码调试工具:, C/汇编语言源码调试器:与软件仿真器、评价模块、软件开发系统、软件仿真器等配合使用。 软件仿真器:是一种模拟DSP芯片各种功能并在非实时条件下进行软件调试的调试工具,它不需目标硬件支持,只需在计算机上运行。 初学者工具DSK:是TI公司提供给初学者进行DSP编程练习的一套廉价的实时软件调试工具。,2018年4月23日,DSP原理及应用,8,第4章 汇编语言程序开发工具,2. C54x的开发工具,(2)代码调试工具:, 软件开发系统SWDS:是一块PC插
6、卡,可提供低成本的评价和实时软件开发,还可用来进行软件调试,程序可在DSP芯片上实时运行。 可扩展的开发系统仿真器(XDS510):可用来进行系统级的集成调试,是进行DSP芯片软硬件开发的最佳工具。 评价模块EVM板:是一种低成本的开发板,可进行DSP芯片评价、性能评估和有限的系统调试。,2018年4月23日,DSP原理及应用,9,第4章 汇编语言程序开发工具,4.2 汇编语言程序的编辑、汇编和链接过程,示意图,2018年4月23日,DSP原理及应用,10,第4章 汇编语言程序开发工具,4.3 COFF的一般概念,汇编器和链接器生成的目标文件,是一个可以由C54x器件执行的文件。这些目标文件的
7、格式称之为公共目标文件格式(COFF)。,在编写汇编语言程序时,COFF采用代码段和数据段的形式,以便于模块化的编程,使编程和管理变得更加方便。 这些代码段和数据段简称为段。汇编器和链接器提供一些伪指令来建立和管理各种各样的段。,2018年4月23日,DSP原理及应用,11,第4章 汇编语言程序开发工具,4.3.1 COFF文件的基本单元,1. 段(sections),是COFF文件中最重要的概念。每个目标文件都分成若干段。,段是存储器中占据相邻空间的代码或数据块。一个目标文件中的每个段都是分开的和各不相同的。,COFF目标文件都包含以下3种形式的段: .text 段(文本段),通常包含可执行
8、代码; .data 段(数据段),通常包含初始化数据; .bss 段(保留空间段),通常为未初始化变量保留存储空间。,2018年4月23日,DSP原理及应用,12,第4章 汇编语言程序开发工具,4.3.1 COFF文件的基本单元,2. 段的基本类型,COFF目标文件中的段有两种基本类型。, 初始化段 未初始化段,(1) 初始化段,初始化段中包含有数据或程序代码。主要有: .text段已初始化段; .data段已初始化段; .sect段已初始化段,由汇编器伪指令建立 的自定义段。,2018年4月23日,DSP原理及应用,13,第4章 汇编语言程序开发工具,4.3.1 COFF文件的基本单元,2.
9、 段的基本类型,COFF目标文件中的段有两种基本类型。,(2) 未初始化段,在存储空间中,为未初始化数据保留存储空间。它包括: .bss段未初始化段; .usect段未初始化段,由汇编命令建立的命 名段(自定义段)。,2018年4月23日,DSP原理及应用,14,第4章 汇编语言程序开发工具,4.3.1 COFF文件的基本单元,3. 段与目标存储器的对应关系,汇编器的任务:在汇编过程中,根据汇编命令用适当的段将各部分程序代码和数据连在一起,构成目标文件。 链接器的任务:就是分配存储单元,将目标文件中的段重新定位到目标系统的存储器中,这一过程称为定位或分配。,2018年4月23日,DSP原理及应
10、用,15,第4章 汇编语言程序开发工具,3. 段与目标存储器的对应关系,目标文件中的段与目标存储器之间的关系,.bss,.data,.text,RAM,E2PROM,ROM,2018年4月23日,DSP原理及应用,16,第4章 汇编语言程序开发工具,4.3.2 汇编器对段的处理,汇编器对段的处理是通过段伪指令来区别各个段的,并将段名相同的语句汇编在一起。 汇编器有5条伪指令可识别汇编语言程序的各个部分:, .bss .usect .text .data .sect,定义未初始化段定义未初始化段定义已初始化段定义已初始化段定义已初始化段,2018年4月23日,DSP原理及应用,17,第4章 汇编
11、语言程序开发工具,4.3.2 汇编器对段的处理,未初始化段就是在C54x存储器中保留空间,通常它们被定位在RAM区。在目标文件中,这些段中没有确切的内容。 由这些段定义的空间仅作为临时存储空间,在程序运行时,可以利用这些存储空间存放变量。 未初始化段分为默认的和命名的两种,分别由汇编器伪指令.bss和.usect产生。,1. 未初始化段,2018年4月23日,DSP原理及应用,18,第4章 汇编语言程序开发工具,(1) .bss伪指令,1. 未初始化段,用于在bss段中保留若干个空间。 格式: .bss 符号, 字数,符号对应于保留的存储空间第一个字的变量名称。 可以让其他段引用,也可以用.g
12、lobal命令定义为全 局符号。,字数表示在bss段或标有名字的段中保留若干个存储单元。,每调用一次.bss伪指令,汇编器在相应的段保留更多的空间。,2018年4月23日,DSP原理及应用,19,第4章 汇编语言程序开发工具,1. 未初始化段,(2) .usect伪指令,用于为指定的命名段保留若干个空间。 格式: 符号 .usect “段名”, 字数,段名程序员为未初始化的命名段定义的名字。,每调用一次.usect伪指令,汇编器在指定的命名段保留更多的空间。,2018年4月23日,DSP原理及应用,20,第4章 汇编语言程序开发工具,4.3.2 汇编器对段的处理,已初始化段中包含有可执行代码或
13、初始化数据。 这些段中的内容都在目标文件中,当加载程序时再放到C54x的存储器中。每个已初始化段都是可以重新定位的,并且可以引用其他段中所定义的符号。链接器在链接时会自动地处理段间的相互引用。 已初始化段由.text、.data和.sect三个伪指令建立。,2. 已初始化段,2018年4月23日,DSP原理及应用,21,第4章 汇编语言程序开发工具,已初始化命令的句法:,2. 已初始化段,.text 段起点 .data 段起点 .sect “段名”,段起点,段起点是任选项。 若选用,它为段程序计数器SPC定义一个起始值。 若默认,则SPC从0开始。,2018年4月23日,DSP原理及应用,22
14、,第4章 汇编语言程序开发工具,4.4.3 汇编伪指令,C54x汇编器共有64条汇编伪指令,根据它们的功能,可以将其分成8类:, 对各种段进行定义的命令 如.bss、.data、.sect、.text、.usect等。, 对常数(数据和存储器)进行初始化的命令 如.bes、.byte、.field、.float、.int、.log、.space、.string、.pstring、.xfloat、.xlong、.word等。,2018年4月23日,DSP原理及应用,23,第4章 汇编语言程序开发工具,4.4.3 汇编伪指令, 调整SPC的指令 如.align等。, 对输出列表文件格式化的命令 如
15、.drlist、.drnolist等。, 引用其他文件的命令 如copy、.def、.global、.include、.mlib、.ref等。,2018年4月23日,DSP原理及应用,24,第4章 汇编语言程序开发工具,4.4.3 汇编伪指令, 控制条件汇编的命令 如.break、.else、.elseif、.endif、.endloop、.if、.loop等。, 在汇编时定义符号的命令 如.asg、.endstruct、.equ、.eval、.label、.set、.sruct等。, 执行其他功能的命令 如.algebraic、.emsg、.end、.mmregs、.mmsg、.newblo
16、ck、.sblock、.version、.vmsg等。,2018年4月23日,DSP原理及应用,25,第4章 汇编语言程序开发工具,4.5 链接器的使用,链接器的主要任务是根据链接命令文件(.cmd),将一个或多个COFF目标文件链接起来,生成存储器映像文件(.map)和可执行的输出文件(.out)。,在链接过程中,链接器将各个目标文件合并,并完成以下工作:,将各个段配置到目标系统的存储器。 对各个符号和段进行重新定位,并给它们指 定一个最终的地址。 解决输入文件之间未定义的外部引用。,2018年4月23日,DSP原理及应用,26,第4章 汇编语言程序开发工具,4.5.1 链接器的运行,1.
17、运行链接程序,C54x链接器的运行命令: lnk500 -options filename 1 filename n,lnk500: 运行链接器命令。,-options: 链接命令选项。可以出现在命令行或链接命令文 件的任何位置。,filenames: 文件名。可以是目标文件、链接命令文件或文 件库。所有文件扩展名的默认值为.obj。,2018年4月23日,DSP原理及应用,27,第4章 汇编语言程序开发工具,1. 运行链接程序,C54x链接器的运行,有三种方法: (1) 键入命令: lnk500,链接器会提示如下信息:,Command files:Object files .obj: Out
18、put Files a.out: Options:,(要求键入一个或多个命令文件),(要求键入一个或多个需要链接的目标文件),(要求键入一个链接器所生成的输出文件名),(要求附加一个链接选项 ),2018年4月23日,DSP原理及应用,28,第4章 汇编语言程序开发工具,1. 运行链接程序,(2) 键入命令:,lnk500 file1.obj file2.obj -o link.out,在命令行中指定选项和文件名。 目标文件: file1.obj、file2.obj 命令选项: -o 输出文件: link.out 将两个目标文件进行链接,生成一个可执行的输出文件link.out。,2018年4
19、月23日,DSP原理及应用,29,第4章 汇编语言程序开发工具,1. 运行链接程序,(3) 键入命令:,lnk500 linker.cmd,linker.cmd: 链接命令文件。,在执行上述命令之前,需将链接的目标文件、链接命令选项以及存储器配置要求等编写到链接命令文件linker.cmd中。,例如:希望完成第二种命令的链接,在链接命令文件中,应包含如下内容: file1.obj file2.obj -o link.out,2018年4月23日,DSP原理及应用,30,第4章 汇编语言程序开发工具,4.5.1 链接器的运行,2. 链接命令选项,在链接时,连接器通过链接命令选项控制链接操作。 链
20、接命令选项可以放在命令行或命令文件中,所有选项前面必须加一短划线“-”。除-l和-i选项外,其他选项的先后顺序并不重要。 选项之间可以用空格分开。最常用选项为-m和-o,分别表示输出的地址分配表映像文件名和输出可执行文件名。,2018年4月23日,DSP原理及应用,31,第4章 汇编语言程序开发工具,2. 链接命令选项,2018年4月23日,DSP原理及应用,32,第4章 汇编语言程序开发工具,2. 链接命令选项,2018年4月23日,DSP原理及应用,33,第4章 汇编语言程序开发工具,4.5.2 链接器命令文件的编写与使用,链接命令文件用来为链接器提供链接信息,可将链接操作所需的信息放在一
21、个文件中,这在多次使用同样的链接信息时,可以方便地调用。 在链接命令文件中,可使用MEMORY和SECTIONS伪指令,为实际应用指定存储器结构和地址的映射。 MEMORY用来指定目标存储器结构。 SECTIONS用来控制段的构成与地址分配。,2018年4月23日,DSP原理及应用,34,第4章 汇编语言程序开发工具,4.5.2 链接器命令文件的编写与使用,链接命令文件为ASC文件,可包含以下内容: (1) 输入文件名,用来指定目标文件、存档库或其他命令文件。 (2) 链接器选项,它们在命令文件中的使用方法与在命令行中相同。 (3) MEMORY和SECTIONS链接伪指令,用来指定目标存储器
22、结构和地址分配。 (4) 赋值说明,用于给全局符号定义和赋值。,2018年4月23日,DSP原理及应用,35,第4章 汇编语言程序开发工具,例如:可根据给出链接命令,编写完成该命令操作的链接器命令文件link.cmd。,lnk500 a.obj b.obj -m prog.map -o prog.out,该命令是将两个目标文件a.obj和b.obj进行链接,生成一个映像文件prog.map和一个可执行的输出文件prog.out。,链接命令文件的内容如下: a.obj /*第一个输入文件名*/ b.obj /*第二个输入文件名*/ -m prog.map /*指定map文件的选项*/ -o pr
23、og.out /*指定输出文件的选项*/,2018年4月23日,DSP原理及应用,36,第4章 汇编语言程序开发工具,【例4.5.1】 链接器命令文件举例。,a.obj b.obj /* 输入文件名 */ -o prog.out /*指定输出文件的选项*/ -m prog.map /*指定map文件的选项*/ MEMORY /*MEMORY 伪指令*/ PAGE 0: ROM:origin=1000h, length=0100h PAGE 1: RAM:origin=0100h, length=0100h SECTIONS /*SECTIONS伪指令*/ .text : ROM .data :
24、 ROM .bss : RAM ,2018年4月23日,DSP原理及应用,37,第4章 汇编语言程序开发工具,注意:在命令文件中,不能采用下列符号作为段名或符号名:,align DSECT len o run ALIGN f length org RUN attr fill LENGTH origin SECTIONS ATTR FILL load ORIGIN spare block group LOAD page type BLOCK GROUP MEMORY PAGE TYPE COPY l(小写L) NOLOAD range UNION,2018年4月23日,DSP原理及应用,38,第
25、4章 汇编语言程序开发工具,4.5.3 目标库,目标库是用完全的目标文件作为成员的存档文件。通常是将一组有关的模块组合在一起而形成的库。,当指定目标库作为链接器的输入时,链接器将在库中搜索没有分辨的外部引用,并包括库中已定义有这些引用的任何成员。 使用目标库可减少链接的时间和可执行模块的长度。可利用存档器建立主要的库。,2018年4月23日,DSP原理及应用,39,第4章 汇编语言程序开发工具,4.5.3 目标库,假设: 输入文件f1.obj和f2.obj均引用了名为clrscr的外部函数; 输入文件f1.obj引用了符号origin; 输入文件f2.obj引用了符号fillclr; 库lib
26、c.libc的成员Member 0包含了origin的定义; 库libc.liba的成员Member 3包含了fillclr的定义; 两个库的成员Member 1都定义了clrscr。,2018年4月23日,DSP原理及应用,40,第4章 汇编语言程序开发工具,4.5.3 目标库,若输入命令: lnk500 f1.obj liba.lib f2.obj libc.lib 则各引用的分辨如下: 库libc.liba的成员Member 1满足对clrscr的引用 库libc.libc的成员Member 0满足对origin的引用 库libc.liba的成员Member 3满足对fillclr的引用
27、,2018年4月23日,DSP原理及应用,41,第4章 汇编语言程序开发工具,4.5.3 目标库,若输入命令: lnk500 f1.obj f2.obj libc.lib liba.lib 则所有对clrscr的引用,都由库libc.libc的成员Member 1满足。,2018年4月23日,DSP原理及应用,42,第4章 汇编语言程序开发工具,4.5.3 目标库,当链接文件没有引用定义在库中的符号时,可使用-u选择项,强迫链接器包括库的成员。此时,输入命令: lnk500 -u rout1 libc.lib 则在链接器全局符号表中,产生一个没有定义的符号rout1。 若库libc.lib的任
28、何成员定义了rout1,则链接器将包括这些成员。,2018年4月23日,DSP原理及应用,43,第4章 汇编语言程序开发工具,4.5.4 MEMORY指令,MEMORY指令用来规定目标存储器的结构。 在实际的应用中,目标系统所配置的存储器是各不相同的,通过MEMORY指令,可以进行各种各样的存储器配置。,MEMORY指令的句法:,MEMORY PAGE0:name 1(attr):origin=constant, length=constant; PAGEn:name n(attr):origin=constant, length=constant;,指令字,存储区间说明语句,书写方式: 已大
29、写MEMORY指令字开始; 由大括号括起来的存储器区间说明。,存储区间:,存储页面,区间名称,区间属性,起始地址,区间长度,2018年4月23日,DSP原理及应用,44,第4章 汇编语言程序开发工具,4.5.4 MEMORY指令,存储区间说明语句:,PAGE: 指定存储器空间页面,最多为255页, 取决于目标存储器的配置。 每一个PAGE代表一个完全独立的地址空间。 通常,PAGE 0用于程序存储器; PAGE 1用于数据存储器。 若没有规定PAGE,则链接器默认为PAGE 0。,2018年4月23日,DSP原理及应用,45,第4章 汇编语言程序开发工具,4.5.4 MEMORY指令,存储区间
30、说明语句:,name: 存储器区间名称。可由用字母、$、.、_ 等组成。 存储器区间为内部记号,因此不需要保留在输出文件或者符号表中。 不同PAGE上的存储器区间可以取相同的名字,但在同一PAGE内的名字不能相同,且不许重叠配置。,2018年4月23日,DSP原理及应用,46,第4章 汇编语言程序开发工具,4.5.4 MEMORY指令,存储区间说明语句:,attr: 为任选项,用来为命名的存储器区间规 定14个属性。 当对输出段定位时,可利用属性限制输出段分配到一定的存储区间。 属性选项共有4项: R 规定可以对存储器执行读操作。 W 规定可以对存储器执行写操作。 X 规定存储器可以装入可执行
31、的程序代码。 I 规定可以对存储器进行初始化。,若未选属性,可将输出段不受限制地定位到任何一个存储器的位置。 任何一个没有规定属性的存储器(包括所有默认方式的存储器)都有全部4项属性。,2018年4月23日,DSP原理及应用,47,第4章 汇编语言程序开发工具,4.5.4 MEMORY指令,存储区间说明语句:,origin: 用来指定存储区间的起始地址,可简 写为org或o。其值以字为单位,可以 用十进制、八进制或十六进制数表示。,Length: 用来指定存储器空间的长度,可简写 为len或l,其值以字为单位,可以用 十进制、八进制或十六进制数表示。,2018年4月23日,DSP原理及应用,4
32、8,第4章 汇编语言程序开发工具,4.5.4 MEMORY指令,存储区间说明语句:,fill: 为任选项。用来为没有定位输出段的存储 器空单元充填一个数,键入fill或f均可。 该值是2个字节的整型常数,可以是十进制 数、八进制数或十六制数。,2018年4月23日,DSP原理及应用,49,第4章 汇编语言程序开发工具,【例4.5.2】用MEMORY伪指令编写连接命令文件。要求: 程序存储器:4K字ROM,起始地址为C00h,取名为ROM。 数据存储器:32字RAM,起始地址为60h,取名为SCR。 512字RAM,起始地址为80h,取名为CHIP。,file1.obj fiel2.obj -o
33、 Prog.out MEMORY PAGE 0: ROM: origin=C00h, length=1000h PAGE 1: SCR: origin=60h, length=20h CHIP: origin=80h, length=200h,两个输入文件,链接命令选项,指令字,页面名称,区间名称,起始地址,区间长度,2018年4月23日,DSP原理及应用,50,第4章 汇编语言程序开发工具,【例4.5.2】用MEMORY伪指令编写连接命令文件。,file1.obj fiel2.obj -o Prog.out MEMORYPAGE 0: ROM: org=C00h, len=1000hPAGE
34、 1: SCR: org=60h, len=20h CHIP:org=80h, len=200h,PAGE 0: ROM: org=C00h, len=1000h,00C00h,1000h,01C00h,ROM,PAGE 1: SCR: org=60h, len=20h,00060h,0007Fh,20h,SCR,CHIP:org=80h, len=200h,00080h,200h,0027Fh,CHIP,2018年4月23日,DSP原理及应用,51,第4章 汇编语言程序开发工具,4.5.5 SECTIONS指令,用来控制段的构成与地址分配。,指令功能: 说明如何将输入段组合成输出段; 在可执
35、行程序中定义输出段; 规定输出段在存储器中的存放位置; 允许重新命名输出段。,1. SECTIONS指令语法,2018年4月23日,DSP原理及应用,52,第4章 汇编语言程序开发工具,SECTIONS指令的句法:,SECTIONS name:property, property, property, name:property, property, property, name:property, property, property, ,指令字,输出段说明语句,段名:定义输出段的名称。,属性:定义该段的内容和存储器的分配。,段名,1. SECTIONS指令语法,属性,属性,属性,2018年
36、4月23日,DSP原理及应用,53,第4章 汇编语言程序开发工具,1. SECTIONS指令语法,段属性用来定义输出段的内容和存储地址的分配。包括的内容如下:, 装入存储器分配 运行存储器分配 输入段 段的类型 充填值,2018年4月23日,DSP原理及应用,54,第4章 汇编语言程序开发工具,1. SECTIONS指令语法, 装入存储器分配 用于定义段装入时的存储器地址。,语法格式: load=allocation 或 allocation 或 allocation,allocation: 关于段地址的说明,即给段分配存储 单元。,2018年4月23日,DSP原理及应用,55,第4章 汇编语
37、言程序开发工具,1. SECTIONS指令语法, 装入存储器分配,例如: .text: load=0x1000 .text: loadROM .bss: load(RW) .text: align=0x80 .text: PAGE 0 .bss: load=block(0x80),将.text段定位到一个特定的地址。 将.text段定位到命名为ROM的存储区。 将.bss段定位到属性为R、W的存储区。 将.text段定位到从地址0x80开始。 将.text段定位到PAGE 0。 将.bss段定位到一个n字存储器块 的任何一个位置(n为2的幂次)。,2018年4月23日,DSP原理及应用,56,
38、第4章 汇编语言程序开发工具,1. SECTIONS指令语法, 装入存储器分配,若用到一个以上参数,可以将它们排成一行。 例如: .text: ROM (align(16)PAGE (2 ) 。,2018年4月23日,DSP原理及应用,57,第4章 汇编语言程序开发工具,1. SECTIONS指令语法, 运行存储器分配 用于定义段运行时的存储器地址。,语法格式: run=allocation 或 run allocation,2018年4月23日,DSP原理及应用,58,第4章 汇编语言程序开发工具,1. SECTIONS指令语法,链接器为段在目标存储器中分配两个地址: 加载的地址由装入存储器
39、分配完成 执行程序的地址由运行存储器分配完成 通常,这两个地址是相同的。,若要想把程序的加载区分开,先将程序加载到ROM,然后在RAM中运行,则用SECTIONS命令让链接器对这个段定位两次即可。 例如: .fir: load=ROM,run=RAM,2018年4月23日,DSP原理及应用,59,第4章 汇编语言程序开发工具,1. SECTIONS指令语法, 输入段 用于定义组成输出段的输入段。,语法格式: input_sections,大多数情况下,在SECTIONS命令中是不列出每个输入文件的输入段的段名。,例如: SECTIONS .text: .data: .bss ,链接时:在输入文
40、件中的所有.text段链接成.text输出段所有.data段链接成.data输出段所有.bss段链接成.bss输出段,2018年4月23日,DSP原理及应用,60,第4章 汇编语言程序开发工具,1. SECTIONS指令语法,用文件名和段名来规定输入段。,SECTIONS .text: /*创建 .text 输出段*/ f1.obj(.text) /*链接来自f1.obj文件中的.text 段*/ f2.obj(sec1) /*链接来自f2.obj文件中的sec1 段*/ f3.obj /*链接来自f3.obj文件中的所有段*/ f4.obj(.text,sec2) /*链接f4.obj文件中
41、的.text 段和sec2段*/ ,2018年4月23日,DSP原理及应用,61,第4章 汇编语言程序开发工具,1. SECTIONS指令语法, 段的类型 用于为输出段定义特殊形式的标记 。,语法格式: type=COPY 或 type=DSECT 或 type=NOLOAD, 充填值 用于对未初始化空单元定义一个数值。,语法格式: fill=value 或 name:=value,2018年4月23日,DSP原理及应用,62,第4章 汇编语言程序开发工具,4.5.5 SECTIONS指令,2. SECTIONS指令的使用,【例4.5.3】SECTIONS指令的使用。 file1.obj fi
42、le2.obj -o Prog.out SECTIONS .text: load=ROM,run=800h .con: load=ROM .bss: load=RAM .vec: load=FF80h t1.obj(.int1) t2.obj(.int2) endvec=.; .data: align=16 ,两个输入文件,链接命令选项,指令字,输出段说明语句,2018年4月23日,DSP原理及应用,63,第4章 汇编语言程序开发工具,2. SECTIONS指令的使用,【例4.5.3】SECTIONS指令的使用。 file1.obj file2.obj -o Prog.out SECTIONS .text: load=ROM,run=800h .con: load=ROM .bss: load=RAM .vec: load=FF80h t1.obj(.int1) t2.obj(.int2) endvec=.; .data: align=16 ,输出段,加载地址,