2009年 7月 30日 DSP原理及应用 1
第 4章 汇编语言程序开发工具内容提要可编程 DSP芯片开发需要一套完整的软、硬件开发工具。通常可分成代码生成工具和代码调试工具两大类。
代码生成工具是指将高级语言或汇编语言编写的
DSP程序转换成可执行的 DSP芯片目标代码的工具程序,主要包括汇编器、链接器和 C编译器以及一些辅助工具程序等。
代码调试工具包括 C/汇编语言源码调试器、仿真器等。
本章主要介绍代码生成工具,包括 ’C54x软件开发流程、汇编语言程序的编写、编辑、汇编和链接过程,COFF段的一般概念、汇编器和链接器处理段的方法以及程序的重定位等。
2009年 7月 30日 DSP原理及应用 2
第 4章 汇编语言程序开发工具
4.1 TMS320C54x软件开发过程
4.2汇编语言程序的编辑、汇编和链接过程
4.3 COFF的一般概念
4.4源程序的汇编
4.5链接器的使用
2009年 7月 30日 DSP原理及应用 3
第 4章 汇编语言程序开发工具
4.1 TMS320C54x软件开发过程
’ C54x的应用软件开发主要完成以下工作:
(1)选择编程语言编写源程序
’ C54x提供 2种编程语言,即汇编语言和 C/C++语言。
对于完成一般功能的代码,这两种语言都可使用,但对于一些运算量很大的关键代码,最好采用汇编语言来完成,
以提高程序的运算效率。
(2)选择开发工具和环境
’ C54x提供了两种开发环境。即非集成开发环境和集成开发环境 CCS。
2009年 7月 30日 DSP原理及应用 4
第 4章 汇编语言程序开发工具
4.1 TMS320C54x软件开发过程
1.’C54x应用软件开发流程
’C54x应用软件的开发可在 TI公司提供的开发环境中进行,
用户可以用 C/C++语言或汇编语言编写源文件,经 C编译器、
汇编器生成 COFF格式的目标文件,再用链接器进行链接,生成在 ’ C54x上可执行的目标代码,然后利用调试工具对可执行的目标代码进行仿真和调试。
当调试完成后,通过 Hex代码转换工具,将调试后的可执行目标代码转换成 EPROM编程器能接受的代码,并将该代码固化到 EPROM中或加载到用户的应用系统中,以便 DSP目标系统脱离计算机单独运行。
2009年 7月 30日 DSP原理及应用 5
第 4章 汇编语言程序开发工具
1.’C54x应用软件开发流程开发过程的目的是产生一个可以由 ’ C54x目标系统执行的模块。
C源文件
C编译器汇编源文件汇编器汇编源文件
COFF
目标 文件链接器可执行的
COFF文件宏 源文件存档 器宏库存档器目标文件库建库工具运行时支持库
EPROM
编程器 交叉引用列表器调试工具
TMS320C54x
绝对地址列表器
HEX代码转换工具
2009年 7月 30日 DSP原理及应用 6
第 4章 汇编语言程序开发工具
2.’C54x的开发工具
TI公司提供的 DSP开发环境和工具主要包括以下三个部分:
代码生成工具
代码调试工具
实时操作系统
2009年 7月 30日 DSP原理及应用 7
第 4章 汇编语言程序开发工具
2.’C54x的开发工具
(1)代码生成工具:
C编译器,用来将 C/C++语言源程序自动编译为
’ C54x的汇编语言源程序。
汇编器,用来将汇编语言源文件汇编成机器语言 COFF目标文件。
链接器,将汇编生成的、可重新定位的 COFF目标模块组合成一个可执行的 COFF目标模块。
文档管理器,允许用户将一组文件(源文件或目标文件)集中为一个文档文件库。
2009年 7月 30日 DSP原理及应用 8
第 4章 汇编语言程序开发工具
2.’C54x的开发工具
助记符指令 —代数式指令翻译器,用来将包含助记符指令的汇编语言源文件转换成包含代数式指令的汇编语言源文件。
建库实用程序,用来建立用户自己使用的、并用 C/C++语言编写的支持运行的库函数。
十六进制转换程序,可以很方便地将 COFF目标文件转换成 TI,Intel,Motorola等公司的目标文件格式。
(1)代码生成工具:
2009年 7月 30日 DSP原理及应用 9
第 4章 汇编语言程序开发工具
2.’C54x的开发工具
(1)代码生成工具:
绝对制表程序,将链接后的目标文件作为输入,
生成,abs输出文件。
交叉引用制表程序,利用目标文件生成一个交叉引用清单,列出链接的源文件中的符号以及它们的定义和引用情况。
2009年 7月 30日 DSP原理及应用 10
第 4章 汇编语言程序开发工具
2.’C54x的开发工具
(2)代码调试工具:
C/汇编语言源码调试器,与软件仿真器、评价模块、软件开发系统、软件仿真器等配合使用。
软件仿真器,是一种模拟 DSP芯片各种功能并在非实时条件下进行软件调试的调试工具,它不需目标硬件支持,只需在计算机上运行。
初学者工具 DSK,是 TI公司提供给初学者进行
DSP编程练习的一套廉价的实时软件调试工具。
2009年 7月 30日 DSP原理及应用 11
第 4章 汇编语言程序开发工具
2.’C54x的开发工具
(2)代码调试工具:
软件开发系统 SWDS,是一块 PC插卡,可提供低成本的评价和实时软件开发,还可用来进行软件调试,程序可在 DSP芯片上实时运行。
可扩展的开发系统仿真器 (XDS510),可用来进行系统级的集成调试,是进行 DSP芯片软硬件开发的最佳工具。
评价模块 EVM板,是一种低成本的开发板,可进行 DSP芯片评价、性能评估和有限的系统调试。
2009年 7月 30日 DSP原理及应用 12
第 4章 汇编语言程序开发工具
4.2 汇编语言程序的编辑、汇编和链接过程汇编语言源程序可以在任何一种文本编辑器中进行。如笔记本,WORD,EDIT,TC等。
当汇编语言源程序编写完成后,还必须经过汇编和链接后才能运行。
2009年 7月 30日 DSP原理及应用 13
第 4章 汇编语言程序开发工具
4.2 汇编语言程序的编辑、汇编和链接过程示意图汇编器 调试程序链接器文本编辑器
.asm
源文件
.obj
目标文件
.out
输出文件
,cmd
链接命令文件
,lst
列表文件
,map
存储器映像文件十六进制转换程序
HEX500
- o
- m- l
2009年 7月 30日 DSP原理及应用 14
第 4章 汇编语言程序开发工具
4.2 汇编语言程序的编辑、汇编和链接过程
1.编辑利用各种文本编辑器,如笔记本,WORD,EDIT
和 TC等,可编写汇编语言源程序。
2.汇编当汇编语言源程序编写好以后,可利用 ’ C54x
的汇编器 ASM500,对一个或多个源程序分别进行汇编,并生成列表文件 (.lst)和目标文件 (.obj)。
2009年 7月 30日 DSP原理及应用 15
第 4章 汇编语言程序开发工具
4.2 汇编语言程序的编辑、汇编和链接过程
2.汇编常用的汇编命令:
asm500 %1 - s - 1 - x
调用汇编器命令源文件名将程序所有定义的符号放在目标文件的符号表中生成一个列表文件,lst
生成一个交叉汇编表
2009年 7月 30日 DSP原理及应用 16
第 4章 汇编语言程序开发工具
4.2 汇编语言程序的编辑、汇编和链接过程
3.链接所谓链接,就是利用 ’ C54x的链接器 LNK500,
根据链接器命令文件 (.cmd)对已汇编过的一个或多个目标文件 (.obj)进行链接,生成输出文件 (.out)
和存储器映像文件 (.map) 。
常用的汇编器命令:
lnk500 %1.cmd
lnk500,调用链接器命令%1.cmd 链接命令文件名,该文件须 指明 目标文件、
输入文件、输出文件,链接选项和存储器配置要求等。
2009年 7月 30日 DSP原理及应用 17
第 4章 汇编语言程序开发工具
4.3COFF的一般概念汇编器和链接器生成的目标文件,是一个可以由 ’ C54x器件执行的文件。这些目标文件的格式称之为公共目标文件格式 (COFF)。
在编写汇编语言程序时,COFF采用代码段和数据段的形式,以便于模块化的编程,使编程和管理变得更加方便。
这些代码段和数据段简称为段。汇编器和链接器提供一些伪指令来建立和管理各种各样的段。
2009年 7月 30日 DSP原理及应用 18
第 4章 汇编语言程序开发工具
4.3COFF的一般概念
4.3.1COFF文件的基本单元
COFF文件有 3种类型,COFF0,COFF1,COFF2。
每种类型的 COFF文件,其标题格式都有所不同,
但数据部分是相同的。
链接器能够读 /写所有类型的 COFF文件,默认时链接器生成的是 COFF2文件,采用 -vn链接选项可以选择不同类型的 COFF文件。
’C54x汇编器和 C编译器产生的是 COFF2文件。
2009年 7月 30日 DSP原理及应用 19
第 4章 汇编语言程序开发工具
4.3.1COFF文件的基本单元
1.段 (sections)
是 COFF文件中最重要的概念。每个目标文件都分成若干段。
段 ——是存储器中占据相邻空间的代码或数据块。
一个目标文件中的每个段都是分开的和各不相同的。
COFF目标文件都包含以下 3种形式的段:
.text段 (文本段 ),通常包含可执行代码;
.data段 (数据段 ),通常包含初始化数据;
.bss段 (保留空间段 ),通常为未初始化变量保留存储空间 。
2009年 7月 30日 DSP原理及应用 20
第 4章 汇编语言程序开发工具
4.3.1COFF文件的基本单元
2.段的基本类型
COFF目标文件中的段有两种基本类型。
初始化段
未 初始化段
(1) 初始化段初始化段中包含有数据或程序代码。主要有:
.text段 ——已初始化段;
.data段 ——已初始化段;
.sect段 ——已初始化段,由汇编器伪指令建立的自定义段。
2009年 7月 30日 DSP原理及应用 21
第 4章 汇编语言程序开发工具
4.3.1COFF文件的基本单元
2.段的基本类型
COFF目标文件中的段有两种基本类型。
(2) 未初始化段在存储空间中,为未初始化数据保留存储空间。
它包括:
.bss段 ——未初始化段;
.usect段 ——未初始化段,由汇编命令建立的命名段(自定义段)。
2009年 7月 30日 DSP原理及应用 22
第 4章 汇编语言程序开发工具
4.3.1COFF文件的基本单元
3.段与目标存储器的对应关系汇编器的任务,在汇编过程中,根据汇编命令用适当的段将各部分程序代码和数据连在一起,构成目标文件。
链接器的任务,就是分配存储单元,将目标文件中的段重新定位到目标系统的存储器中,这一过程称为定位或分配 。
2009年 7月 30日 DSP原理及应用 23
第 4章 汇编语言程序开发工具
3.段与目标存储器的对应关系目标文件中的段与目标存储器之间的关系目标文件 目标存储器
.bss
.data
.text
RAM
E2PROM
ROM
2009年 7月 30日 DSP原理及应用 24
第 4章 汇编语言程序开发工具
4.3.2汇编器对段的处理汇编器对段的处理是通过段伪指令来区别各个段的,并将段名相同的语句汇编在一起。
汇编器有 5条伪指令可识别汇编语言程序的各个部分:
●,bss
●,usect
●,text
●,data
●,sect
——定义未初始化段
——定义未初始化段
——定义已初始化段
——定义已初始化段
——定义已初始化段
2009年 7月 30日 DSP原理及应用 25
第 4章 汇编语言程序开发工具
4.3.2汇编器对段的处理未初始化段就是在 ’ C54x存储器中保留空间,
通常它们被定位在 RAM区。在目标文件中,这些段中没有确切的内容。
由这些段定义的空间仅作为临时存储空间,在程序运行时,可以利用这些存储空间存放变量。
未初始化段分为默认的和命名的两种,分别由汇编器伪指令,bss和,usect产生。
1.未初始化段
2009年 7月 30日 DSP原理及应用 26
第 4章 汇编语言程序开发工具
(1),bss伪指令
1.未初始化段用于 在 bss段中保留若干个空间。
格式,.bss 符号,字数符号 ——对应于保留的存储空间第一个字的变量名称。
可以让其他段引用,也可以用,global命令定义为全局符号 。
字数 ——表示在 bss段或标有名字的段中保留若干个存储单元。
每调用一次,bss伪指令,汇编器在相应的段保留更多的空间。
2009年 7月 30日 DSP原理及应用 27
第 4章 汇编语言程序开发工具
1.未初始化段
(2),usect伪指令用于为指定的命名段保留若干个空间。
格式,符号,usect,段名,,字数段名 ——程序员为未初始化的命名段定义的名字。
每调用一次,usect伪指令,汇编器在指定的命名段保留更多的空间。
2009年 7月 30日 DSP原理及应用 28
第 4章 汇编语言程序开发工具
4.3.2汇编器对段的处理已初始化段中包含有可执行代码或初始化数据。
这些段中的内容都在目标文件中,当加载程序时再放到 ’ C54x的存储器中。每个已初始化段都是可以重新定位的,并且可以引用其他段中所定义的符号。
链接器在链接时会自动地处理段间的相互引用。
已初始化段由,text,.data和,sect三个伪指令建立。
2.已初始化段
2009年 7月 30日 DSP原理及应用 29
第 4章 汇编语言程序开发工具已初始化命令的句法:
2.已初始化段
.text [段起点 ]
.data [段起点 ]
.sect,段名,[,段起点 ]
段起点 ——是任选项。
若选用,它为段程序计数器 SPC定义一个起始值。
若默认,则 SPC从 0开始。
2009年 7月 30日 DSP原理及应用 30
第 4章 汇编语言程序开发工具
4.3.2汇编器对段的处理当汇编器遇到,text或,data或,sect命令时,将停止对当前段的汇编 (相当于一条结束当前段汇编的命令 ),然后将紧接着的程序代码或数据汇编到指定的段中,直到再遇到另一条,text,.data或,sect命令为止。
当汇编器遇到,bss或,usect命令时,并不结束当前段的汇编,只是暂时从当前段脱离出来,并开始对新的段进行汇编。
.bss和,usect命令可以出现在一个已初始化段的任何位置,而不会对它的内容发生影响。
2009年 7月 30日 DSP原理及应用 31
第 4章 汇编语言程序开发工具
4.3.2汇编器对段的处理命名段由用户指定,与默认的,text,.data和
.bss段的使用相同,但它们被分开汇编。
假如一部分可执行代码(例如初始化程序)不希望和,text段分配在一起,可将它们汇编进一个命名段,这样就可定位在与,text不同的地方。也可将初始化的数据汇编到与,data段不同的地方,或者将未初始化的变量保留在与,bss段不同的位置。
可用,usect和,sect两个伪指令产生命名段。
3.命名段(自定义段)
2009年 7月 30日 DSP原理及应用 32
第 4章 汇编语言程序开发工具
.usect伪指令产生类似,bss的段,为变量在 RAM
中保留存储空间。
.sect伪指令产生类似,text和,data的段,可以包含代码或数据。,sect伪指令产生可重新定位地址的命名段。
3.命名段产生命名段伪指令格式:
符号,usect,段名,,字数
.sect,段名,
可以产生多达 32767个不同的命名段。段名可长达 200个字符。
2009年 7月 30日 DSP原理及应用 33
第 4章 汇编语言程序开发工具对于,sect和,usect伪指令,段名可以作为子段的参考。
每次用一个新名字调用这些伪指令时,就产生一个新的命名段。
若用已有的段名调用这些伪指令,则汇编器就将代码或数据(或保留空间)汇编进相应名称的段中。
不同的伪指令不能使用相同的名字。即不能用
.usect创建了命名段,然后又用,sect创建一个相同名字的段。
3.命名段
2009年 7月 30日 DSP原理及应用 34
第 4章 汇编语言程序开发工具
4.3.2汇编器对段的处理子段是较大段中的小段。链接器可以像处理其他段一样处理子段。
子段结构可用来对存储器空间进行更紧凑的控制,
可以使存储器空间分配更加紧密。
4.子段子段命名格式:
基段名,子段名子段名前为基段名,随后为冒号,最后为子段名。
2009年 7月 30日 DSP原理及应用 35
第 4章 汇编语言程序开发工具对于子段,汇编器可以单独为其分配存储单元,
或者在相同的基段名下与其他段组合在一起。
用,sect命令建立的段是已初始化的子段;
用,usect命令建立的段是未初始化的子段。
4.子段例如,若要在,text段内建立一个称之为 _func
的子段,其命令格式:
.sect,.text,_func”
2009年 7月 30日 DSP原理及应用 36
第 4章 汇编语言程序开发工具
4.3.2汇编器对段的处理汇编器为每个段都安排了一个单独的程序计数器称之为段程序计数器 SPC。
SPC表示在程序代码或数据段内当前的地址。开始时汇编器将每个 SPC置 0。当汇编器将程序代码或数据加到段内时,增加相应的 SPC值。若再继续对某个段汇编,则相应的 SPC就在先前的数值上继续增加。
链接器在链接时要对每个段进行重新定位。
5.段程序计数器 SPC
2009年 7月 30日 DSP原理及应用 37
第 4章 汇编语言程序开发工具
【 例 4.3.1】 段命令应用举例。
汇编语言源程序:
.data
coeff,word 044h,055h,066h
.bss buffer,8
prt,word 0456h
.text
add,LD 0Dh,A
aloop,SUB #1,A
BC aloop,AGEQ
.data
ivals,word 0CCh,0DDh,0EEh;初始化数据段;3组数据放入,data段;在,bss段保留 8个单元;0456h放入,data段;初始化文本段;1字指令;2字指令;2字指令共计 5个字;初始化数据段;3组数据放入,data段
2009年 7月 30日 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命名段
2009年 7月 30日 DSP原理及应用 39
第 4章 汇编语言程序开发工具经汇编后,得列表文件(部分):
2 **********************************
3 ** 汇编一个初始化表到,data段 **
4 **********************************
5 0000,data
6 0000 0044 coeff,word 044h,055h,066h
0001 0055
0002 0066
7 **********************************
8 ** 在,bss段中为变量保留空间 **
9 **********************************
10 0000,bss buffer,8
11 **********************************
12 ** 仍然在,data 段中 **
13 **********************************
14 0003 0456 prt,word 0456h
2009年 7月 30日 DSP原理及应用 40
第 4章 汇编语言程序开发工具
15 **********************************
16 ** 汇编代码到,text段 **
17 **********************************
18 0000,text
19 0000 100d add,LD 0Dh,A
20 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 00ee
27 **********************************
28 ** 为更多的变量定义另一个段 **
29 **********************************
30 0000 var2,usect,newvars”,2
31 0001 inbuf,usect,newvars”,8
2009年 7月 30日 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
源程序的行号段程序计数器目标代码汇编语言源程序
2009年 7月 30日 DSP原理及应用 42
第 4章 汇编语言程序开发工具汇编语言源程序经过汇编后,共建立了 5个段:
●,text段 ——文本段,段内有 10个字可执行的程序代码。
●,data段 ——已初始化的数据段,段内有 7
个字的数据。
● vectors段 ——用,sect命令生成的命名段,
段内有 2个字的初始化数据。
●,bss段 ——未初始化的数据段,在存储器中为变量保留 8个存储单元。
● newvars段 ——用,usect命令建立的命名段,
为变量保留 10个存储单元。
2009年 7月 30日 DSP原理及应用 43
第 4章 汇编语言程序开发工具经汇编后,得列表文件(部分):
2 *******************************
3 ** 汇编一个初始化表到,data段 **
4 *******************************
5 0000,data
6 0000 0044 coeff,word 044h,055h,066h
0001 0055
0002 0066
7 *******************************
8 ** 在,bss段中为变量保留空间 **
9 *******************************
10 0000,bss buffer,8
11 *******************************
12 ** 仍然在,data 段中 **
13 *******************************
14 0003 0456 prt,word 0456h
行号 目标代码 段名
100df010
0001f842
0001110a
f166000a
F8680006
00440055
00660456
00cc00dd
00ee
00440088
没有数据保留 10个字
0000,data
0000 0044
10 0000,
14 0456
.data66
6
10,bss没有数据保留 8个字
14
2009年 7月 30日 DSP原理及应用 44
第 4章 汇编语言程序开发工具
15 ********************************
16 ** 汇编代码到,text段 **
17 ********************************
18 0000,text
19 0000 100d add,LD 0Dh,A
20 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 00ee
27 ********************************
28 ** 为更多的变量定义另一个段 **
29 ********************************
30 0000 var2,usect,newvars”,2
31 0001 inbuf,usect,newvars”,8
行号 目标代码 段名
100df010
0001f842
0001110a
f166000a
F8680006
66
614
00440055
00660456
00cc00dd
00ee
.data
00440088
10 没有数据保留 8个字,bss
没有数据保留 10个字
.text
18 0000,text
19 0000 100d add:,
19 100
20 0001 f010 aloop:,
2020
21 0003 f842,
2121
25 0004
26 0004 00cc,,
.
26 00cc
26
26
30 0000,2 newvars30 保留 2个字
31 0001,31 保留 8个字
2009年 7月 30日 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
行号 目标代码 段名
1920
2021
21
100df010
0001f842
0001110a
f166000a
F8680006
.text
66
614
2626
26
00440055
00660456
00cc00dd
00ee
.data
00440088
10 没有数据保留 8个字,bss
3031 没有数据保留 10个字 newvars
35 0005
36 0005 110a mpy:,B 36
0006 f166,B
37 8
37
38 0008,
38 f
38
42 0000 vectors
43 0000 0044,43 004443 0088
2009年 7月 30日 DSP原理及应用 46
第 4章 汇编语言程序开发工具
4.3.3链接器对段的处理链接器是开发 ’ C54x器件必不可少的开发工具之一,它对段处理时有 2个主要任务:
① 将一个或多个 COFF目标文件中的各种段作为链接器的输入段,经链接后在一个执行的 COFF输出模块中建立各个输出段;
② 在程序装入时对其重新定位,为各个输出段选定存储器地址。
2009年 7月 30日 DSP原理及应用 47
第 4章 汇编语言程序开发工具
4.3.3链接器对段的处理链接器有 2条伪指令支持上述任务:
● MEMORY伪指令 ——用来定义目标系统的存储器配置空间,包括对存储器各部分命名,以及规定它们的起始地址和长度。
● SECTIONS伪指令 ——用来指定链接器将输入段组合成输出段方式,以及输出段在存储器中的位置,也可用于指定子段。
若未使用伪指令,则链接器将使用目标处理器默认的方法将段放入存储空间。
2009年 7月 30日 DSP原理及应用 48
第 4章 汇编语言程序开发工具
4.3.3链接器对段的处理
1.默认的存储器分配链接器可对多个目标文件进行链接。若链接文件中不使用 MEMORY和 SECTIONS命令,则为默认方式。
每个目标文件都有,text,.data,.bss段和命名段。若采用默认链接,链接器将对多个目标文件中的各个段进行组合,形成各自的对应段,并将各个段配置到所指定的存储器中,形成可执行的目标模块。
在默认的方式下,链接器将从存储器的 0080h开始,对组合后的各段进行存储器配置。
2009年 7月 30日 DSP原理及应用 49
第 4章 汇编语言程序开发工具默认的存储器分配:
① 将所有,text段组合在一起,形成一个,text
段,并分配到程序存储器中;
② 将多个目标文件中的,data段组合在一起,
分配到紧接着,text段的程序存储空间中;
③ 将,bss段组合,配置到数据存储器中;
④ 组合命名段。初始化的命名段按顺序分配到紧随,data段的程序存储器,而未初始化命名段将被配置到紧随,bss段的数据存储器中。
1.默认的存储器分配
2009年 7月 30日 DSP原理及应用 50
第 4章 汇编语言程序开发工具默认的存储器分配过程:
File1.obj
.text1
.data1
.bss1
table_1
(初始化的命名段 )
u_vars1
(未初始化的命名段 )
File2.obj
.text2
.data2
.bss2
table_2
(初始化的命名段 )
u_vars2
(未初始化的命名段 )
FFT
(初始化的命名段 )
程序存储器 数据存储器
.text,text1
.text2
.data,data1
.data2,bss.bss1
.bss2
table
table_1
table_2 u_vars1
u_vars1
u_vars2
FFT FFT
没有使用没有配置没有配置没有使用
2009年 7月 30日 DSP原理及应用 51
第 4章 汇编语言程序开发工具
4.3.3链接器对段的处理
2.段放入存储器空间若不希望链接器将所有的,text段结合在一起形成单个的,text段,就不能采用默认的方式。
由于 DSP硬件系统中可能配置多种类型的存储器,
若要把某一段分配到特定类型的存储器中,或将命名段配置特定的地址,则需采用 MEMORY和 SECTIONS伪指令来配置。
若不采用默认的方式,通常需要建立一个链接命令文件,在命令文件中用 MEMORY和 SECTIONS伪指令定义存储器和配置段地址。
2009年 7月 30日 DSP原理及应用 52
第 4章 汇编语言程序开发工具
4.3.4链接器对程序的重新定位
1.链接器重新定位汇编器对每个段汇编时都是从 0地址开始,而所有需要重新定位的符号 (标号 )在段内都是相对于 0地址的。事实上,所有段都不可能从存储器中 0地址单元开始,因此链接器必须对各个段进行重新定位。
重新定位的方法:
将各个段配置到存储器中,使每个段都有一个合适的起始地址;
将符号变量调整到相对于新的段地址的位置;
将引用调整到重新定位后的符号,这些符号反映了调整后的新符号值。
2009年 7月 30日 DSP原理及应用 53
第 4章 汇编语言程序开发工具
1.链接器重新定位汇编器在需要引用重新定位的符号处都留了一个重定位入口。链接器在对符号重新定位时,利用这些入口修正对符号的引用值。
【例 4.3.2】 一段采用助记符指令编写的程序,经汇编后得列表文件如下:
1,ref X
2,ref Z
3 0000,text
4 0000 F073 B Y ; 产生一个重定位入口
0001 0006’
5 0002 F073 B Z ; 产生一个重定位入口
0003 0000!
6 0004 F020 LD #X,A ; 产生一个重定位入口
0005 0000!
7 0006 F7E0 Y,RESET
2009年 7月 30日 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。
2009年 7月 30日 DSP原理及应用 55
第 4章 汇编语言程序开发工具
1.链接器重新定位链接器利用两个重定位入口,对目标文件中的两次引用进行修正:
变成 f073
7204
变成 f020
7100
f073 B Y
0004’
f020 LD #X,A
0000!
2009年 7月 30日 DSP原理及应用 56
第 4章 汇编语言程序开发工具
4.3.4链接器对程序的重新定位
2.运行时间重新定位在实际运行中,有时需要将代码装入存储器的一个地方,而在另一个地方运行。
如:一些关键的执行代码必须装在系统的 ROM中,
但运行时希望在较快的 RAM中进行。
利用 SECTIONS伪指令选项可让链接器对其定位 2
次,其方法:
① 使用装入关键字设置装入地址;
② 使用运行关键字设置它的运行地址。
2009年 7月 30日 DSP原理及应用 57
第 4章 汇编语言程序开发工具
4.3.4链接器对程序的重新定位
2.运行时间重新定位装入地址确定段的原始数据或代码装入的位置,
而任何对段的使用(例如其中的标号),则参考它的运行地址。在应用中必须将该段从装入地址复制到运行地址。
如果只为段提供了一次定位(装入或运行),则该段将只定位一次,并且装入和运行地址相同。如果提供了 2个地址,则段将被自动定位。
2009年 7月 30日 DSP原理及应用 58
第 4章 汇编语言程序开发工具
4.3.5程序装入链接器产生可执行的 COFF目标文件。可执行的目标文件模块与链接器输入的目标文件具有相同的
COFF格式。为了运行程序,在可执行模块中的数据必须传输或装入目标系统存储器中。
可以采用以下方法装入程序:
使用调试工具转入程序
’ C54x的调试工具包括软件模拟器,XDS仿真器和集成系统 CCS。 它们都具有内部的装入器,调用装入器的 LOAD命令,装入器将程序复制到目标系统的存储器中。
采用 Hex转换工具转入程序可以使用转换工具 Hex500,将可执行 COFF目标模块转换成几种其他目标格式文件,然后将转换后的文件通过编程器将程序装(烧)进 EPROM。
2009年 7月 30日 DSP原理及应用 59
第 4章 汇编语言程序开发工具
4.3.6COFF文件中的符号
COFF文件中有一个符号表,主要用来存储程序中有关符号的信息。链接器在执行程序定位时,要使用符号表提供的信息,而调试工具也要使用该表来提供符号调试。
1.外部符号是指在一个模块中定义、而在另一个模块中引用的符号。它可以用伪指令,def,.ref或,global来定义。
●,def在当前模块中定义,并可在别的模块中使用的符号;
●,ref 在当前模块中使用,但在别的模块中定义的符号;
●,global可以是上面的任何一种情况。
2009年 7月 30日 DSP原理及应用 60
第 4章 汇编语言程序开发工具
1.外部符号
【例 4.3.3】 说明代码段中外部符号的定义。
x,ADD #56h,A
B y
.def x
.ref y;定义 x;引用 y;x在此模块中定义,可为别的模块引用;y在这里引用,它在别的模块中定义
2009年 7月 30日 DSP原理及应用 61
第 4章 汇编语言程序开发工具
4.3.6COFF文件中的符号
2.符号表每当遇到一个外部符号,无论是定义的还是引用的,汇编器都将在符号表中产生一个条目。
汇编器还产生一个指到每段的专门符号,链接器使用这些符号将其他引用符号重新定位。
2009年 7月 30日 DSP原理及应用 62
第 4章 汇编语言程序开发工具
4.4 源程序的汇编汇编器的作用是将汇编语言源程序转换成机器语言目标文件。这些目标文件都是公共目标文件格式 (COFF)。
汇编语言源程序文件可以包含汇编命令,汇编语言指令和宏指令 。
汇编命令用来控制汇编的过程,包括列表格式
、符号定义和将源代码放入块的方式等。
2009年 7月 30日 DSP原理及应用 63
第 4章 汇编语言程序开发工具
4.4 源程序的汇编汇编器包括如下功能:
① 将汇编语言源程序汇编成一个可重新定位的目标文件 (.obj文件 )。
② 根据需要,可以生成一个列表文件 (.lst文件 ),并对该列表进行控制。
③ 将程序代码分成若干个段,每个段的目标代码都有一个 SPC(段程序计数器 )管理。
2009年 7月 30日 DSP原理及应用 64
第 4章 汇编语言程序开发工具
4.4 源程序的汇编汇编器包括如下功能:
④ 定义和引用全局符号,如果需要可以在列表文件后面附加一张交叉引用表。
⑤ 对条件程序块进行汇编。
⑥ 支持宏功能,允许定义宏命令。
⑦ 为每个目标代码块设置一个程序计数器 SPC。
2009年 7月 30日 DSP原理及应用 65
第 4章 汇编语言程序开发工具
4.4 源程序的汇编
4.4.1汇编程序的运行
’ C54x的汇编程序名为 asm500.exe。 要运行汇编程序,可键入如下命令:
asm500 [input file [object file [listing file]]] [-options]
Asm500,运行汇编程序 asm500.exe的命令 。
input file,汇编源文件名,默认扩展名为,asm。
object file,汇编程序生成的 ’ C54x目标文件,扩展名为,obj
。 若不提供目标文件名,则汇编程序就用输入文件或目标文件名。
listing file,汇编器产生的列表文件名,默认扩展名为,lst。
-options,汇编器的选项,为汇编器的使用提供各种选择。
2009年 7月 30日 DSP原理及应用 66
第 4章 汇编语言程序开发工具汇编器 asm500的选项及其功能选 项 功 能
-@
-@filemane(文件名 )可以将文件名的内容附加到命令行上。
使用该选项可以避免命令行长度的限制。如果在一个命令文件、
文件名或选项参数中包含了嵌入的空格或连字号,则必须使用引号括起来,例如:,this-file.asm”。
-a 建立一个绝对列表文件。当选用 -a时,汇编器不产生目标文件 。
-c 使汇编语言文件中大小写没有区别 。
-d
为名字符号设置初值。格式为 -d name[=value]时,与汇编文件被插入 name,set[=value]是等效的。
如果 value被省略,则此名字符号被置为 1。
-f 抑制汇编器给没有,asm扩展名的文件添加扩展名的默认行为。
2009年 7月 30日 DSP原理及应用 67
第 4章 汇编语言程序开发工具汇编器 asm500的选项及其功能选 项 功 能
-g
允许汇编器在源代码中进行代码调试。汇编语言源文件中每行的信息输出到 COFF文件中。
注意:用户不能对已经包含,line伪指令的汇编代码使用 -g
选项。例如由 C/C++编译器运行 -g选项产生的代码 。
-h,-help,-? 这些选项的任一个将显示可供使用的汇编器选项的清单。
-hc
将选定的文件复制到汇编模块。格式为 -hc filename
所选定的文件包含到源文件语句的前面,复制的文件将出现在汇编列表文件中。
-hi
将选定的文件包含到汇编模块。格式为 -hi filename
所选定的文件包含到源文件语句的前面,所包含的文件不出现在汇编列表文件中。
2009年 7月 30日 DSP原理及应用 68
第 4章 汇编语言程序开发工具汇编器 asm500的选项及其功能选 项 功 能
-i
规定一个目录。汇编器可以在这个目录下找到,copy、
.include或,mlib命令所命名的文件。
格式为 -i pathname,最多可规定 10个目录,每一条路径名的前面都必须加上 -i选项。
-l (小写 L) 生成一个列表文件。
-mf 指定汇编调用扩展寻址方式
-mg 源文件是代数式指令。
-q 抑制汇编的标题以及所有的进展信息。
-r,-r[num]
压缩汇编器由 num标识的标志。该标志是报告给汇编器的消息,这种消息不如警告严重。若不对 num指定值,
则所有标志都将被压缩。
2009年 7月 30日 DSP原理及应用 69
第 4章 汇编语言程序开发工具汇编器 asm500的选项及其功能选 项 功 能
-pw 对某些汇编代码的流水线冲突发出警告。
-u -u name取消预先定义的常数名,从而不考虑由任何 -d选项所指定的常数。
-v -v value确定使用的处理器,可用 541,542,543,545,5451p,5461p,548,549值中的一个。
-s
把所有定义的符号放进目标文件的符号表中。
汇编程序通常只将全局符号放进符号表。当利用 -s选项时,
所定义的标号以及汇编时定义的常数也都放进符号表内。
-x
产生一个交叉引用表,并将它附加到列表文件的最后,
还在目标文件上加上交叉引用信息。即使没有要求生成列表文件,汇编程序总还是要建立列表文件的。
2009年 7月 30日 DSP原理及应用 70
第 4章 汇编语言程序开发工具
4.4.2汇编时的列表文件汇编器对源程序汇编时,如果采用 -l选项,汇编后将生成一个列表文件。列表文件中包括源程序语句和目标代码。
每个列表文件的顶部有两行汇编程序的标题、一行空行以及页号行。,title命令提供的文件名打印在页号行左侧;页号打印在此行的右侧。
源文件的每一行都会在列表文件中生成一行。其内容包括行号、段程序计数器 SPC的数值、汇编后的目标代码,以及源程序语句。一条指令可以生成 1或 2个字的目标代码。汇编器为第 2字单独列一行,并列出了 SPC的数值和目标代码。
2009年 7月 30日 DSP原理及应用 71
第 4章 汇编语言程序开发工具
4.4.2汇编时的列表文件从例 4.3.1 可以看出,列表文件包括 4个部分:
源程序语句编号段程序计数器目标代码源程序语句
2009年 7月 30日 DSP原理及应用 72
第 4章 汇编语言程序开发工具
1.源程序语句的行号源程序语句的行号,用十进制数表示。汇编器在汇编时将源程序的行进行编号,有些语句 (如,title)
只列行号,不列语句。
汇编器还可能在一行的左边加一个字母,用来表示该行是从一个包含文件汇编的。
汇编器还可能在一行的左边加一个数字,表示嵌入的宏展开或循环程序块的等级。
2.段程序计数器用十六进制数表示。所有的段都有 SPC。 有些伪指令对 SPC不发生影响,此时这部分为空格。
2009年 7月 30日 DSP原理及应用 73
第 4章 汇编语言程序开发工具
3.目标代码用十六进制数表示。所有指令经汇编都会产生目标代码。目标代码后面的一些记号表示在链接时需要重新定位。
! 未定义的外部引用;
,可重新定位的文本段;
” 可重新定位的数据段;
+ 可 重新定位的初始化命名段;
- 可重新定位的未初始化段;
% 复杂的重新定位的表达式。
4.源程序语句这一部分包含被汇编器搜索到的源程序的所有字符。汇编器可以接受的每行字符数为 200个。
2009年 7月 30日 DSP原理及应用 74
第 4章 汇编语言程序开发工具
4.4.3汇编伪指令汇编器伪指令是汇编语言程序的一个重要内容。
用于为程序提供数据,并控制汇编程序如何汇编源程序。
● 将代码和数据汇编进指定的段
● 为未初始化的变量在存储器中保留空间
● 控制清单文件是否产生
● 初始化存储器
● 汇编条件代码块
● 定义全局变量
● 为汇编器指定从中可以获得宏的库
● 考察符号调试信息汇编器伪指令可完成以下工作:
2009年 7月 30日 DSP原理及应用 75
第 4章 汇编语言程序开发工具
4.4.3汇编伪指令伪指令和它所带的参数必须书写在一行。在包含汇编伪指令的源程序中,伪指令可以带有标号和注释。虽然标号一般不作为伪指令语法的一部分列出,但是有些伪指令必须带有标号,此时,标号将作为伪指令的一部分出现。
2009年 7月 30日 DSP原理及应用 76
第 4章 汇编语言程序开发工具
4.4.3汇编伪指令
’C54x汇编器共有 64条汇编伪指令,根据它们的功能,可以将其分成 8类:
⑴ 对各种段进行定义的命令如,bss,.data,.sect,.text,.usect等。
⑵ 对常数 (数据和存储器 )进行初始化的命令如,bes,.byte,.field,.float,.int,.log、
.space,.string,.pstring,.xfloat,.xlong、
.word等。
2009年 7月 30日 DSP原理及应用 77
第 4章 汇编语言程序开发工具
4.4.3汇编伪指令
⑶ 调整 SPC的指令如,align等。
⑷ 对输出列表文件格式化的命令如,drlist,.drnolist等。
⑸ 引用其他文件的命令如 copy,.def,.global,.include,.mlib、
.ref等。
2009年 7月 30日 DSP原理及应用 78
第 4章 汇编语言程序开发工具
4.4.3汇编伪指令
⑹ 控制条件汇编的命令如,break,.else,.elseif,.endif,.endloop、
.if,.loop等。
⑺ 在汇编时定义符号的命令如,asg,.endstruct,.equ,.eval,.label、
.set,.sruct等。
⑻ 执行其他功能的命令如,algebraic,.emsg,.end,.mmregs,.mmsg、
.newblock,.sblock,.version,.vmsg等 。
2009年 7月 30日 DSP原理及应用 79
第 4章 汇编语言程序开发工具
4.4.3汇编伪指令
1.定义段的伪指令用于定义相应的汇编语言程序的段 。
助记符及语法格式 说 明
.bss symbol,size in words [,blocking] [,alignment] 为未初始化的数据段,bss保留存储空间。
.data
指定,data后面的代码为数据段,通常包含初始化的数据。
.sect,section name” 定义初始化的命名段,可以包含可执行代码或数据。
.text 指定,text后面的代码为文本段,通常包含可执行的代码。
symbol,usect,section name”,size in words
[,blocking] [,alignment flag]
为未初始化的命名段保留空间。类似,bss
伪指令,但允许保留与,bss段不同的空间。
2009年 7月 30日 DSP原理及应用 80
第 4章 汇编语言程序开发工具
【 例 4.4.2】 段伪指令的使用 。
1 ************************************
2 * 开始汇编到,text段 *
3 ************************************
4 000000,text
5 000000 0001,word 1,2
000001 0002
6 000002 0003,word 3,4
000003 0004
7
1.定义段的伪指令;定义文本段;初始化值为 1,2;初始化值为 3,4
2009年 7月 30日 DSP原理及应用 81
第 4章 汇编语言程序开发工具
【 例 4.4.2】 段伪指令的使用 。
8 ************************************
9 * 开始汇编到,data段 *
10 ************************************
11 000000,data
12 000000 0009,word 9,10
000001 000A
13 000002 000B,word 11,12
000003 000C
14
1.定义段的伪指令;定义数据段;初始化值为 9,10;初始化值为 11,12
2009年 7月 30日 DSP原理及应用 82
第 4章 汇编语言程序开发工具
【 例 4.4.2】 段伪指令的使用 。
15 ************************************
16 * 开始汇编到命名的初始化段 *
17 * var_defs *
18 ************************************
19 000000,sect,var_defs”
20 000000 0011,word 17,18
000001 0012
21
1.定义段的伪指令;定义命名段;初始化值为 17,18
2009年 7月 30日 DSP原理及应用 83
第 4章 汇编语言程序开发工具
【 例 4.4.2】 段伪指令的使用 。
22 ************************************
23 * 再继续汇编到,data段 *
24 ************************************
25 000004,data
26 000004 000D,word 13,14
000005 000E
27 000000,bss sym,19
28 000006 000F,word 15,16
000007 0010
29
1.定义段的伪指令;继续汇编数据段;初始化值为 13,14;定义未初始化段,保留 19个 空间;仍然在,data段中;初始化值为 15,16
2009年 7月 30日 DSP原理及应用 84
第 4章 汇编语言程序开发工具
【 例 4.4.2】 段伪指令的使用 。
30 ************************************
31 * 再继续汇编到,text段 *
32 ************************************
33 000004,text
34 000004 0005,word 5,6
000005 0006
35 000000 usym,usect,xy”,20
36 000006 0007,word 7,8
000007 0008
1.定义段的伪指令;继续汇编文本段;初始化值为 5,6;定义 xy段,保留 20个 空间;仍然在,text段中;初始化值为 7,8
2009年 7月 30日 DSP原理及应用 85
第 4章 汇编语言程序开发工具
【 例 4.4.2】 段伪指令的使用 。
.text初始化值为 1,2,3,4,5,6,7,8的字;
.data初始化值为 9,10,11,12,13,14,15,16的字;
var_defs初始化值为 17,18的字;
.bss保留 19个字的空间;
.usect保留 20个字的空间 。
1.定义段的伪指令
.bss和,usect伪指令既不结束当前的段也不开始新段,
它们保留指定数量的空间,然后汇编器开始将代码或数据汇编进当前的段 。
2009年 7月 30日 DSP原理及应用 86
第 4章 汇编语言程序开发工具
4.4.3汇编伪指令
2,初始化常数的伪指令用于为当前的段汇编常数值 。
助记符及语法格式 说 明
.byte value [,…,value] 初始化当前段里的一个或多个连续字。每个值的宽度被限制为 8位。即把 8位的值放入当前段的连续字。
.char value [,?,value] 初始化当前段里的一个或多个连续字。每个值的宽度被限制为 8位。即把 8位的值放入当前段的连续字。
.field value [,size in bits] 初始化一个可变长度的域。将单个值放入当前字的指定位域中。
.float value [,…,value] 初始化一个或多个 IEEE的单精度 (32位 ) 浮点数,即计算浮点数的单精度 (32位 )IEEE浮
.xfloat value [,…,value]
初始化一个或多个 IEEE的单精度 (32位 ) 浮点数,即计算浮点数的单精度 (32位 )IEEE浮点表示,并将它保存在当前段的两个连续的字中。不自动对准最接近的长字边界。
2009年 7月 30日 DSP原理及应用 87
第 4章 汇编语言程序开发工具
2,初始化常数的伪指令助记符及语法格式 说 明
.int value [,…,value] 初始化一个或多个 16位整数。即把 16位的值放到当前段的 连续的字中。
.short value [,…,value] 初始化一个或多个 16位整数。即把 16位的值放到当前段的连续的字中。
.word value [,?,value] 初始化一个或多个 16位整数。即把 16位的值放到当前段的连续的字中。
.double value [,…,value]
初始化一个或多个双精度 (64位 ) 浮点数。
即计算浮点数的单精度 (32位 )浮点表示,
并将它存储在当前段的 2个连续的字中。
该伪指令自动对准长字边界。
.long value [,…,value] 初始化一个或多个 32位整数。即把 32位的值放到当前段的 2个连续的字中。
.string,string [,…,“string”]” 初始化一个或多个字符串。把 8位字符从一个或多个字符串放进当前段。
2009年 7月 30日 DSP原理及应用 88
第 4章 汇编语言程序开发工具
【 例 4.4.3】 比较,byte,.int,.long,.xlong,.float,.xfloat,
.word和,string伪指令 。
源程序:
.byte 0AAh,0BBh
.word 0CCCh
.xlong 0EEEEFFFh
.long 0EEEEFFFFh
.int 0DDDDh
.xfloat 1.99999
.float 1.99999
.string,help”
.byte:将一个或多个 8位值放入当前段的连续字中 。
word 15 0 15 0
0,1 0 0 A A 0 0 B B
.word:将一个或多个 16位值放入当前段的连续字中 。
2 0 C C C
.xlong:将 32位值放入当前段的 2个连续的字中,先存最高有效位 。
3,4 0 E E E E F F F
.long:将 32位值放入当前段的 2个连续的字中,先存最高有效位 。
6,7 E E E E F F F F
.int:将一个或多个 16位值放入当前段的连续的字中 。
8 D D D D
.xfloat:初始化单精度 (32位 ) 浮点数,
并保存在当前段的两个连续的字中 。
9,A 3 F F F F F A C
.float:初始化单精度 (32位 ) 浮点数,
并保存在当前段的两个连续的字中 。
C,D 3 F F F F F A C
.string:将一个或多个字符串中的 8位字符放入 当前段中 。
h e
E,F 0 0 6 8 0 0 6 5
l p
10,11 0 0 6 C 0 0 7 0
2009年 7月 30日 DSP原理及应用 89
第 4章 汇编语言程序开发工具列表文件:
1 000000 00aa,byte 0AAh,0BBh
000001 00bb
2 000002 0ccc,word 0CCCh
3 000003 0eee,xlong 0EEEEFFFh
000004 efff
4 000006 eeee,long 0EEEEFFFFh
000007 ffff
5 000008 dddd,int 0DDDDh
6 000009 3fff,xfloat 1.99999
00000a ffac
7 00000c 3fff,float 1.99999
00000d ffac
8 00000e 0068,string,help”
00000f 0065
000010 006c
000011 0070
.long:自动对准最近长字边界
.xlong:不自动对准长字边界
.float:自动对准最近长字边界
.xfloat:不自动对准长字边界
2009年 7月 30日 DSP原理及应用 90
第 4章 汇编语言程序开发工具
2,初始化常数的伪指令
.field伪指令:
功能,将单个数值放进当前字的指定位域中 。
采用,field伪指令,可以将多个字段或域打包成单个字,直到字被填满为止,汇编器不增加 SPC。
指令格式,,field value [,size in bits]
单个数值当前字的指定位域
2009年 7月 30日 DSP原理及应用 91
第 4章 汇编语言程序开发工具
2,初始化常数的伪指令
.field伪指令的使用 。
源程序:
.field 5,3
.field 9,6
.field 16,5
.field 01234h,20
.field 01234h,32
15141312 1110 9 8 7 6 5 4 3 2 1 0
1 0 1
1 0 1
0 0 1 0 0 1
0 0 1 0 0 1
1 0 0 0 0
1 0 0 0 0
15141312 1110 9 8 7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 1 0 1 0 0
15141312 1110 9 8 7 6 5 4 3 2 1 0
0123h
0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 1
0 0 0 0 1 0 0 1 1 1
4h
0 1 0 0
0 1 0 0
0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 1 0 1 0 0
15141312 1110 9 8 7 6 5 4 3 2 1 0
15141312 1110 9 8 7 6 5 4 3 2 1 0
0 0 0 1 0 0 1 0 0 0 1 1 0 1 0 0
0 0 0 1 0 0 1 0 0 0 1 1 0 1 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
A000h
A480h
A4C0h
0123h
4000h
0000h
1234h
2009年 7月 30日 DSP原理及应用 92
第 4章 汇编语言程序开发工具
【 例 4.4.4】,field伪指令的使用 。
汇编后的列表文件:
4 000000 A000,field 5,3
5 000000 A480,field 9,6
6 000000 A4C0,field 16,5
7 000001 0123,field 01234h,20
000002 4000
8 000003 0000,field 01234h,32
000004 1234
组成一个字,不改变 SPC。
2009年 7月 30日 DSP原理及应用 93
第 4章 汇编语言程序开发工具
4.4.3汇编伪指令
3,对准段程序计数器的伪指令对准段程序计数器的伪指令包括,.align伪指令和,even伪指令 。
助记符及语法格式 说 明
.align [size in words] 用于将段程序计数器 (SPC)对准在 1~ 128字的边界。
.even 用于使 SPC指到下一个字的边界 (偶字边界 )。
2009年 7月 30日 DSP原理及应用 94
第 4章 汇编语言程序开发工具
3,对准段程序计数器的伪指令
(1),align伪指令的操作数必须是在 20~216之间且等于 2的幂 。
例如,操作数为 1时,对准 SPC到字的边界;
操作数为 2时,对准 SPC到长字 /偶字的边界;
操作数为 128时,对准 SPC到页面的边界;
没有操作数时,,align伪指令默认为页面边界 。
(2),even伪指令等效于指定,align伪指令的操作数为 1的情形 。
当,even操作数为 2时,将 SPC对准到下一个长字的边界 。 任何在当前字中没有使用的位都填充 0。
2009年 7月 30日 DSP原理及应用 95
第 4章 汇编语言程序开发工具
3,对准段程序计数器的伪指令
【 例 4.4.4】,align伪指令的使用 。
源程序:
.field 2,3
.field 11,8
.align 2
.string,Errorcnt”
.align
.byte 4; 将数值 2放入字指定域中; 打包组成单字 —— 6400h; 对准长字边界,SPC=02h; 初始化字符串; 对准页边界,SPC=80h; 在当前段中,放入 8位数 04h
2009年 7月 30日 DSP原理及应用 96
第 4章 汇编语言程序开发工具列表文件:
1 000000 4000,field 2,3
2 000000 4160,field 11,8
3,align 2
4 000002 0045,string,Errorcnt”
000003 0072
000004 0072
000005 006f
000006 0072
000007 0063
000008 006e
000009 0074
5,align
6 000080 0004,byte 4
000000SPC 4000
000000SPC 4160
000002SPC 4160
000002SPC 0045
000003SPC 0072
000004SPC 0072
000005SPC 006F
000006SPC 0072
000007SPC 0063
000008SPC 006E
000009SPC 0074
000080SPC 0074
000080SPC 004
2009年 7月 30日 DSP原理及应用 97
第 4章 汇编语言程序开发工具
4.4.3汇编伪指令
4,格式化输出清单文件的伪指令用于格式化输出清单文件 。
助记符及语法格式 说 明
.drnolist 用于抑制某些伪指令在清单文件中的出现。
.drlist 允许,drnolist抑制的伪指令在清单文件中重新出现。
.fclist 允许按源代码在清单文件中列出条件为假的代码块。汇编器默认状态。
.fcnolist 只列出实际汇编的条件为真的代码块。
.length page length 调节清单文件输出页面的长度。可针对不同的输出设备灵活调节输出页面的长度。
.list 允许汇编器将所选择的源语句输出到清单文件。
2009年 7月 30日 DSP原理及应用 98
第 4章 汇编语言程序开发工具
4,格式化输出清单文件的伪指令助记符及语法格式 说 明
.nolist 禁止汇编器将所选择的源语句输出到清单文件。
.mlist 允许列出所有的宏扩展和循环块。
.mnolist 禁止列出所有的宏扩展和循环块。
.option
{B│L│M│R│T│W│X} 用于控制清单文件的某些功能。
.page 把新页列在输出清单文件中。
.sslist 允许列出替代符号扩展。
.ssnolist 禁止列出替代符号扩展。
.title,string” 在每页的顶部打印文件标题。
.width page width 调节清单文件页面的宽度。
2009年 7月 30日 DSP原理及应用 99
第 4章 汇编语言程序开发工具
4.4.3汇编伪指令
5,引用其他文件的伪指令该指令主要为引用其他文件提供信息 。
助记符及语法格式 说 明
.copy [”]filename[”] 通知汇编器开始从其他文件读取源程序语句。
.include [”]filename[”] 通知汇编器开始从其他文件读取源程序语句。
.def symbil [,?,symbil] 识别定义在当前模块中,但可被其他模块使用的符号 。
.global symbil[,?,symbil]
声明当前符号为全局符号 。
对定义了的符号,其作用相当于,def;
对没有定义的符号,其作用相当于,ref。
.ref symbil[,?,symbil] 识别在当前模块中使用的,但在其他模块中定义的符号 。
2009年 7月 30日 DSP原理及应用 100
第 4章 汇编语言程序开发工具
4.4.3汇编伪指令
6,条件汇编伪指令用来通知汇编器按照表达式计算出的结果的真假,决定是否对某段代码进行汇编 。
有两组伪指令用于条件代码块的汇编:
(1),if/.elseif/.else/.endif伪指令用于通知汇编器按照表达式的计算结果,对某段代码块进行条件汇编 。 要求表达式和伪指令必须完全在同一行指定 。
(2),loop/.break/.endloop伪指令用于通知汇编器按照表达式的计算结果重复汇编一个代码块 。 要求表达式和伪指令必须完全在同一行指定 。
2009年 7月 30日 DSP原理及应用 101
第 4章 汇编语言程序开发工具
6,条件汇编伪指令助记符及语法格式 说 明
.if well-defined expression 标记条件块的开始。仅当,if条件为真时,对紧接着的代码块进行汇编。
.elseif well-defined expression 若,if条件为假,而,elseif条件为真时,对紧接着的代码块进行汇编 。
.else well-defined expression 若,if条件为假,对紧接着的代码块进行汇编 。
.endif 标记条件代码块的结束,并终止该条件代码块 。
.loop [well-defined expression] 按照表达式确定的次数进行重复汇编的代码块的开始 。 表达式是循环的次数 。
.break [well-defined expression]
若,break表达式为假,通知汇编器继续重复汇编;而当表达式为真时,跳到紧接着
.endloop后面的代码 。
.endloop 标记代码块的结束 。
2009年 7月 30日 DSP原理及应用 102
第 4章 汇编语言程序开发工具
4.4.3汇编伪指令
7,定义宏的伪指令常用的定义宏的伪指令,
助记符及语法格式 说 明
macname,macro [parameter][,...parameter]
model statements or macro directives
,endm
定义宏
.endm 中止宏
.var sym[,sym2,...,sym] 定义宏替代符号
2009年 7月 30日 DSP原理及应用 103
第 4章 汇编语言程序开发工具
4.4.3汇编伪指令
8,汇编时间符号伪指令用于使符号名与常数值或字符串等价 。
助记符及语法格式 说 明
.asg [”] character string[”],
substitution symbol
把一个字符串赋给一个替代符号。
替代符号也可以重新被定义。
.eval well-defined expresion,
substitution symbol
计算一个表达式,将其结果转换成字符,并将字符串赋给替代符号 。
用于操作计数器 。
.label symbol 定义一个特殊的符号,用来指向在当前段内的装载时间地址 。
symbol,set value 用于给符号赋值 。 符号被存 放 在符号表中,而且不能被重新定义 。
2009年 7月 30日 DSP原理及应用 104
第 4章 汇编语言程序开发工具
8,汇编时间符号伪指令助记符及语法格式 说 明
.struct 设置类似 C语言的结构体。.tag伪指令把结构体赋给一个标号。
.endstruct 结束结构体 。
.union 建立类似 C语言的 union(联合 )定义
.endunion 结束 union(联合 )
.struct/.endstruct伪指令允许将信息组织到结构体中,以便将同类的元素分在一组。然后由汇编器完成结构体成员偏离地址的计算。
.struct/.endstruct伪指令不分配存储器。只是简单地产生一个可重复使用的符号模板。
.tag将结构体与一个标号联系起来,.tag伪指令不分配存储器,且结构体的标记符必须在使用之前先定义好。
2009年 7月 30日 DSP原理及应用 105
第 4章 汇编语言程序开发工具
8,汇编时间符号伪指令
.union/.endunion伪指令通过创建符号模板,提供在相同的存储区域内管理多种不同的数据类型的方法。
.union不分配任何存储器,它允许类型和大小不同的定义临时地存储在相同存储器空间。
.tag伪指令将 union属性与一个标号联系起来,可以定义一个 union并给定一个标记符,以后可用,tag伪指令将它声明为结构体的一个成员。
当 union没有标记符时,它的所有成员都将进入符号表,
每一个成员有唯一的名称。
当 union定义在结构体内时,对这样的 union的引用必须通过包括它的结构体来实现。
2009年 7月 30日 DSP原理及应用 106
第 4章 汇编语言程序开发工具
8,汇编时间符号伪指令
【例 4.4.5】,struct/.endstruct伪指令举例。
1 REAL_REC,struct ; 结构体标记
2 0000 NOM,int ; member1=0
3 0001 DEN,int ; member2=1
4 0002 RRAL_LEN,endstruct ; real_len= 2
5
6 000000 0001- ADD REAL+REAL_REC.DEN,A
7 ; 访问结构体成员
8
9 000000,bss REAL,REAL_LEN
2009年 7月 30日 DSP原理及应用 107
第 4章 汇编语言程序开发工具
8,汇编时间符号伪指令
【例 4.4.6】,union/.endunion伪指令举例。
1,global employid
2 xample,union ; union标记
3 0000 ival,word ; menber1= int
4 0000 fval,float ; menber2= float
5 0000 sval,string ; menber3= string
6 0002 real_len,endunion ; real_len= 2
7
8 000000,bss employid,real_len ; 指定空间
9
10 employid,tag xample ; 声明结构的实例
11 000000 0000- ADD employid.fval,A ; 访问 union成员
2009年 7月 30日 DSP原理及应用 108
第 4章 汇编语言程序开发工具
4.4.3汇编伪指令
9,混合伪指令常用的混合伪指令:助记符及语法格式 说 明
.end 终止汇编,位于程序源程序的最后一行。
.far_mode 通知汇编器调用为远调用 。
.mmregs 为存储器映像寄存器定义符号名 。 使用,mmregs的功能和对所有的存储器映像寄存器执行,set伪指令相同 。
.newblock 用于复位局部标号 。
.version [value] 确定运行指令的处理器,每个 ’ C54x器件都有一个与之对应的值 。
.emsg string 把错误消息送到标准的输出设备 。
.mmsg string 把汇编时间消息送到标准的输出设备 。
.wmsg string 把警告消息送到标准的输出设备 。
2009年 7月 30日 DSP原理及应用 109
第 4章 汇编语言程序开发工具
9,混合伪指令
.newblock伪指令用于复位局部标号 。
局部标号是形式为 $n或 name?的符号 。 当它们出现在标号域时被定义 。 局部标号可用作跳转指令的操作数的临时标号 。
.newblock伪指令通过在它们被使用后将它们复位的方式来限制局部标号的使用范围 。
2009年 7月 30日 DSP原理及应用 110
第 4章 汇编语言程序开发工具
9,混合伪指令有 3个伪指令可以允许用户定义自己的错误和警告消息:
(1),emsg伪指令以和汇编器同样的方式产生错误,增加错误的计数并防止汇编器产生目标文件 。
(2),mmsg伪指令的功能与,emsg和,wmsg伪指令相似,但它不增加错误计数或警告计数 。 也不影响目标文件的产生 。
(3).wmsg伪指令的功能与,emsg伪指令相似,但它增加警告计数,而不增加错误计数 。 它也不影响目标文件的产生 。
2009年 7月 30日 DSP原理及应用 111
第 4章 汇编语言程序开发工具
4.4.4宏定义和宏调用
’C54x汇编器支持宏指令语言。如果程序中有一段程序需要执行多次,就可以把这一段程序定义 (宏定义 )为一条宏指令,然后在需要重复执行这段程序的地方调用这条宏指令 (宏调用 )。利用宏指令,可以使源程序变得简短。
宏的使用分以下 3个步骤:
① 定义宏 在调用宏时,必须首先定义宏;
② 调用宏 在定义宏之后,可在源程序中调用宏;
③ 扩展宏 在源程序调用宏指令时,汇编器将对宏指令进行扩展。
2009年 7月 30日 DSP原理及应用 112
第 4章 汇编语言程序开发工具
4.4.4宏定义和宏调用
1.宏定义在调用宏时,必须首先定义宏。有两种方法定义宏:
① 可在源文件的开始定义宏,或者在,include
或,copy的文件中定义;
② 在宏库中定义。
宏库 ——是由存档器以存档格式产生的文件集。
宏库中的每一成员包含一个与成员对应的宏定义。可通过,mlib指令访问宏库。
2009年 7月 30日 DSP原理及应用 113
第 4章 汇编语言程序开发工具
1.宏定义在调用宏之前,必须先定义宏。可以在源程序的任何位置定义宏,宏定义的所有内容必须包含在同一个文件中。
宏定义可以嵌套,即在一条宏指令中调用其他的宏指令。
2009年 7月 30日 DSP原理及应用 114
第 4章 汇编语言程序开发工具宏定义的格式:
macname,macro [parameter1][,…,parameter n]
宏程序语句 或 宏伪指令
[.mexit]
.endm
macname,宏程序名称,必须将名称放在源程序标号域。
.macro,用来说明该语句为宏定义的第一行伪指令,
必须放在助记符操作码区域 。
parameters,为 任选的替代参数,作为宏指令的操作数。
宏程序语句,每次宏调用时要执行的指令或汇编命令。
宏伪指令,用于控制宏指令展开的命令。
.mexit,相当于一条 跳到,endm语句。
.endm,结束宏定义。
2009年 7月 30日 DSP原理及应用 115
第 4章 汇编语言程序开发工具宏定义的格式:
macname,macro [parameter1][,…,parameter n]
宏程序语句 或 宏伪指令
[.mexit]
.endm
如果希望在宏定义中包含有注释,但又不希望这些注释出现在扩展宏中,可在注释前面加上感叹号,!,。
如果希望这些注释出现在扩展宏中,需在注释前面加上符号,*” 或,;,。
2009年 7月 30日 DSP原理及应用 116
第 4章 汇编语言程序开发工具
4.4.4宏定义和宏调用
2.宏调用在定义宏之后,可在源程序中使用宏名进行宏调用。
宏调用的格式:
[label][:] macname [parameter 1][,…,parameter n]
标号任选项宏指令名位于操作码区任选的替代参数数目应与宏指令定义的相等
2009年 7月 30日 DSP原理及应用 117
第 4章 汇编语言程序开发工具
4.4.4宏定义和宏调用
3.宏扩展若源程序中调用宏指令,则汇编时就将对宏指令进行扩展。
扩展时汇编器先将变量传递给宏参数,按宏定义取代调用宏语句,然后再对源代码进行汇编。
在默认的情况下,扩展宏将出现在清单文件中,
若不需要扩展宏出现在清单文件中,则可通过伪指令,mnolist来实现。
2009年 7月 30日 DSP原理及应用 118
第 4章 汇编语言程序开发工具
4.4.4宏定义和宏调用
3.宏扩展当汇编器遇到宏定义时,将宏名称放进操作码表中,并将重新定义前面已经定义过的与之具有相同名称的宏、库成员、伪指令或指令助记符。
用这种方法可以扩展指令和伪指令的功能以及加入新的指令。
2009年 7月 30日 DSP原理及应用 119
第 4章 汇编语言程序开发工具
4.4.4宏定义和宏调用宏指令与子程序一样,都是重复执行某一段程序,但两者是有区别的,主要区别:
⑴ 宏指令和子程序都可以被多次调用,但是把子程序汇编成目标代码的过程只进行一次,而在用到宏指令的每个地方都要对宏指令中的语句逐条地进行汇编。
⑵ 在调用前,由于子程序不使用参数,故子程序所需要的寄存器等都必须事先设置好;而对于宏指令来说,由于可以使用参数,调用时只要直接代入参数就行了。
2009年 7月 30日 DSP原理及应用 120
第 4章 汇编语言程序开发工具
【 例 4.4.7】 宏定义、宏调用和宏展开举例
1 *
2 * add3
4 *
5 * ADDRP=P1+P2+P3
6
7 add3,macro P1,P2,P3,ADDRP
8
9 LD P1,A
10 ADD P2,A
11 ADD P3,A
12 STL A,ADDRP
13,endm
14
第 7~14行定义宏,add3
4个参数,P1
P2
P3
ADDRP
2009年 7月 30日 DSP原理及应用 121
第 4章 汇编语言程序开发工具
【 例 4.4.7】 宏定义、宏调用和宏展开举例
15
16,global abc,def,ghi,adr
17
18 000000 add3 abc,def,ghi,adr
1
1 000000 1000! LD abc,A
1 000001 0000! ADD def,A
1 000002 0000! ADD ghi,A
1 000003 8000! STL A,adr
第 18行调用宏,add3
所用变量,abc
def
ghi
adr
共 4行扩展宏将变量传递给参数
abc? P1
def? P2
ghi? P3
adr? ADDRP
2009年 7月 30日 DSP原理及应用 122
第 4章 汇编语言程序开发工具
4.5链接器的使用链接器的主要任务是根据链接命令文件 (.cmd),
将一个或多个 COFF目标文件链接起来,生成存储器映像文件 (.map)和可执行的输出文件 (.out)。
在链接过程中,链接器将各个目标文件合并,并完成以下工作:
● 将各个段配置到目标系统的存储器。
● 对各个符号和段进行重新定位,并给它们指定一个最终的地址。
● 解决输入文件之间未定义的外部引用。
2009年 7月 30日 DSP原理及应用 123
第 4章 汇编语言程序开发工具
4.5.1链接器的运行
1.运行链接程序
’C54x链接器的运行命令,
lnk500 [-options] filename 1 … filename n
lnk500,运行链接器命令。
-options,链接命令选项。可以出现在命令行或链接命令文件的任何位置。
filenames,文件名。可以是目标文件、链接命令文件或文件库。所有文件扩展名的默认值为,obj。
2009年 7月 30日 DSP原理及应用 124
第 4章 汇编语言程序开发工具
1.运行链接程序
’C54x链接器的运行,有三种方法,
(1) 键入命令,lnk500
链接器会提示如下信息:
Command files:
Object files [.obj]:
Output Files [a.out]:
Options:
(要求键入一个或多个命令文件 )
(要求键入一个或多个需要链接的目标文件
)(要求键入一个链接器所生成的输出文件名 )
(要求附加一个链接选项 )
2009年 7月 30日 DSP原理及应用 125
第 4章 汇编语言程序开发工具
1.运行链接程序
(2)键入命令:
lnk500 file1.obj file2.obj -o link.out
在命令行中指定选项和文件名。
目标文件,file1.obj,file2.obj
命令选项,-o
输出文件,link.out
将两个目标文件进行链接,生成一个可执行的输出文件 link.out。
2009年 7月 30日 DSP原理及应用 126
第 4章 汇编语言程序开发工具
1.运行链接程序
(3)键入命令:
lnk500 linker.cmd
linker.cmd,链接命令文件。
在执行上述命令之前,需将链接的目标文件、链接命令选项以及存储器配置要求等编写到 链接命令文件 linker.cmd中。
例如:希望完成第二种命令的链接,在链接命令文件 中,应包含如下内容:
file1.obj
file2.obj
-o link.out
2009年 7月 30日 DSP原理及应用 127
第 4章 汇编语言程序开发工具
4.5.1链接器的运行
2.链接命令选项在链接时,连接器通过链接命令选项控制链接操作。
链接命令选项可以放在命令行或命令文件中,
所有选项前面必须加一短划线,-” 。除 -l和 -i选项外,其他选项的先后顺序并不重要。
选项之间可以用空格分开。最常用选项为 -m
和 -o,分别表示输出的地址分配表映像文件名和输出可执行文件名。
2009年 7月 30日 DSP原理及应用 128
第 4章 汇编语言程序开发工具
2.链接命令选项链接命令选项选 项 含 义
-a
生成一个绝对地址的、可执行的输出模块。所建立的绝对地址输出文件中不包含重新定位信息。如果既不用 -a
选项,也不用 -r选项,链接器就像规定 -a选项那样处理。
-ar
生成一个可重新定位、可执行的目标模块。这里采用了
-a和 -r两个选项 (可以分开写成 -a -r,也可以连在一起写作 -ar),与 -a选项相比,-ar选项还在输出文件中保留有重新定位信息。
-e global_symbol
定义一个全局符号,这个符号所对应的程序存储器地址,
就是使用开发工具调试这个链接后的可执行文件时程序开始执行时的地址 (称为入口地址 )。当加载器将一个程序加载到目标存储器时,程序计数器 (PC)被初始化到入口地址,然后从这个地址开始执行程序。
2009年 7月 30日 DSP原理及应用 129
第 4章 汇编语言程序开发工具
2.链接命令选项链接命令选项选 项 含 义
-f fill_vale 对输出模块各段之间的空单元设置一个 16位数值(fill_value),如果不用 -f选项,则这些空单元都置 0。
-i dir 更改搜索文档库算法,先到 dir( 目录)中搜索。此选项必须出现在 -l选项之前。
-l filename 命名一个文档库文件作为链接器的输入文件; filename为文档库的某个文件名。此选项必须出现在 -i选项之后。
-m filename
生成一个,map映像文件,filename是映像文件的文件名。
.map文件中说明存储器配置、输入、输出段布局以及外部符号重定位之后的地址等。
-o filename 对可执行输出模块命名。如果默认,则此文件名为 a.out。
-r 生成一个可重新定位的输出模块。当利用 -r选项且不用-a选项时,链接器生成一个不可执行的文件。
2009年 7月 30日 DSP原理及应用 130
第 4章 汇编语言程序开发工具
4.5.2 链接器命令文件的编写与使用链接命令文件用来为链接器提供链接信息,可将链接操作所需的信息放在一个文件中,这在多次使用同样的链接信息时,可以方便地调用。
在链接命令文件中,可使用 MEMORY和 SECTIONS伪指令,为实际应用指定存储器结构和地址的映射。
MEMORY——用来指定目标存储器结构。
SECTIONS——用来控制段的构成与地址分配。
2009年 7月 30日 DSP原理及应用 131
第 4章 汇编语言程序开发工具
4.5.2 链接器命令文件的编写与使用链接 命令文件为 ASCⅡ 文件,可包含以下内容:
(1)输入文件名,用来指定目标文件、存档库或其他命令文件。
(2)链接器选项,它们在命令文件中的使用方法与在命令行中相同。
(3)MEMORY和 SECTIONS链接伪指令,用来指定目标存储器结构和地址分配。
(4)赋值说明,用于给全局符号定义和赋值。
2009年 7月 30日 DSP原理及应用 132
第 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 prog.out /*指定输出文件的选项 */
2009年 7月 30日 DSP原理及应用 133
第 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,>ROM
.bss,>RAM
}
2009年 7月 30日 DSP原理及应用 134
第 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
2009年 7月 30日 DSP原理及应用 135
第 4章 汇编语言程序开发工具
4.5.3 目标库目标库是用完全的目标文件作为成员的存档文件。
通常是将一组有关的模块组合在一起而形成的库。
当指定目标库作为链接器的输入时,链接器将在库中搜索没有分辨的外部引用,并包括库中已定义有这些引用的任何成员。
使用目标库可减少链接的时间和可执行模块的长度。可利用存档器建立主要的库。
2009年 7月 30日 DSP原理及应用 136
第 4章 汇编语言程序开发工具
4.5.3 目标库假设:
输入文件 f1.obj和 f2.obj均引用了名为 clrscr的外部函数;
输入文件 f1.obj引用了符号 origin;
输入文件 f2.obj引用了符号 fillclr;
库 libc.libc的成员 Member 0包含了 origin的定义;
库 libc.liba的成员 Member 3包含了 fillclr的定义;
两个库的成员 Member 1都定义了 clrscr。
2009年 7月 30日 DSP原理及应用 137
第 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的引用
2009年 7月 30日 DSP原理及应用 138
第 4章 汇编语言程序开发工具
4.5.3 目标库若输入命令:
lnk500 f1.obj f2.obj libc.lib liba.lib
则所有对 clrscr的引用,都由库 libc.libc的成员
Member 1满足。
2009年 7月 30日 DSP原理及应用 139
第 4章 汇编语言程序开发工具
4.5.3 目标库当链接文件没有引用定义在库中的符号时,可使用 -u选择项,强迫链接器包括库的成员。此时,
输入命令:
lnk500 -u rout1 libc.lib
则 在链接器全局符号表中,产生一个没有定义的符号 rout1。
若库 libc.lib的任何成员定义了 rout1,则链接器将包括这些成员。
2009年 7月 30日 DSP原理及应用 140
第 4章 汇编语言程序开发工具
4.5.4 MEMORY指令
MEMORY指令用来规定目标存储器的结构。
在实际的应用中,目标系统所配置的存储器是各不相同的,通过 MEMORY指令,可以进行各种各样的存储器配置。
ME ORY指令的句法:
MEMORY
{
PAGE0,name 1[(attr)],origin=constant,length=constant;
PAGEn,name n[(attr)],origin=constant,length=constant;
}
指令字存储区间说明语句书写方式,① 已大写 MEMORY指令字开始;
② 由大括号括起来的存储器区间说明。
存储区间,存储页面 区间名称 区间属性 起始地址 区间长度
2009年 7月 30日 DSP原理及应用 141
第 4章 汇编语言程序开发工具
4.5.4 MEMORY指令存储区间说明语句:
PAGE,指定存储器空间页面,最多为 255页,
取决于目标存储器的配置。
每一个 PAGE代表一个完全独立的地址空间。
通常,PAGE 0用于程序存储器;
PAGE 1用于数据存储器。
若没有规定 PAGE,则链接器默认为 PAGE 0。
2009年 7月 30日 DSP原理及应用 142
第 4章 汇编语言程序开发工具
4.5.4 MEMORY指令存储区间说明语句:
name,存储器区间名称。可由用字母,$,.,_
等组成。
存储器区间为内部记号,因此不需要保留在输出文件或者符号表中。
不同 PAGE上的存储器区间可以取相同的名字,
但在同一 PAGE内的名字不能相同,且不许重叠配置。
2009年 7月 30日 DSP原理及应用 143
第 4章 汇编语言程序开发工具
4.5.4 MEMORY指令存储区间说明语句:
attr,为任选项,用来为命名的存储器区间规定 1~4个属性。
当对输出段定位时,可利用属性限制输出段分配到一定的存储区间。
属性选项共有 4项:
R 规定可以对存储器执行读操作。
W 规定可以对存储器执行写操作。
X 规定存储器可以装入可执行的程序代码。
I 规定可以对存储器进行初始化。
若未选属性,可将输出段不受限制地定位到任何一个存储器的位置。
任何一个没有规定属性的存储器 (包括所有默认方式的存储器 )都有全部 4项属性。
2009年 7月 30日 DSP原理及应用 144
第 4章 汇编语言程序开发工具
4.5.4 MEMORY指令存储区间说明语句:
origin,用来指 定存储区间的起始地址,可简写为 org或 o。其值以字为单位,可以用十进制、八进制或十六进制数表示。
Length,用来 指定存储器空间的长度,可简写为 len或 l,其值以字为单位,可以用十进制、八进制或十六进制数表示。
2009年 7月 30日 DSP原理及应用 145
第 4章 汇编语言程序开发工具
4.5.4 MEMORY指令存储区间说明语句:
fill,为任选项。用来为没有定位输出段的存储器空单元充填一个数,键入 fill或 f均可。
该值是 2个字节的整型常数,可以是十进制数、八进制数或十六制数 。
2009年 7月 30日 DSP原理及应用 146
第 4章 汇编语言程序开发工具
【 例 4.5.2】 用 MEMORY伪指令编写连接命令文件。要求:
程序存储器,4K字 ROM,起始地址为 C00h,取名为 ROM。
数据存储器,32字 RAM,起始地址为 60h,取名为 SCR。
512字 RAM,起始地址为 80h,取名为 CHIP。
file1.obj fiel2.obj
-o Prog.out
MEMORY
{
PAGE 0,ROM,origin=C00h,length=1000h
PAGE 1,SCR,origin=60h,length=20h
CHIP,origin=80h,length=200h
}
两个输入文件链接命令选项指令字页面名称 区间名称起始地址区间长度
2009年 7月 30日 DSP原理及应用 147
第 4章 汇编语言程序开发工具
【 例 4.5.2】 用 MEMORY伪指令编写连接命令文件。
file1.obj fiel2.obj
-o Prog.out
MEMORY
{
PAGE 0,ROM,org=C00h,len=1000h
PAGE 1,SCR,org=60h,len=20h
CHIP,org=80h,len=200h
}
:,
程序存储器
00000h
0FFFFh
00C00h
1000h
01C00h
ROM
:,
数据存储器
00000h
0FFFFh
00060h
0007Fh20h SCR

