1、应用电子技术,DSP技术及应用,1,TMS320C54x的软件开发,1 TMS320C54x软件开发过程 2 汇编语言程序的编写方法 3 汇编伪指令和宏指令 4 公共目标文件格式COFF 5 汇编源程序的编辑、汇编和链接过程 6 汇编语言程序设计,应用电子技术,DSP技术及应用,2,4.1 TMS320C54x软件开发过程 C编译器(C compiler) 汇编源程序 汇编器(assembler) COFF目标文件源文件中包括汇编语言指令、汇编伪指令以及宏指令。 链接器(linker) 可执行的COFF目标模块调整对符号的引用,并解决外部引用的问题。它也可以接收来自文档管理器中的目标文件,以及
2、链接以前运行时所生成的输出模块。 调试工具 C54x通过软件仿真程序或硬件在线仿真器的调试,最后将程序加载到用户的应用系统。,应用电子技术,DSP技术及应用,3,应用电子技术,DSP技术及应用,4,图中非阴影部分为任选: 归档器(archiver) 将一组文件(源文件或目标文件)集中为一个文档文件库。 助记符指令到代数式指令翻译器(mnemonic to algebraic translator utility) 建库工具(library-build utility) 用来建立用户自己用C语言编写的支持运行库函数。 十六进制转换工具(hex conversion utility) 绝对地址列表
3、器(absolute lister) 交叉引用列表器(cross-reference lister),应用电子技术,DSP技术及应用,5,4.2 汇编语言程序的编写方法,4.2.1 汇编语言源程序举例 包含标号区、指令区、操作数区和注释区4部分(参看3.1 ) 指令区可以写助记符指令、汇编伪指令或宏指令。助记符指令一般用大写;汇编伪指令和宏指令,以“.”号开始,且为小写。 【例4.1】 汇编语言程序编写方法举例,应用电子技术,DSP技术及应用,6,.title “example.asm” ;用双引号括起的源程序名 .mmregs ;定义存储器映射寄存器的替代符号 STACK.usect “ST
4、ACK”, 10H ;在数据存储器中留出16个单元作为 ; 堆栈区,名为STACK.bss a, 4 .bss x, 4 ;在数据存储器中空出4个存储单元存放 ;变量x1,x2,x3和x4. .bss y, 1.globalstart ;在此模块中定义,可为别的模块引用 .data ;紧跟其后的是已初始化数据 table: .word 1, 2, 3, 4 ;在程序存储器标号为table开始的8个单 .word 8, 6, 4, 2 ;元存放初始化数据,应用电子技术,DSP技术及应用,7,.text ;紧跟其后的是汇编语言程序正文 start: STM #0, SWWSR ;adds no w
5、ait statesSTM #STACK+10H,SP ;set stack pointerSTM #a, AR1 ;AR1 point to aRPT #7 ;move 8 valuesMVPD table, *AR1+ ;from program memory into ; data memoryCALL SUM ;call SUM subroutine end: B end ;原地等待,应用电子技术,DSP技术及应用,8,SUM: STM #a, AR3 ;ar3指向a的首地址STM #x, AR4 ;ar4指向x的自地址RPTZ A, #3 ;累加器a清零后重复执行下条指令4次MAC
6、*AR3+, *AR4+, A ;乘累加后结果送入累加大aSTL A, y ;将累加器后16位结果送入yRET ;子程序返回.end ;结束汇编,汇编器将忽略 ;此后的任何源 语句,应用电子技术,DSP技术及应用,9,4.2.2 汇编语言常量C54x汇编器支持7种类型的常量: 二进制整数:最多由16个二进制数字组成,其后缀为B(或b) . 八进制整数:最多由6个八进制数字组成,其后缀为Q(或q)。 十进制整数:由十进制数字串组成范围从3276832767或065535 十六进制整数: 最多由4个十六进制数字组成,包括09和字符AF及af;必须由十进制值09开始;其后缀为H(或h),也可以由前缀
7、(0x)标明。如: 78h、0Fh、 37Ach、0x37AC,应用电子技术,DSP技术及应用,10,5.浮点数常量:由整数、小数点、小数部分和指数部分组成 +(-)nnn.nnnE(e)+(-)nnn整数 小数 指数有效的浮点数常量: 3.0、3.14、-0.314e13、+314.59e-2 6.字符常量:由单引号括住的一个或两个字符组成。它在机器内部由8位ASCII码来表示一个字符。 有效的字符常量:a(内部表示为61h), 为D(内部表示为2744h) 7.汇编时常量:用.set伪指令给一个符号赋值。例如: shift .set 3 ; 将常数值3赋给符号shiftLD #shift,
8、 A ; 再将3赋给A累加器汇编器在内部把常量作为32位量。常量不能进行符号扩展。,应用电子技术,DSP技术及应用,11,4.2.3 汇编源程序中的字符串字符串(character strings)是包括在双引号内的一串字符。字符串的最大长度是变化的,由要求字符串的伪指令所规定。每个字符在内部用8位ASCII码表示。以下是字符串的例子: “sample program”定义了一个长度为14的字符串:sample progran; “PLAN“C”定义了一个长度为7的字符串:PLAN“C”。,应用电子技术,DSP技术及应用,12,4.2.4 汇编源程序中的符号 符号可用于标号、常量和替代其他字符
9、。符号名最多可为32位字符数字串(AZ、az、09、_和$),第一位不能是数字,字符间不能有空格;符号对大小写敏感,如汇编器将ABC、Abc、abc认作不同的符号,用-c选项可以使汇编器不区分大小写;符号只有在汇编程序中定义后才有效,除非使用.global伪指令声明才是一个外部符号。DSP内部的寄存器名和$等都是汇编器已预先定义的全局符号。,应用电子技术,DSP技术及应用,13,4.2.5 汇编源程序中的表达式表达式是由运算符隔开的常量、符号或常量和符号序列。 表达式值的有效范围从3276832767。 表达式运算符及优先级:2. 表达式溢出当算术运算在汇编中被执行时,汇编器将检查溢出状态。
10、但在作乘法时,不检查溢出状态。 3. 表达式的合法性由于符号的属性不同(定义不同)使表达式存在合法性问题。符号的属性分为3种:外部的、可重定位的和绝对的。 含有乘、除法的表达式中只能使用绝对符号。,应用电子技术,DSP技术及应用,14,4.3 汇编伪指令和宏指令 4.3.1 汇编伪指令(又称为汇编命令) 作用:给程序提供数据并且控制汇编过程。 表示:指令区以“.”号开始且为小写的为汇编伪指令。 指令数目:C54x汇编器共有64条汇编伪指令。 汇编伪指令用以形成常数和变量,当用它控制汇编和链接过程时,可以不占存储空间。 伪指令只对程序的编译过程(汇编指令机器二进制指令)起作用,它能告诉编译器怎样
11、正确的编译程序的某些部分,但编译出来的目标程序里不再有伪指令的任何痕迹。伪指令只是相当于一些用户自定义的编译规则,其本身不产生目标代码。所以不占用存储空间。,应用电子技术,DSP技术及应用,15,汇编伪指令分成8类(根据功能): 对各种段进行定义的伪指令; 对常数(数据和存储器)进行初始化的伪指令; 调整SPC(段寄存器)的指令; 输出列表文件格式伪指令; 引用其他文件的伪指令; 控制条件汇编的伪指令; 在汇编时定义符号的伪指令; 执行其他功能的伪指令。,应用电子技术,DSP技术及应用,16,1. 段定义伪指令(5条)作用:把汇编语言程序的各个部分划分在适当的段中。.bss 为未初始化的变量保
12、留空间;.data 通常包含了初始化的数据;.sect 定义已初始化的带命名段,其后的数据存入该段;.text 该段包含了可执行的代码;.usect 在一个未初始化的有命名的段中为变量保留空间。段是通过叠加方式来建立的。例如在汇编器第一次遇到.data伪指令时,data指令后面的语句都被汇编在.data段中(直到汇编器遇到.text和.sect伪指令为止)。如果后来又在其他的段中遇到.data指令,其后的语句继续加到.data段中。这样虽然程序中是多个.data段分散在各处,但汇编器只创建一个.data段,它可以连续地被分配到内存中。,应用电子技术,DSP技术及应用,17,2. 常数初始化伪指
13、令(共有24条).int和.word 把一个或多个16位数存放到当前段的连续字 中。.int为无符号整型量,.word为带符号整型量。.byte 把一个或多个8位的值放入当前段的连续字中。该指令类似于.word,不同之处在于.word中的每个值的宽度限制为16位。.float和.xfloat 计算以IEEE格式表示的单精度(32位)浮点数,并存放在当前段的连续字中,高位先存。.float能自动按域的边界排列,.xfloat不能。.long和.xlong 把32位数存放到当前段连续的两个字中,高位字先存。.long能自动按长字的边界排列,.xlong 却不能。.string和.pstring 把
14、8位的字符从一个或多个字符串中传送到当前段中。,应用电子技术,DSP技术及应用,18,【例4.2】1 0000 00aa .byte 0AAh, 0BBh0001 00bb2 0002 0ccc .word 0CCCh3 0003 0eee .xlong 0EEEEFFFh0004 efff4 0006 eeee .long 0EEEEFFFFh0007 ffff 5 0008 dddd .int 0DDDDh6 0009 3fff .xfloat 1.999991 000a ffac 7 000c 3fff .float 1.999991 000d ffac8 000e 0068 .stri
15、ng “help”1 000f 00651 0010 006c1 0011 0070,应用电子技术,DSP技术及应用,19,3. 段程序计数器(SPC)定位指令.align 使SPC对准1字(16位)128字的边界,这保证了紧接着该指令的代码从一个整字或页的边界开始。如果SPC已经定位于选定的边界,它就不会增加了。.align伪指令的操作数必须等于20216之间的一个2的幂值(尽管超过27的值没有意义)。不同的操作数代表了不同的边界定位要求。操作数为1是让SPC对准字边界;操作数为2是让SPC对准长字(偶地址)边界;操作数为128是让SPC对准页边界;不带操作数时,其默认值为128,即对准页边
16、界。,应用电子技术,DSP技术及应用,20,4. 输出列表格式伪指令.title 为汇编器提供一个打印在每一页顶部的标题。.list/.nolist 打开/关闭列表文件。使用.nolist可禁止汇编器列出列表文件中选定的源语句,使用.list则允许列表。 .mlist/.mnolist 源代码中包含着宏扩展和循环块的列表。这两条指令用来打开/关闭列表。使用.mlist把所有的宏扩展和循环块打印到列表中,用.mnolist则禁止列入列表。.sslist/.ssnolist 分别允许/禁止替换符号扩展到列表,在调试替换符号的扩展时很有用。.page 在输出列表中产生新的一页。.option 控制列
17、表文件中的某些特性。,应用电子技术,DSP技术及应用,21,5. 引用其他文件的伪指令.def 确认一个在当前模块中定义的且能被其他模块使用的符号,汇编器把这个符号存入符号表中。.ref 确认一个在当前模块中使用但在其他段中定义的符号。汇编器把这个符号标注成一个未定义的外部符号,且把它装入目标符号表中,以便链接器能还原它的定义。.global 表明一个外部符号,使其他模块在连接时可以使用。如果在当前段定义了该符号,那么该符号就可以被其他模块使用,与.def功能相同;如果在当前段没有定义该符号,则使用了其他模块定义的符号,与.ref功能相同。一个未定义的全局符号只有当它在程序中使用的时候,链接器
18、才对其进行处理。,应用电子技术,DSP技术及应用,22,.copy/.include 伪指令告诉汇编器开始从其他文件中读源语句。当汇编读完以后,继续从当前文件中读源语句。从.copy文件中读的语句会打印在列表中,而从.include文件中读的语句不会打印在列表中。.mlib 向汇编器提供一个包含了宏定义的文档库的名称。当汇编器见到一个在当前库中没有定义的宏,就在.mlib确认的宏库中查找。,应用电子技术,DSP技术及应用,23,6. 控制条件汇编的伪指令.if/.elseif/.else/.endif 这些指令告诉汇编器,根据表达式的值条件汇编一块代码。.if 表示一个条件块的开始,如果条件为
19、真就汇编紧接着的代码;.elseif是表示如果.if的条件为假,而.elseif的条件为真,就汇编紧接着的代码;.endif结束该条件块。.loop/.break/.endloop 告诉汇编器按照表达式的值循环汇编一块代码。.loop标注一块循环代码的开始;.break告诉汇编器当表达式为假时,继续循环汇编,当表达式为真时,立刻转到.endloop后的代码去执行;.endloop标注一个可循环块的末尾。,应用电子技术,DSP技术及应用,24,7. 在汇编时定义符号的伪指令 作用:汇编时的定义符号指令是使有意义的符号名与常数值或字符串相等同。.asg 规定一个字符串与一个替代符号相等,并将其存放
20、在替代符号表中。当汇编器遇到一个替代符号,就用对应的字符串来代替这个符号。替代符号可以重新定义。.eval 计算一个表达式的值并把结果传送到与一个替代符号等同的字符串中。该指令在处理计数器时非常有用。.label 定义一个专门的符号以表示当前段内装入时的地址,而不是运行时的地址。.set/.equ 把一个常数值等效成一个符号,存放在符号表中,且不能被清除。,应用电子技术,DSP技术及应用,25,8. 其他方面的汇编伪指令.end 结束汇编。它是一个程序的最后一个源语句。.mmregs 定义存储器映射寄存器的替代符号。对于所有的存储器映射寄存器,使用该指令和执行一个.set是一样的。.algeb
21、raic 告诉编译器程序包含了算术汇编源代码。如果没有使用-mg编译器选项,该指令必须出现在文件的第一行。.netblock 使局部标号复位。局部标号是$n或name?形式的符号。当它们出现在标号域中时,就对它们进行定义。局部标号是可以用来作为jump指令操作数的临时标号。.netblock在局部标号使用后对其复位,从而限制它的范围。.version 决定指令所运行的处理器。每一种C54x芯片都有自己的值。,应用电子技术,DSP技术及应用,26,4.3.2 宏及宏的使用作用:程序中的子程序往往要多次使用,此时,可将该子程序定义为一个宏。在程序反复执行该子程序时就调用这个宏,从而避免多次重复使用
22、该子程序的源语句。宏语言的功能包括: 定义自己的宏和重新定义已存在的宏; 简化较长的或复杂的汇编代码; 访问归档器创建的宏库; 处理一个宏中的字符串; 控制宏扩展列表。如果想多次调用一个宏,而每次使用的是不同的参数,可以在宏里指定参数。宏的使用可分为3个过程:定义宏、调用宏和展开宏。,应用电子技术,DSP技术及应用,27,1. 定义宏:有两种方法 (1) 宏可以在源文件起始处或者在.include/.copy文件中定义。格式宏名 .macro参数1,参数n汇编语句或宏指令.mexit.endm 宏名定义的宏名如果与某条指令或已有的宏定义重名,就将代替它们; 汇编语句每次调用宏时执行的汇编语言指
23、令或汇编伪指令; 宏指令用来控制展开宏; .mexit功能类似于goto .endm语句,该项为可选项; .endm结束宏定义; 注释注释前加一感叹号“!”,表示该注释包括在宏定义中,而又不出现在 宏展开中;若注释前加星号或分号,表示让注释出现在宏展开中。,应用电子技术,DSP技术及应用,28,(2) 在宏库中定义宏宏库由归档器创建,是采用归档格式的文件集合。归档文件(宏库)里的每一个文件都包含着一个与文件名相对应的宏定义;宏名与文件名必须相同;宏库中的文件必须是未被汇编过的源文件,其扩展名是.asm。可以使用.mlib指令访问宏库。其语法为.mlib 宏库文件名,应用电子技术,DSP技术及应
24、用,29,2. 调用宏在源程序中通过把宏名作为操作数来调用宏。其格式为宏名 参数1,参数n 3. 展开宏当源程序调用宏时,编译器会将宏展开。在展开期间,编译器把自变量传递给宏参数,用宏定义来代替宏调用语句并对源代码进行编译。在默认状态下,宏展开会在指令列表文件中列出,可以使用.mnolist指令关掉宏指令列表。,应用电子技术,DSP技术及应用,30,【例4.3】 宏定义、宏调用和宏展开举例(部分程序)。 DAT0 .set 60h ;把一个常数值等效成一个符号 DAT1 .set 61h ;表示地址 DAT2 .set 62h DAT3 .set 63h.text ADD3 .macro P1
25、, P2, P3, ADDRP ; 宏定义:三数相加;ADDRP = P1 + P2 + P3LD P1, AADD P2, AADD P3, ASTL A, ADDRP.endm,应用电子技术,DSP技术及应用,31,ST #0034h, DAT0 ; 参数赋值ST #0243h, DAT1ST #1230h, DAT2ADD3 DAT0, DAT1,DAT2,DAT3 ; 宏调用:DAT3 = ; DAT0 + DAT1 + DAT2NOP .end,应用电子技术,DSP技术及应用,32,4.4 公共目标文件格式COFF COFF (Common Object File Format,CO
26、FF) :汇编器和链接器所创建的目标文件 。COFF的核心概念:使用代码块(段)和数据块(段)编程,而不是指令或数据简单的顺序编写。 采用段形式的优缺点:更利于模块化编程,管理代码段和目标系统存储器更灵活不必为程序代码或变量指定目标地址,这为程序编写和程序移植提供了极大的方便; 能与系统存储单元充分配合; 编译系统复杂; 对编程人员要求高(系统存储器结构;存储器映射方式),应用电子技术,DSP技术及应用,33,4.4.1 COFF文件中的段段(Sections)是COFF文件中最重要的概念。段就是在编写汇编语言源程序时,采用的代码块或数据块,它占据存储器的某个连续空间。 在编写汇编语言源程序时
27、,程序是按段组织的; 每行汇编语句从属一个段,由伪指令标明该段的属性; 一个目标文件中的每个段都是分开的和各不相同的。,应用电子技术,DSP技术及应用,34,所有的COFF目标文件都包含以下3种形式的段:.text 段 (此段通常包含可执行代码);.data段 (此段通常包含初始化数据);.bss 段 (此段通常为未初始化变量保留存储空间)。此外,汇编器和链接器可以建立、命名和链接自定义段。 自定义段是程序员自己定义的段; 使用起来与.data、.text以及.bss段类似; 它的好处是在目标文件中与.data、.text以及.bss分开汇编,链接时作为一个单独的部分分配到存储器。 有2种形式
28、:.sect 建立的自定义段是已初始化段;.usect 建立的自定义段是未初始化段。,应用电子技术,DSP技术及应用,35,汇编器根据伪指令用适当的段将各部分程序代码和数据连在一起,构成目标文件;链接器分配存储单元,即把各个段重新定位到目标存储器中。,图4.2 目标文件中的段与目标存储器之间的关系,应用电子技术,DSP技术及应用,36,4.4.2 汇编器对段的处理汇编器对段的处理是通过段定义伪指令区分出各个段,且将段名相同的语句汇编在一起。汇编器有5个段定义伪指令支持该功能,这5个伪指令是:.bss,.usect,.text, .data, .sect如果汇编语言程序中一个段伪指令都没有用,汇
29、编器会把程序中的内容都汇编到.text段。汇编器对不同类型段的处理不同。,应用电子技术,DSP技术及应用,37,1. 未初始化段未初始化段(Uninitialized sections)由.bss和.usect伪指令建立。 未初始化段就是在目标存储器中的保留空间,以供程序运行过程中的变量作为临时存储空间使用。在目标文件中,这些段中没有确切的内容,通常它们定位到RAM区。 未初始化段分为默认的和命名的2种,其句法如下 .bss 符号,字数符号 .usect “段名”,字数 每调用.bss伪指令一次,汇编器在相应段保留预留字数的空间; 每调用.usect伪指令一次,汇编器在指定的命名段保留预留字数
30、的空间。,应用电子技术,DSP技术及应用,38,2. 初始化段初始化段(Initialized sections)由.text、.data和.sect伪指令建立,包含可执行代码或初始化数据。这些段中的内容都在目标文件夹中,当加载程序时再放到存储器中。每个初始化段都是可以重新定位的,并且可以引用其他段中所定义的符号。链接器在连接时自动处理段间的相互引用。3种初始化伪指令的句法如下:.text 段起点.data 段起点.sect “段名”,段起点,应用电子技术,DSP技术及应用,39,二者的不同:当汇编器遇到.text或.data或.sect伪指令时,将停止对当前段的汇编(相当于一条结束当前段汇编
31、的伪指令),然后将紧跟着的程序代码或数据汇编到指定的段中,直到再遇到另一条.text或.data或.sect伪指令为止。而当汇编器遇到.bss和.usect伪指令时,并不结束当前段的汇编,只是暂时从当前段脱离出来,并开始对新的段进行汇编。.bss和.usect伪指令可以出现在一个已初始化段的任何位置上,而不会对它的内容发生影响。,应用电子技术,DSP技术及应用,40,3. 自定义段.usect和.sect可以创建自定义的段。 自定义段是用户自己创建的,可以同默认的.test、.data、.bss段一样使用,但它们之间是单独汇编的。 可为那些未初始化的、不在.bss段的变量保留空间。.usect
32、创建同.bss段一样使用的自定义段,它在RAM中为变量保留空间。 也可以汇编已初始化的、不在.data段中的数据,.sect创建像默认的.text和.data一样的段,可包含代码和数据,而且有可重定位的地址。,应用电子技术,DSP技术及应用,41,4. 段程序计数器(SPC)汇编器为每个段都安排一个单独的段程序计数器(SPC)。SPC表示一个程序代码段或数据段内的当前地址。一开始,汇编器将每个SPC置0。当汇编器将程序代码段或数据加到一个段内时,相应的SPC就增加。如果继续对某个段汇编,则相应的SPC就在先前的数值上继续增加。链接器在链接时要对每个段进行重新定位。,应用电子技术,DSP技术及应
33、用,42,【例4.4】 段伪指令应用举例。 1 0000 .data ;汇编至.data段 2 0000 0011 coeff .word 011h, 022h, 033h0001 00220002 0033 3 0000 .bss buffer, 10 ;在.bss段为buffer变量;保留10个字的空间 4 0003 0123 ptr .word 0123h ;继续汇编至.data段 5 0000 .text ;汇编至.text 段 6 0000 100f add: LD 0Fh, A 7 0001 f010 aloop: SUB #1, A0002 0001 8 0003 f842 BC
34、 aloop, AGEQ0004 0001,应用电子技术,DSP技术及应用,43,9 0004 .data 10 0004 00aa ivals .word 0AAh,0BBh,0CCh;继续汇编至.data段0005 00bb0006 00cc 11 0000 var2 .usect “newvars”,1 ;自定义数据段,保留8 ;个字的空间 12 0001 inbuf .usect “newvars”,7 13 0005 .text ;继续汇编至.text 段 14 0005 110a mpy: LD 0Ah, B 15 0006 f166 mloop: MPY #0Ah, B0007
35、000a 16 0008 f868 BC mloop, BNOV0009 0006,应用电子技术,DSP技术及应用,44,17 0000 .sect “vectors” ;自定义数据段,包含 ;2个初始化字 18 0000 0011 .word 011h, 033h 19 0001 0033 field1 field2 field3 field4 行号 SPC 代码 源程序,应用电子技术,DSP技术及应用,45,共建立了5个段。目标代码图,应用电子技术,DSP技术及应用,46,4.4.3 链接器对段的处理链接器在处理段的时候,有如下2个主要任务:将由汇编器产生的COFF格式的一个或多个.obj
36、文件链接成一个可执行的.out文件;重新定位,将输出的段分配到相应的存储器空间。链接器有2条命令支持上述任务: (1) MEMORY命令。定义目标系统的存储器配置图,包括对存储器各部分命名,以及规定它们的起始地址和长度; (2) SECTIONS命令。告诉链接器如何将输入段组合成输出段,以及将输出段放在存储器中的什么位置。,应用电子技术,DSP技术及应用,47,1. MEMORY命令作用:定义系统中所包含的各种形式的存储器,以及它们占据的地址范围。句法: MEMORY PAGE0:name 1(attr): orign=constant, length=constant; PAGEl:name
37、 nattr: orign=constant, length=constant; PAGE对一个存储空间加以标记。PAGE 0程序存储器,PAGE l定为数据存储器。Name对一个存储区间取名。 Origin存储区的起始地址。键入Origin、Org或O都可Length规定存储区的长度。键入Length、Len或L都可以 Attr这是一个任选项,为命名区规定14个属性。如果有选项,应写在括号内。当输出段定位到存储器时,可利用属性加以限制。属性选项一共有4项: R 规定可以对存储器执行读操作; W 规定可以对存储器执行写操作; X 规定存储器可以装入可执行的程序代码 I 规定可以对存储器进行初始
38、化。 如果一项属性都没有选中,就可以将输出段不受限制的定位到任何一个存储器位置。任何一个没有规定属性的存储器(包括所有默认方式的存储器)都有全部4项属性。 。,应用电子技术,DSP技术及应用,48,【例4.5】 MEMORY命令的使用。 MEMORY PAGE 0: ROM: origin=0c00h, length=1000h; PAGE 1: SCRATCH: origin=60h, length=20h;ONCHIP: origin=80h, length=200h; 上述MEMORY命令所定义的系统的存储器配置如下: PAGE 0为程序存储器,名ROM,起始地址0C00H,长度4K字。
39、 PAGE l为数据存储器,名SCRATCH,起始地址60H,长32字。 PAGEl为数据存储器,名ONCHIP,起始地址80H,长度512字。,应用电子技术,DSP技术及应用,49,2. SECTIONS命令 作用:说明如何将输入段组合成输出段;规定输出段在存储器中的存放位置;并允许重新命名输出段。句法: SECTIONS name:property,property,property, name:property,property,property, name:property,property,property, Name段名,每一个输出段的说明都从段名开始。 Property性能参数,
40、应用电子技术,DSP技术及应用,50,【例4.6】 SECTIONS命令的使用。 file1.obj file2.obj SECTIONS .text: load=ROM, run=800h.bss: load=RAM.vectors: load=FF80h .bss段结合file1.obj和file2.obj的.bss段且被装入RAM空间。 .text段结合file1.obj和file2.obj的.text段,链接器将所有命名为.text 的段都结合进该段,在程序运行时该段必须重新定位在地址 0800h。 .vectors段定位在地址FF80h。,应用电子技术,DSP技术及应用,51,3.
41、MEMORY和SECTIONS命令的缺省算法如果没有利用MEMORY和SECTIONS命令,链接器就按缺省算法来定位输出段: MEMORY PAGE 0:PROG:origin=0x0080, length=0xFF00 PAGE 1:DATA:origin=0x0080, length=0xFF80 SECTIONS .text: PAGE=0.data: PAGE=0.cinit: PAGE=0.bss: PAGE=1 ,应用电子技术,DSP技术及应用,52,4.5 汇编源程序的编辑、汇编和链接过程,应用电子技术,DSP技术及应用,53,4.5.1 编辑:利用诸如Word、Edit、记事本
42、等文本编辑器,编写汇编语言源程序,后缀为.asm。 4.5.2 汇编器作用: 汇编语言源文件(.asm)翻译成机器语言目标文件(.obj) 。输入文件: 汇编语言源文件,其省缺的文件扩展名是.asm。 1. 汇编器的功能 (1) 处理源语句,产生一个可重新定位的目标文件(.obj); (2) 根据要求,产生源列表文件(.lst),并提供对该列表的控制; (3) 根据要求,将交叉引用列表添加到源程序列表中; (4) 将代码分段;设置一个段程序记数器(SPC); (5) 定义和引用全局符号;,应用电子技术,DSP技术及应用,54,2. 汇编器的调用 命令格式如下asm500input fileob
43、ject filelisting file-options 其中: input file汇编源文件名,缺省后缀为.asm; object file编译输出的目标文件名,缺省后缀为.obj; listing file产生的列表文件名,缺省后缀为.lst; options编译器使用的各种选项,每个选项前面加有短横。 常用选项有: -c:编译器忽略字母的大小写。 -1:(小写的L)在编译时产生列表文件,缺省后缀为.lst。 -s:将所有的符号都放入符号表。 -x:产生一个交叉汇编表,并把它附加到列表文件的最后。 例如:asm500 example.asm -l -s -x,应用电子技术,DSP技术及
44、应用,55,3. 列表文件列表文件包括源程序的行号、段程序计数器(SPC)、目标代码和源程序4个部分。 【例4.7】 列表文件举例(example.lst部分) 10 000004 0008 .word 8,6,4,2 000005 0006 000006 0004 000007 0002 11 000000 .text ;code follows“ 12 000000 7728 start: STM #0,SWWSR ;adds no wait states000001 0000,应用电子技术,DSP技术及应用,56,4.5.3 链接器 1. 链接器的功能 作用: 将扩展名为.obj的一个或
45、多个COFF目标文件链接起来,生成可执行的输出文件(.out)和存储器映像文件(.map)。 功能: (1) 将各个段配置到目标系统的存储器中; (2) 对各个符号和段进行重新定位,并给它们制定一个确定的地址; (3) 解决输入文件之间未定义的外部引用。,应用电子技术,DSP技术及应用,57,2. 链接器的调用(2种方法)(1) 在命令行中制定选项和文件名。命令格式如下lnk500 filename1 filename n -options filenames 为文件名,可是目标文件、链接命令文件或文件库。 输入默认值为.obj,输出默认为.out。 -options为可选项,常用的选项有:
46、-e global_symbol:定义程序的进入点。global_symbol必须在源程序中,用.global伪指令说明。 -m filename:生成.map文件。 -o filename:指定生成的.out文件名。系统缺省为a.out。 例如, lnk500 file1.obj file2.obj -m prog.map -o prog.out,应用电子技术,DSP技术及应用,58,(2)链接命令文件(扩展名为.cmd)链接命令文件是将链接的信息放在一个文件中,这在多次使用同样的链接信息时,可以方便地调用。 另外, 在命令文件中可用两个十分有用的命令MEMORY和SECTIONS,指定实际
47、应用中的存储器结构和进行地址的映射。而在命令行调用时不能使用这两个命令。 命令文件为ASCII文件,可包含以下内容: 输入文件名; 链接器选项; MEMORY和SECTIONS链接命令; 赋值说明。,应用电子技术,DSP技术及应用,59,【例4.8】 链接命令文件(file.cmd)的编写。 file1.obj file2.obj -m prog.map -o prog.out MEMORY PAGE 0: EPROM :org=0E00h,len=100hPAGE 1: SPRAM :org=0060h,len=0020hDARAM :org=0080h,len=100h SECTIONS
48、.text : EPROM PAGE 0. data : EPROM PAGE 0.bss : SPRAM PAGE 1STACK : DARAM PAGE 1 ,应用电子技术,DSP技术及应用,60,3. 多个文件的链接(1) 编写复位向量文件vectors.asm。 【例4.9】 复位向量vectors.asm。* Reset vectors for example.asm *.title “vectors.asm”.ref start.sect “.vectors”rst: B start.end vectors.asm文件中引用了example.asm中的标号“start”, 这是在两个文件之间通过.ref和.def伪指令实现的。,