00080h
200h
0027Fh
CHIP
2009年 7月 30日 DSP原理及应用 148
第 4章 汇编语言程序开发工具
4.5.5SECTIONS指令用来控制段的构成与地址分配。
指令功能:
① 说明如何将输入段组合成输出段;
② 在可执行程序中定义输出段;
③ 规定输出段在存储器中的存放位置;
④ 允许重新命名输出段。
1.SECTIONS指令语法
2009年 7月 30日 DSP原理及应用 149
第 4章 汇编语言程序开发工具
SECTIONS指令的句法:
SECTIONS
{
name,[property,property,property,… ]
name,[property,property,property,… ]
name,[property,property,property,… ]
}
指令字输出段说明语句段名,定义输出段的名称。
属性,定义该段的内容和存储器的分配。
段名
1.SECTIONS指令语法属性 属性 属性
2009年 7月 30日 DSP原理及应用 150
第 4章 汇编语言程序开发工具
1.SECTIONS指令语法段属性用来定义输出段的内容和存储地址的分配。包括的内容如下:
① 装入存储器分配
② 运行存储器分配
③ 输入段
④ 段的类型
⑤ 充填值
2009年 7月 30日 DSP原理及应用 151
第 4章 汇编语言程序开发工具
1.SECTIONS指令语法
① 装入存储器分配用于定义段装入时的存储器地址。
语法格式,load=allocation
或 allocation
或 > allocation
allocation,关于段地址的说明,即给段分配存储单元。
2009年 7月 30日 DSP原理及应用 152
第 4章 汇编语言程序开发工具
1.SECTIONS指令语法
① 装入存储器分配例如:
.text,load=0x1000
.text,load>ROM
.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的幂次 )。
2009年 7月 30日 DSP原理及应用 153
第 4章 汇编语言程序开发工具
1.SECTIONS指令语法
① 装入存储器分配若用到一个以上参数,可以将它们排成一行。
例如:
.text,>ROM (align( 16) PAGE (2 )) 。
2009年 7月 30日 DSP原理及应用 154
第 4章 汇编语言程序开发工具
1.SECTIONS指令语法
② 运行存储器分配用于定义段运行时的存储器地址。
语法格式,run=allocation
或 run> allocation
2009年 7月 30日 DSP原理及应用 155
第 4章 汇编语言程序开发工具
1.SECTIONS指令语法链接器为段在目标存储器中分配两个地址:
加载的地址 ——由装入存储器分配完成执行程序的地址 ——由运行存储器分配完成通常,这两个地址是相同的。
若要想把程序的加载区分开,先将程序加载到
ROM,然后在 RAM中运行,则用 SECTIONS命令让链接器对这个段定位两次即可。
例如:
.fir,load=ROM,run=RAM
2009年 7月 30日 DSP原理及应用 156
第 4章 汇编语言程序开发工具
1.SECTIONS指令语法
③ 输入段用于定义组成输出段的输入段。
语法格式,{input_sections}
大多数情况下,在 SECTIONS命令中是不列出每个输入文件的输入段的段名。
例如:
SECTIONS
{
.text:
.data:
.bss
}
链接时:在输入文件中的所有,text段链接成,text输出段所有,data段链接成,data输出段所有,bss段链接成,bss输出段
2009年 7月 30日 DSP原理及应用 157
第 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文件中的,text 段和 sec2段 */
}
}
2009年 7月 30日 DSP原理及应用 158
第 4章 汇编语言程序开发工具
1.SECTIONS指令语法
④ 段的类型用于为输出段定义特殊形式的标记 。
语法格式,type=COPY
或 type=DSECT
或 type=NOLOAD
⑤ 充填值用于对未初始化空单元定义一个数值。
语法格式,fill=value
或 name,… {… }=value
2009年 7月 30日 DSP原理及应用 159
第 4章 汇编语言程序开发工具
4.5.5SECTIONS指令
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
}
两个输入文件链接命令选项指令字输出段说明语句
2009年 7月 30日 DSP原理及应用 160
第 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
}
输出段 加载地址 运行地址
.text ROM RAM 800h
.con ROM
.bss RAM
.vec ROM FF80
.data RAM 16位边界
2009年 7月 30日 DSP原理及应用 161
第 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
}
输出段 加载地址 运行地址
.text ROM RAM 800h
.con ROM
.bss RAM
.vec ROM FF80
.data RAM 16位边界
ROM RAM
00h
.text
.con
.bss
.vec
.data
FF80h
运行时
800h
.text
2009年 7月 30日 DSP原理及应用 162
第 4章 汇编语言程序开发工具
4.5.5SECTIONS指令
3.MEMORY和 SECTIONS命令的默认 使用如果没有利用 MEMORY和 SECTIONS命令,链接器就按默认算法来定位输出段。
将所有的,text输入段链接成一个,text输出段,
并配置到 PAGE 0上的存储器;
将 所有的,data输入段组合成,data输出段,定位到 PAGE0上的存储器;
2009年 7月 30日 DSP原理及应用 163
第 4章 汇编语言程序开发工具
3.MEMORY和 SECTIONS命令的默认 使用所有的,bss输入段则组合成一个,bss输出段,并由链接器定位到配置为 PAGE 1上的存储器。
如果输入文件中包含有已初始化的命名段,则链接器将它们定位到程序存储器,紧随,data段之后。
如果输入文件中包括有未初始化的命名段,则链接器将它们定位到数据存储器,并紧随,bss段之后。
2009年 7月 30日 DSP原理及应用 164
第 4章 汇编语言程序开发工具
3.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
}
2009年 7月 30日 DSP原理及应用 165
第 4章 汇编语言程序开发工具
4.5.6多个文件的链接实例下面以 example.asm源程序为例,将复位向量列为一个单独的文件,对两个目标文件进行链接。
(1) 编写复位向量文件 vectors.asm
文件清单:
.title,vectors.asm”
.ref start
.sect,.vectors”
B start
.end
2009年 7月 30日 DSP原理及应用 166
第 4章 汇编语言程序开发工具
4.5.6多个文件的链接实例
(2)编写源程序文件清单:
.title,example.asm”
.mmregs
stack,usect,STACK”,10h ; 为堆栈指定空间
.bss a,4 ; 为变量分配 9个字的空间
.bss x,4
.bss y,1
.def start
.data
table,.word 1,2,3,4 ; 变量初始化
.word 8,6,4,2
.text
2009年 7月 30日 DSP原理及应用 167
第 4章 汇编语言程序开发工具
(2)编写源程序文件清单:
start,STM # 0,SWWSR ; 插入 0个等待状态
STM # STACK + 10h,SP ; 设置堆栈指针
STM # a,AR1 ; AR1指向 a
RPT # 7 ; 移动 8个数据
MVPD table,*AR1+ ; 从程序存储器到数据存储器
CALL SUM ; 调用 SUM子程序
end,B end
SUM,STM # a,AR3 ; 子程序执行
STM # x,AR4
RPTZ A,# 3
MAC *AR3+,*AR4+,A
STL A,@y
RET
.end
2009年 7月 30日 DSP原理及应用 168
第 4章 汇编语言程序开发工具
(3) 对源文件汇编
(4) 编写链接命令文件编写的命令文件用来链接两个目标文件 (输入文件 ),生成一个映像文件 example.map和一个可执行的输出文件 example.out。 标号 start是程序的入口。
假设目标存储器的配置如下:
程序存储器 EPROM E000h~FFFFh(片外 )
数据存储器 SPRAM 0060h~007Fh(片内 )
DARAM 0080h~017Fh(片内 )
由汇编器分别对两个源文件进行汇编,生成目标文件 example.obj和 vectors.obj。
2009年 7月 30日 DSP原理及应用 169
第 4章 汇编语言程序开发工具
(4) 编写链接命令文件命令文件清单:
vectors.obj
example.obj
-o example.out
-m example.map
-e start
MEMORY
{
PAGE 0,EPROM,org=0E000h,len=100h
VECS,org=0FF80h,len=04h
PAGE 1,SPRAM,org=0060h,len=20h
DARAM,org=0080h,len=100h
}
2009年 7月 30日 DSP原理及应用 170
第 4章 汇编语言程序开发工具
(4) 编写链接命令文件命令文件清单:
SECTIONS
{
.text,>EPROM PAGE 0
.data,>EPROM PAGE 0
.bss,>SPRAM PAGE 1
STACK,>DARAM PAGE 1
.vectors,>VECS PAGE 0
}
2009年 7月 30日 DSP原理及应用 171
第 4章 汇编语言程序开发工具
(4) 编写链接命令文件程序存储器配置了一个空间 VECS,它的起始地址
0ff80h,长度为 04h,并将复位向量段,vectors放在
VECS空间。
当 ’ C54x复位后,首先进入 0ff80h,再从 0ff80h
复位向量处跳转到主程序。
在命令文件中,有一条命令 -e start,是软件仿真器的入口地址命令,目的是在软件仿真时,屏幕从
start语句标号处显示程序清单,且 PC也指向 start位置 (0e000h)。
2009年 7月 30日 DSP原理及应用 172
第 4章 汇编语言程序开发工具
(5) 链接经过链接器链接后,生成一个可执行的输出文件
example.out和映像文件 example.map。
映像文件清单:
OUTPUT FILE NAME,<example.out>
ENTRY POINT SYMBOL:,start” address,0000e000
MEMORY CONFIGURATION
name origin length attributes fill
——— ——— ———— ————— ———
PAGE0,EPROM 0000e000 000000100 RWIX
VECS 0000FF80 000000004 RWIX
PAGE1,SPRAM 00000060 000000020 RWIX
DARAM 00000080 000000100 RWIX
2009年 7月 30日 DSP原理及应用 173
第 4章 汇编语言程序开发工具
(5) 链接映像文件清单:
SECTION ALLOCATION MAP
output attributes/
section page origin length input sections
——— —— ———— ———— —————————
.text 0 0000e000 00000016
0000e000 00000000 vectors.obj(.text)
0000e000 00000016 example.obj(.text)
.data 0 0000e016 00000008
0000e016 00000000 vectors.obj(.data)
0000e016 00000008 example.obj(.data)
2009年 7月 30日 DSP原理及应用 174
第 4章 汇编语言程序开发工具
(5) 链接映像文件清单:
.bss 1 00000060 00000009 UNINITIALIZED
00000060 00000000 vectors.obj(.bss)
00000060 00000009 example.obj(.bss)
STACK 1 00000080 00000010 UNINITIALIZED
00000080 00000010 example.obj(STACK)
.vectors 0 0000ff80 00000002
0000ff80 00000002 vectors.obj(.vectors)
.xref 0 00000000 0000008c COPY SECTION
00000000 00000016 vectors.obj(.xref)
00000016 00000076 example.obj(.xref)
2009年 7月 30日 DSP原理及应用 175
第 4章 汇编语言程序开发工具
(5) 链接映像文件清单:
GLOBAL SYMBOLS
address name address name
———— —— ———— ———
00000060,bss 00000060,bss
0000e016,data 00000069 end
0000e000,text 0000e000,start
0000e01e edata 0000e000,text
00000069 end 0000e016 etext
0000e016 etext 0000e016,data
0000e000 start 0000e01e,edata
[7 symbols]
2009年 7月 30日 DSP原理及应用 176
第 4章 汇编语言程序开发工具
(5) 链接将可执行输出文件 example.out装入目标系统后就可以运行了。
系统复位后,PC首先指向复位向量地址 0FF80h。
在这个地址上,有一条 B start指令,程序马上跳转到 start语句标号,从程序起始地址 0e000h开始执行主程序。