2010年 5月 18日 DSP原理及应用 1
第 4章 汇编语言程序开发工具
内容提要
可编程 DSP芯片开发需要一套完整的软、硬件开
发工具。通常可分成代码生成工具和代码调试工具两
大类。
代码生成工具是指将高级语言或汇编语言编写的
DSP程序转换成可执行的 DSP芯片目标代码的工具程
序,主要包括汇编器、链接器和 C编译器以及一些辅
助工具程序等。
代码调试工具包括 C/汇编语言源码调试器、仿真
器等。
本章主要介绍代码生成工具,包括 ’C54x软件开
发流程、汇编语言程序的编写、编辑、汇编和链接过
程,COFF段的一般概念、汇编器和链接器处理段的
方法以及程序的重定位等。
2010年 5月 18日 DSP原理及应用 2
第 4章 汇编语言程序开发工具
4.1 TMS320C54x软件开发过程
4.2汇编语言程序的编辑、汇编和链接过程
4.3 COFF的一般概念
4.4源程序的汇编
4.5链接器的使用
2010年 5月 18日 DSP原理及应用 3
第 4章 汇编语言程序开发工具
4.1 TMS320C54x软件开发过程
’ C54x的应用软件开发主要完成以下工作:
(1)选择编程语言编写源程序
’ C54x提供 2种编程语言,即汇编语言和 C/C++语言。
对于完成一般功能的代码,这两种语言都可使用,但对
于一些运算量很大的关键代码,最好采用汇编语言来完成,
以提高程序的运算效率。
(2)选择开发工具和环境
’ C54x提供了两种开发环境。即非集成开发环境和集成
开发环境 CCS。
2010年 5月 18日 DSP原理及应用 4
第 4章 汇编语言程序开发工具
4.1 TMS320C54x软件开发过程
1.’C54x应用软件开发流程
’C54x应用软件的开发可在 TI公司提供的开发环境中进行,
用户可以用 C/C++语言或汇编语言编写源文件,经 C编译器、
汇编器生成 COFF格式的目标文件,再用链接器进行链接,生
成在 ’ C54x上可执行的目标代码,然后利用调试工具对可执
行的目标代码进行仿真和调试。
当调试完成后,通过 Hex代码转换工具,将调试后的可执
行目标代码转换成 EPROM编程器能接受的代码,并将该代码固
化到 EPROM中或加载到用户的应用系统中,以便 DSP目标系统
脱离计算机单独运行。
2010年 5月 18日 DSP原理及应用 5
第 4章 汇编语言程序开发工具
1.’C54x应用软件开发流程
开发过程的目的是产生一个可以由 ’ C54x目标系
统执行的模块。
C源文件
C编译器
汇编
源文件汇编器
汇编
源文件
COFF
目标 文件
链接器
可执行的
COFF文件
宏 源文件
存档 器
宏库
存档器
目标
文件库
建库工具
运行时
支持库
EPROM
编程器 交叉引用列表器
调试工具
TMS320C54x
绝对地址
列表器
HEX代码
转换工具
2010年 5月 18日 DSP原理及应用 6
第 4章 汇编语言程序开发工具
2.’C54x的开发工具
TI公司提供的 DSP开发环境和工具主要包括以下
三个部分:
? 代码生成工具
? 代码调试工具
? 实时操作系统
2010年 5月 18日 DSP原理及应用 7
第 4章 汇编语言程序开发工具
2.’C54x的开发工具
(1)代码生成工具:
? C编译器, 用来将 C/C++语言源程序自动编译为
’ C54x的汇编语言源程序。
? 汇编器, 用来将汇编语言源文件汇编成机器语
言 COFF目标文件。
? 链接器, 将汇编生成的、可重新定位的 COFF目
标模块组合成一个可执行的 COFF目标模块。
? 文档管理器, 允许用户将一组文件(源文件或
目标文件)集中为一个文档文件库。
2010年 5月 18日 DSP原理及应用 8
第 4章 汇编语言程序开发工具
2.’C54x的开发工具
? 助记符指令 —代数式指令翻译器, 用来将包含
助记符指令的汇编语言源文件转换成包含代数式指令
的汇编语言源文件。
? 建库实用程序, 用来建立用户自己使用的、并
用 C/C++语言编写的支持运行的库函数。
? 十六进制转换程序, 可以很方便地将 COFF目标
文件转换成 TI,Intel,Motorola等公司的目标文件
格式。
(1)代码生成工具:
2010年 5月 18日 DSP原理及应用 9
第 4章 汇编语言程序开发工具
2.’C54x的开发工具
(1)代码生成工具:
? 绝对制表程序, 将链接后的目标文件作为输入,
生成,abs输出文件。
? 交叉引用制表程序, 利用目标文件生成一个交
叉引用清单,列出链接的源文件中的符号以及它们的
定义和引用情况。
2010年 5月 18日 DSP原理及应用 10
第 4章 汇编语言程序开发工具
2.’C54x的开发工具
(2)代码调试工具:
? C/汇编语言源码调试器,与软件仿真器、评
价模块、软件开发系统、软件仿真器等配合使用。
? 软件仿真器,是一种模拟 DSP芯片各种功能并
在非实时条件下进行软件调试的调试工具,它不需
目标硬件支持,只需在计算机上运行。
? 初学者工具 DSK,是 TI公司提供给初学者进行
DSP编程练习的一套廉价的实时软件调试工具。
2010年 5月 18日 DSP原理及应用 11
第 4章 汇编语言程序开发工具
2.’C54x的开发工具
(2)代码调试工具:
? 软件开发系统 SWDS,是一块 PC插卡,可提供
低成本的评价和实时软件开发,还可用来进行软件
调试,程序可在 DSP芯片上实时运行。
? 可扩展的开发系统仿真器 (XDS510),可用来
进行系统级的集成调试,是进行 DSP芯片软硬件开发
的最佳工具。
? 评价模块 EVM板,是一种低成本的开发板,可
进行 DSP芯片评价、性能评估和有限的系统调试。
2010年 5月 18日 DSP原理及应用 12
第 4章 汇编语言程序开发工具
4.2 汇编语言程序的编辑、汇编和链接过程
汇编语言源程序可以在任何一种文本编辑器中
进行。如笔记本,WORD,EDIT,TC等。
当汇编语言源程序编写完成后,还必须经过汇
编和链接后才能运行。
2010年 5月 18日 DSP原理及应用 13
第 4章 汇编语言程序开发工具
4.2 汇编语言程序的编辑、汇编和链接过程
示意图
汇编器 调试程序链接器文本编辑器
.asm
源文件
.obj
目标文件
.out
输出文件
,cmd
链接命
令文件
,lst
列表文件
,map
存储器
映像文件
十六进制
转换程序
HEX500
- o
- m- l
2010年 5月 18日 DSP原理及应用 14
第 4章 汇编语言程序开发工具
4.2 汇编语言程序的编辑、汇编和链接过程
1.编辑
利用各种文本编辑器,如笔记本,WORD,EDIT
和 TC等,可编写汇编语言源程序。
2.汇编
当汇编语言源程序编写好以后,可利用 ’ C54x
的汇编器 ASM500,对一个或多个源程序分别进行汇
编,并生成列表文件 (.lst)和目标文件 (.obj)。
2010年 5月 18日 DSP原理及应用 15
第 4章 汇编语言程序开发工具
4.2 汇编语言程序的编辑、汇编和链接过程
2.汇编
常用的汇编命令:
asm500 %1 - s - 1 - x
调用汇编器命令
源文件名
将程序所有定义的符号放
在目标文件的符号表中
生成一个
列表文件,lst
生成一个
交叉汇编表
2010年 5月 18日 DSP原理及应用 16
第 4章 汇编语言程序开发工具
4.2 汇编语言程序的编辑、汇编和链接过程
3.链接
所谓链接,就是利用 ’ C54x的链接器 LNK500,
根据链接器命令文件 (.cmd)对已汇编过的一个或多
个目标文件 (.obj)进行链接,生成输出文件 (.out)
和存储器映像文件 (.map) 。
常用的汇编器命令:
lnk500 %1.cmd
lnk500,调用链接器命令%1.cmd 链接命令文件名,该文件须 指明 目标文件、
输入文件、输出文件,链接选项和存储器配置要求等。
2010年 5月 18日 DSP原理及应用 17
第 4章 汇编语言程序开发工具
4.3COFF的一般概念
汇编器和链接器生成的目标文件,是一个可以
由 ’ C54x器件执行的文件。这些目标文件的格式称
之为公共目标文件格式 (COFF)。
在编写汇编语言程序时,COFF采用代码段和数
据段的形式,以便于模块化的编程,使编程和管理变
得更加方便。
这些代码段和数据段简称为段。汇编器和链接
器提供一些伪指令来建立和管理各种各样的段。
2010年 5月 18日 DSP原理及应用 18
第 4章 汇编语言程序开发工具
4.3COFF的一般概念
4.3.1COFF文件的基本单元
COFF文件有 3种类型,COFF0,COFF1,COFF2。
每种类型的 COFF文件,其标题格式都有所不同,
但数据部分是相同的。
链接器能够读 /写所有类型的 COFF文件,默认时
链接器生成的是 COFF2文件,采用 -vn链接选项可以选
择不同类型的 COFF文件。
’C54x汇编器和 C编译器产生的是 COFF2文件。
2010年 5月 18日 DSP原理及应用 19
第 4章 汇编语言程序开发工具
4.3.1COFF文件的基本单元
1.段 (sections)
是 COFF文件中最重要的概念。每个目标文件都分
成若干段。
段 ——是存储器中占据相邻空间的代码或数据块。
一个目标文件中的每个段都是分开的和各不相同的。
COFF目标文件都包含以下 3种形式的段:
.text段 (文本段 ),通常包含可执行代码;
.data段 (数据段 ),通常包含初始化数据;
.bss段 (保留空间段 ),通常为未初始化变量保留存储空间 。
2010年 5月 18日 DSP原理及应用 20
第 4章 汇编语言程序开发工具
4.3.1COFF文件的基本单元
2.段的基本类型
COFF目标文件中的段有两种基本类型。
? 初始化段
? 未 初始化段
(1) 初始化段
初始化段中包含有数据或程序代码。主要有:
.text段 ——已初始化段;
.data段 ——已初始化段;
.sect段 ——已初始化段,由汇编器伪指令建立
的自定义段。
2010年 5月 18日 DSP原理及应用 21
第 4章 汇编语言程序开发工具
4.3.1COFF文件的基本单元
2.段的基本类型
COFF目标文件中的段有两种基本类型。
(2) 未初始化段
在存储空间中,为未初始化数据保留存储空间。
它包括:
.bss段 ——未初始化段;
.usect段 ——未初始化段,由汇编命令建立的命
名段(自定义段)。
2010年 5月 18日 DSP原理及应用 22
第 4章 汇编语言程序开发工具
4.3.1COFF文件的基本单元
3.段与目标存储器的对应关系
汇编器的任务,在汇编过程中,根据汇编命令用
适当的段将各部分程序代码和数据连在一起,构成目
标文件。
链接器的任务,就是分配存储单元,将目标文件
中的段重新定位到目标系统的存储器中,这一过程称
为定位或分配 。
2010年 5月 18日 DSP原理及应用 23
第 4章 汇编语言程序开发工具
3.段与目标存储器的对应关系
目标文件中的段与目标存储器之间的关系
目标文件 目标存储器
.bss
.data
.text
RAM
E2PROM
ROM
2010年 5月 18日 DSP原理及应用 24
第 4章 汇编语言程序开发工具
4.3.2汇编器对段的处理
汇编器对段的处理是通过段伪指令来区别各个段
的, 并将段名相同的语句汇编在一起。
汇编器有 5条伪指令可识别汇编语言程序的各个
部分:
●,bss
●,usect
●,text
●,data
●,sect
——定义未初始化段
——定义未初始化段
——定义已初始化段
——定义已初始化段
——定义已初始化段
2010年 5月 18日 DSP原理及应用 25
第 4章 汇编语言程序开发工具
4.3.2汇编器对段的处理
未初始化段就是在 ’ C54x存储器中保留空间,
通常它们被定位在 RAM区。在目标文件中,这些段中
没有确切的内容。
由这些段定义的空间仅作为临时存储空间,在
程序运行时,可以利用这些存储空间存放变量。
未初始化段分为默认的和命名的两种,分别由
汇编器伪指令,bss和,usect产生。
1.未初始化段
2010年 5月 18日 DSP原理及应用 26
第 4章 汇编语言程序开发工具
(1),bss伪指令
1.未初始化段
用于 在 bss段中保留若干个空间。
格式,.bss 符号, 字数
符号 ——对应于保留的存储空间第一个字的变量名称。
可以让其他段引用, 也可以用,global命令定义为全
局符号 。
字数 ——表示在 bss段或标有名字的段中保留若干个存储单元。
每调用一次,bss伪指令,汇编器在相应的段保留
更多的空间。
2010年 5月 18日 DSP原理及应用 27
第 4章 汇编语言程序开发工具
1.未初始化段
(2),usect伪指令
用于为指定的命名段保留若干个空间。
格式,符号,usect, 段名,, 字数
段名 ——程序员为未初始化的命名段定义的名字。
每调用一次,usect伪指令,汇编器在指定的命名
段保留更多的空间。
2010年 5月 18日 DSP原理及应用 28
第 4章 汇编语言程序开发工具
4.3.2汇编器对段的处理
已初始化段中包含有可执行代码或初始化数据。
这些段中的内容都在目标文件中,当加载程序时
再放到 ’ C54x的存储器中。每个已初始化段都是可以
重新定位的,并且可以引用其他段中所定义的符号。
链接器在链接时会自动地处理段间的相互引用。
已初始化段由,text,.data和,sect三个伪指令
建立。
2.已初始化段
2010年 5月 18日 DSP原理及应用 29
第 4章 汇编语言程序开发工具
已初始化命令的句法:
2.已初始化段
.text [段起点 ]
.data [段起点 ]
.sect,段名, [,段起点 ]
段起点 ——是任选项。
若选用,它为段程序计数器 SPC定义一个起始值。
若默认,则 SPC从 0开始。
2010年 5月 18日 DSP原理及应用 30
第 4章 汇编语言程序开发工具
4.3.2汇编器对段的处理
当汇编器遇到,text或,data或,sect命令时,将
停止对当前段的汇编 (相当于一条结束当前段汇编的
命令 ),然后将紧接着的程序代码或数据汇编到指定
的段中,直到再遇到另一条,text,.data或,sect命
令为止。
当汇编器遇到,bss或,usect命令时,并不结束当
前段的汇编,只是暂时从当前段脱离出来,并开始对
新的段进行汇编。
.bss和,usect命令可以出现在一个已初始化段的
任何位置,而不会对它的内容发生影响。
2010年 5月 18日 DSP原理及应用 31
第 4章 汇编语言程序开发工具
4.3.2汇编器对段的处理
命名段由用户指定,与默认的,text,.data和
.bss段的使用相同,但它们被分开汇编。
假如一部分可执行代码(例如初始化程序)不希
望和,text段分配在一起,可将它们汇编进一个命名
段,这样就可定位在与,text不同的地方。也可将初
始化的数据汇编到与,data段不同的地方,或者将未
初始化的变量保留在与,bss段不同的位置。
可用,usect和,sect两个伪指令产生命名段。
3.命名段(自定义段)
2010年 5月 18日 DSP原理及应用 32
第 4章 汇编语言程序开发工具
.usect伪指令产生类似,bss的段,为变量在 RAM
中保留存储空间。
.sect伪指令产生类似,text和,data的段,可以
包含代码或数据。,sect伪指令产生可重新定位地址
的命名段。
3.命名段
产生命名段伪指令格式:
符号,usect,段名,,字数
.sect,段名,
可以产生多达 32767个不同的命名段。段名可长
达 200个字符。
2010年 5月 18日 DSP原理及应用 33
第 4章 汇编语言程序开发工具
对于,sect和,usect伪指令,段名可以作为子段
的参考。
每次用一个新名字调用这些伪指令时,就产生一
个新的命名段。
若用已有的段名调用这些伪指令,则汇编器就将
代码或数据(或保留空间)汇编进相应名称的段中。
不同的伪指令不能使用相同的名字。即不能用
.usect创建了命名段,然后又用,sect创建一个相同
名字的段。
3.命名段
2010年 5月 18日 DSP原理及应用 34
第 4章 汇编语言程序开发工具
4.3.2汇编器对段的处理
子段是较大段中的小段。链接器可以像处理其他
段一样处理子段。
子段结构可用来对存储器空间进行更紧凑的控制,
可以使存储器空间分配更加紧密。
4.子段
子段命名格式:
基段名,子段名
子段名前为基段名,随后为冒号,最后为子段名。
2010年 5月 18日 DSP原理及应用 35
第 4章 汇编语言程序开发工具
对于子段,汇编器可以单独为其分配存储单元,
或者在相同的基段名下与其他段组合在一起。
用,sect命令建立的段是已初始化的子段;
用,usect命令建立的段是未初始化的子段。
4.子段
例如,若要在,text段内建立一个称之为 _func
的子段,其命令格式:
.sect,.text,_func”
2010年 5月 18日 DSP原理及应用 36
第 4章 汇编语言程序开发工具
4.3.2汇编器对段的处理
汇编器为每个段都安排了一个单独的程序计数器
称之为段程序计数器 SPC。
SPC表示在程序代码或数据段内当前的地址。开
始时汇编器将每个 SPC置 0。当汇编器将程序代码或数
据加到段内时,增加相应的 SPC值。若再继续对某个
段汇编,则相应的 SPC就在先前的数值上继续增加。
链接器在链接时要对每个段进行重新定位。
5.段程序计数器 SPC
2010年 5月 18日 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段
2010年 5月 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命名段
2010年 5月 18日 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
2010年 5月 18日 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
2010年 5月 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
源程序
的行号
段程序
计数器
目标
代码
汇编语言
源程序
2010年 5月 18日 DSP原理及应用 42
第 4章 汇编语言程序开发工具
汇编语言源程序经过汇编后,共建立了 5个段:
●,text段 ——文本段,段内有 10个字可执行
的程序代码。
●,data段 ——已初始化的数据段,段内有 7
个字的数据。
● vectors段 ——用,sect命令生成的命名段,
段内有 2个字的初始化数据。
●,bss段 ——未初始化的数据段,在存储器中
为变量保留 8个存储单元。
● newvars段 ——用,usect命令建立的命名段,
为变量保留 10个存储单元。
2010年 5月 18日 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
2010年 5月 18日 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个字
2010年 5月 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
行号 目标代码 段名
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
2010年 5月 18日 DSP原理及应用 46
第 4章 汇编语言程序开发工具
4.3.3链接器对段的处理
链接器是开发 ’ C54x器件必不可少的开发工具
之一,它对段处理时有 2个主要任务:
① 将一个或多个 COFF目标文件中的各种段作为
链接器的输入段,经链接后在一个执行的 COFF输出
模块中建立各个输出段;
② 在程序装入时对其重新定位,为各个输出段
选定存储器地址。
2010年 5月 18日 DSP原理及应用 47
第 4章 汇编语言程序开发工具
4.3.3链接器对段的处理
链接器有 2条伪指令支持上述任务:
● MEMORY伪指令 ——用来定义目标系统的存储
器配置空间,包括对存储器各部分命名,以及规定
它们的起始地址和长度。
● SECTIONS伪指令 ——用来指定链接器将输入
段组合成输出段方式,以及输出段在存储器中的位
置,也可用于指定子段。
若未使用伪指令,则链接器将使用目标处理器
默认的方法将段放入存储空间。
2010年 5月 18日 DSP原理及应用 48
第 4章 汇编语言程序开发工具
4.3.3链接器对段的处理
1.默认的存储器分配
链接器可对多个目标文件进行链接。若链接文件
中不使用 MEMORY和 SECTIONS命令,则为默认方式。
每个目标文件都有,text,.data,.bss段和命名
段。若采用默认链接,链接器将对多个目标文件中的
各个段进行组合,形成各自的对应段,并将各个段配
置到所指定的存储器中,形成可执行的目标模块。
在默认的方式下,链接器将从存储器的 0080h开
始,对组合后的各段进行存储器配置。
2010年 5月 18日 DSP原理及应用 49
第 4章 汇编语言程序开发工具
默认的存储器分配:
① 将所有,text段组合在一起,形成一个,text
段,并分配到程序存储器中;
② 将多个目标文件中的,data段组合在一起,
分配到紧接着,text段的程序存储空间中;
③ 将,bss段组合,配置到数据存储器中;
④ 组合命名段。初始化的命名段按顺序分配到
紧随,data段的程序存储器,而未初始化命名段将被
配置到紧随,bss段的数据存储器中。
1.默认的存储器分配
2010年 5月 18日 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
没有使用
没有配置
没有配置
没有使用
2010年 5月 18日 DSP原理及应用 51
第 4章 汇编语言程序开发工具
4.3.3链接器对段的处理
2.段放入存储器空间
若不希望链接器将所有的,text段结合在一起形
成单个的,text段,就不能采用默认的方式。
由于 DSP硬件系统中可能配置多种类型的存储器,
若要把某一段分配到特定类型的存储器中,或将命名
段配置特定的地址,则需采用 MEMORY和 SECTIONS伪指
令来配置。
若不采用默认的方式,通常需要建立一个链接命
令文件,在命令文件中用 MEMORY和 SECTIONS伪指令定
义存储器和配置段地址。
2010年 5月 18日 DSP原理及应用 52
第 4章 汇编语言程序开发工具
4.3.4链接器对程序的重新定位
1.链接器重新定位
汇编器对每个段汇编时都是从 0地址开始,而所
有需要重新定位的符号 (标号 )在段内都是相对于 0地
址的。事实上,所有段都不可能从存储器中 0地址单
元开始,因此链接器必须对各个段进行重新定位。
重新定位的方法:
?将各个段配置到存储器中,使每个段都有一个
合适的起始地址;
?将符号变量调整到相对于新的段地址的位置;
?将引用调整到重新定位后的符号,这些符号
反映了调整后的新符号值。
2010年 5月 18日 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
2010年 5月 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。
2010年 5月 18日 DSP原理及应用 55
第 4章 汇编语言程序开发工具
1.链接器重新定位
链接器利用两个重定位入口,对目标文件中的两次引用
进行修正:
变成 f073
7204
变成 f020
7100
f073 B Y
0004’
f020 LD #X,A
0000!
2010年 5月 18日 DSP原理及应用 56
第 4章 汇编语言程序开发工具
4.3.4链接器对程序的重新定位
2.运行时间重新定位
在实际运行中,有时需要将代码装入存储器的一
个地方,而在另一个地方运行。
如:一些关键的执行代码必须装在系统的 ROM中,
但运行时希望在较快的 RAM中进行。
利用 SECTIONS伪指令选项可让链接器对其定位 2
次,其方法:
① 使用装入关键字设置装入地址;
② 使用运行关键字设置它的运行地址。
2010年 5月 18日 DSP原理及应用 57
第 4章 汇编语言程序开发工具
4.3.4链接器对程序的重新定位
2.运行时间重新定位
装入地址确定段的原始数据或代码装入的位置,
而任何对段的使用(例如其中的标号),则参考它的
运行地址。在应用中必须将该段从装入地址复制到运
行地址。
如果只为段提供了一次定位(装入或运行),则
该段将只定位一次,并且装入和运行地址相同。如果
提供了 2个地址,则段将被自动定位。
2010年 5月 18日 DSP原理及应用 58
第 4章 汇编语言程序开发工具
4.3.5程序装入
链接器产生可执行的 COFF目标文件。可执行的
目标文件模块与链接器输入的目标文件具有相同的
COFF格式。为了运行程序,在可执行模块中的数据
必须传输或装入目标系统存储器中。
可以采用以下方法装入程序:
? 使用调试工具转入程序
’ C54x的调试工具包括软件模拟器,XDS仿真器
和集成系统 CCS。 它们都具有内部的装入器,调用装
入器的 LOAD命令,装入器将程序复制到目标系统的
存储器中。
? 采用 Hex转换工具转入程序
可以使用转换工具 Hex500,将可执行 COFF目标
模块转换成几种其他目标格式文件,然后将转换后
的文件通过编程器将程序装(烧)进 EPROM。
2010年 5月 18日 DSP原理及应用 59
第 4章 汇编语言程序开发工具
4.3.6COFF文件中的符号
COFF文件中有一个符号表,主要用来存储程序
中有关符号的信息。链接器在执行程序定位时,要
使用符号表提供的信息,而调试工具也要使用该表
来提供符号调试。
1.外部符号
是指在一个模块中定义、而在另一个模块中引
用的符号。它可以用伪指令,def,.ref或,global来
定义。
●,def在当前模块中定义,并可在别的模块中
使用的符号;
●,ref 在当前模块中使用,但在别的模块中定
义的符号;
●,global可以是上面的任何一种情况。
2010年 5月 18日 DSP原理及应用 60
第 4章 汇编语言程序开发工具
1.外部符号
【例 4.3.3】 说明代码段中外部符号的定义。
x,ADD #56h,A
B y
.def x
.ref y;定义 x;引用 y;x在此模块中定义,可为别
的模块引用;y在这里引用,它在别的模
块中定义
2010年 5月 18日 DSP原理及应用 61
第 4章 汇编语言程序开发工具
4.3.6COFF文件中的符号
2.符号表
每当遇到一个外部符号,无论是定义的还是引
用的,汇编器都将在符号表中产生一个条目。
汇编器还产生一个指到每段的专门符号,链接
器使用这些符号将其他引用符号重新定位。
2010年 5月 18日 DSP原理及应用 62
第 4章 汇编语言程序开发工具
4.4 源程序的汇编
汇编器的作用是将汇编语言源程序转换成机器
语言目标文件。这些目标文件都是公共目标文件格
式 (COFF)。
汇编语言源程序文件可以包含汇编命令, 汇编
语言指令和宏指令 。
汇编命令用来控制汇编的过程,包括列表格式
、符号定义和将源代码放入块的方式等。
2010年 5月 18日 DSP原理及应用 63
第 4章 汇编语言程序开发工具
4.4 源程序的汇编
汇编器包括如下功能:
① 将汇编语言源程序汇编成一个可重新定位的
目标文件 (.obj文件 )。
② 根据需要,可以生成一个列表文件 (.lst文
件 ),并对该列表进行控制。
③ 将程序代码分成若干个段,每个段的目标代
码都有一个 SPC(段程序计数器 )管理。
2010年 5月 18日 DSP原理及应用 64
第 4章 汇编语言程序开发工具
4.4 源程序的汇编
汇编器包括如下功能:
④ 定义和引用全局符号,如果需要可以在列表
文件后面附加一张交叉引用表。
⑤ 对条件程序块进行汇编。
⑥ 支持宏功能,允许定义宏命令。
⑦ 为每个目标代码块设置一个程序计数器 SPC。
2010年 5月 18日 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, 汇编器的选项,为汇编器的使用提供各种选择。
2010年 5月 18日 DSP原理及应用 66
第 4章 汇编语言程序开发工具
汇编器 asm500的选项及其功能
选 项 功 能
-@
-@filemane(文件名 )可以将文件名的内容附加到命令行上。
使用该选项可以避免命令行长度的限制。如果在一个命令文件、
文件名或选项参数中包含了嵌入的空格或连字号,则必须使用
引号括起来,例如:, this-file.asm”。
-a 建立一个绝对列表文件。当选用 -a时,汇编器不产生目标文件 。
-c 使汇编语言文件中大小写没有区别 。
-d
为名字符号设置初值。格式为 -d name[=value]时,与汇编文件
被插入 name,set[=value]是等效的。
如果 value被省略,则此名字符号被置为 1。
-f 抑制汇编器给没有,asm扩展名的文件添加扩展名的默认行为。
2010年 5月 18日 DSP原理及应用 67
第 4章 汇编语言程序开发工具
汇编器 asm500的选项及其功能
选 项 功 能
-g
允许汇编器在源代码中进行代码调试。汇编语言源文件
中每行的信息输出到 COFF文件中。
注意:用户不能对已经包含,line伪指令的汇编代码使用 -g
选项。例如由 C/C++编译器运行 -g选项产生的代码 。
-h,-help,-? 这些选项的任一个将显示可供使用的汇编器选项的清单。
-hc
将选定的文件复制到汇编模块。格式为 -hc filename
所选定的文件包含到源文件语句的前面,复制的文件将
出现在汇编列表文件中。
-hi
将选定的文件包含到汇编模块。格式为 -hi filename
所选定的文件包含到源文件语句的前面,所包含的文件
不出现在汇编列表文件中。
2010年 5月 18日 DSP原理及应用 68
第 4章 汇编语言程序开发工具
汇编器 asm500的选项及其功能
选 项 功 能
-i
规定一个目录。汇编器可以在这个目录下找到,copy、
.include或,mlib命令所命名的文件。
格式为 -i pathname,最多可规定 10个目录,每一条路径
名的前面都必须加上 -i选项。
-l (小写 L) 生成一个列表文件。
-mf 指定汇编调用扩展寻址方式
-mg 源文件是代数式指令。
-q 抑制汇编的标题以及所有的进展信息。
-r,-r[num]
压缩汇编器由 num标识的标志。该标志是报告给汇编器
的消息,这种消息不如警告严重。若不对 num指定值,
则所有标志都将被压缩。
2010年 5月 18日 DSP原理及应用 69
第 4章 汇编语言程序开发工具
汇编器 asm500的选项及其功能
选 项 功 能
-pw 对某些汇编代码的流水线冲突发出警告。
-u -u name取消预先定义的常数名,从而不考虑由任何 -d选项所指定的常数。
-v -v value确定使用的处理器,可用 541,542,543,545,5451p,5461p,548,549值中的一个。
-s
把所有定义的符号放进目标文件的符号表中。
汇编程序通常只将全局符号放进符号表。当利用 -s选项时,
所定义的标号以及汇编时定义的常数也都放进符号表内。
-x
产生一个交叉引用表,并将它附加到列表文件的最后,
还在目标文件上加上交叉引用信息。即使没有要求生成
列表文件,汇编程序总还是要建立列表文件的。
2010年 5月 18日 DSP原理及应用 70
第 4章 汇编语言程序开发工具
4.4.2汇编时的列表文件
汇编器对源程序汇编时,如果采用 -l选项,汇编后将生成
一个列表文件。列表文件中包括源程序语句和目标代码。
每个列表文件的顶部有两行汇编程序的标题、一行空行以
及页号行。,title命令提供的文件名打印在页号行左侧;页号
打印在此行的右侧。
源文件的每一行都会在列表文件中生成一行。其内容包括
行号、段程序计数器 SPC的数值、汇编后的目标代码,以及源
程序语句。一条指令可以生成 1或 2个字的目标代码。汇编器为
第 2字单独列一行,并列出了 SPC的数值和目标代码。
2010年 5月 18日 DSP原理及应用 71
第 4章 汇编语言程序开发工具
4.4.2汇编时的列表文件
从例 4.3.1 可以看出,列表文件包括 4个部分:
源程序语句编号
段程序计数器
目标代码
源程序语句
2010年 5月 18日 DSP原理及应用 72
第 4章 汇编语言程序开发工具
1.源程序语句的行号
源程序语句的行号,用十进制数表示。汇编器在
汇编时将源程序的行进行编号,有些语句 (如,title)
只列行号,不列语句。
汇编器还可能在一行的左边加一个字母,用来表
示该行是从一个包含文件汇编的。
汇编器还可能在一行的左边加一个数字,表示嵌
入的宏展开或循环程序块的等级。
2.段程序计数器
用十六进制数表示。所有的段都有 SPC。 有些伪
指令对 SPC不发生影响,此时这部分为空格。
2010年 5月 18日 DSP原理及应用 73
第 4章 汇编语言程序开发工具
3.目标代码
用十六进制数表示。所有指令经汇编都会产生目
标代码。目标代码后面的一些记号表示在链接时需要
重新定位。
! 未定义的外部引用;
,可重新定位的文本段;
” 可重新定位的数据段;
+ 可 重新定位的初始化命名段;
- 可重新定位的未初始化段;
% 复杂的重新定位的表达式。
4.源程序语句
这一部分包含被汇编器搜索到的源程序的所有字
符。汇编器可以接受的每行字符数为 200个。
2010年 5月 18日 DSP原理及应用 74
第 4章 汇编语言程序开发工具
4.4.3汇编伪指令
汇编器伪指令是汇编语言程序的一个重要内容。
用于为程序提供数据,并控制汇编程序如何汇编源程
序。
● 将代码和数据汇编进指定的段
● 为未初始化的变量在存储器中保留空间
● 控制清单文件是否产生
● 初始化存储器
● 汇编条件代码块
● 定义全局变量
● 为汇编器指定从中可以获得宏的库
● 考察符号调试信息
汇编器伪指令可完成以下工作:
2010年 5月 18日 DSP原理及应用 75
第 4章 汇编语言程序开发工具
4.4.3汇编伪指令
伪指令和它所带的参数必须书写在一行。在包
含汇编伪指令的源程序中,伪指令可以带有标号和
注释。虽然标号一般不作为伪指令语法的一部分列
出,但是有些伪指令必须带有标号,此时,标号将
作为伪指令的一部分出现。
2010年 5月 18日 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等。
2010年 5月 18日 DSP原理及应用 77
第 4章 汇编语言程序开发工具
4.4.3汇编伪指令
⑶ 调整 SPC的指令
如,align等。
⑷ 对输出列表文件格式化的命令
如,drlist,.drnolist等。
⑸ 引用其他文件的命令
如 copy,.def,.global,.include,.mlib、
.ref等。
2010年 5月 18日 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等 。
2010年 5月 18日 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段不同的空间。
2010年 5月 18日 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
2010年 5月 18日 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
2010年 5月 18日 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
2010年 5月 18日 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
2010年 5月 18日 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
2010年 5月 18日 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伪指令既不结束当前的段也不开始新段,
它们保留指定数量的空间, 然后汇编器开始将代码或数据汇
编进当前的段 。
2010年 5月 18日 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浮点表示,并将它保存在当前段的两个连续的
字中。不自动对准最接近的长字边界。
2010年 5月 18日 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位字符从一个或多个字符串放进当前段。
2010年 5月 18日 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
2010年 5月 18日 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:不自动对准长字边界
2010年 5月 18日 DSP原理及应用 90
第 4章 汇编语言程序开发工具
2,初始化常数的伪指令
.field伪指令:
功能,将单个数值放进当前字的指定位域中 。
采用,field伪指令, 可以将多个字段或域打包成
单个字, 直到字被填满为止, 汇编器不增加 SPC。
指令格式,,field value [,size in bits]
单个数值
当前字的指定位域
2010年 5月 18日 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
2010年 5月 18日 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。
2010年 5月 18日 DSP原理及应用 93
第 4章 汇编语言程序开发工具
4.4.3汇编伪指令
3,对准段程序计数器的伪指令
对准段程序计数器的伪指令包括,.align伪指令
和,even伪指令 。
助记符及语法格式 说 明
.align [size in words] 用于将段程序计数器 (SPC)对准在 1~ 128字的边界。
.even 用于使 SPC指到下一个字的边界 (偶字边界 )。
2010年 5月 18日 DSP原理及应用 94
第 4章 汇编语言程序开发工具
3,对准段程序计数器的伪指令
(1),align伪指令的操作数必须是在 20~216之间且等
于 2的幂 。
例如,操作数为 1时, 对准 SPC到字的边界;
操作数为 2时, 对准 SPC到长字 /偶字的边界;
操作数为 128时, 对准 SPC到页面的边界;
没有操作数时,,align伪指令默认为页面边界 。
(2),even伪指令等效于指定,align伪指令的操作数
为 1的情形 。
当,even操作数为 2时, 将 SPC对准到下一个长字
的边界 。 任何在当前字中没有使用的位都填充 0。
2010年 5月 18日 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
2010年 5月 18日 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
2010年 5月 18日 DSP原理及应用 97
第 4章 汇编语言程序开发工具
4.4.3汇编伪指令
4,格式化输出清单文件的伪指令
用于格式化输出清单文件 。
助记符及语法格式 说 明
.drnolist 用于抑制某些伪指令在清单文件中的出现。
.drlist 允许,drnolist抑制的伪指令在清单文件中重新出现。
.fclist 允许按源代码在清单文件中列出条件为假的代码块。汇编器默认状态。
.fcnolist 只列出实际汇编的条件为真的代码块。
.length page length 调节清单文件输出页面的长度。可针对不同的输出设备灵活调节输出页面的长度。
.list 允许汇编器将所选择的源语句输出到清单文件。
2010年 5月 18日 DSP原理及应用 98
第 4章 汇编语言程序开发工具
4,格式化输出清单文件的伪指令
助记符及语法格式 说 明
.nolist 禁止汇编器将所选择的源语句输出到清单文件。
.mlist 允许列出所有的宏扩展和循环块。
.mnolist 禁止列出所有的宏扩展和循环块。
.option
{B│L│M│R│T│W│X} 用于控制清单文件的某些功能。
.page 把新页列在输出清单文件中。
.sslist 允许列出替代符号扩展。
.ssnolist 禁止列出替代符号扩展。
.title, string” 在每页的顶部打印文件标题。
.width page width 调节清单文件页面的宽度。
2010年 5月 18日 DSP原理及应用 99
第 4章 汇编语言程序开发工具
4.4.3汇编伪指令
5,引用其他文件的伪指令
该指令主要为引用其他文件提供信息 。
助记符及语法格式 说 明
.copy [”]filename[”] 通知汇编器开始从其他文件读取源程序语句。
.include [”]filename[”] 通知汇编器开始从其他文件读取源程序语句。
.def symbil [,?,symbil] 识别定义在当前模块中, 但可被其他模块使用的符号 。
.global symbil[,?,symbil]
声明当前符号为全局符号 。
对定义了的符号, 其作用相当于,def;
对没有定义的符号, 其作用相当于,ref。
.ref symbil[,?,symbil] 识别在当前模块中使用的, 但在其他模块中定义的符号 。
2010年 5月 18日 DSP原理及应用 100
第 4章 汇编语言程序开发工具
4.4.3汇编伪指令
6,条件汇编伪指令
用来通知汇编器按照表达式计算出的结果的真
假, 决定是否对某段代码进行汇编 。
有两组伪指令用于条件代码块的汇编:
(1),if/.elseif/.else/.endif伪指令
用于通知汇编器按照表达式的计算结果,对某段代码块进
行条件汇编 。 要求表达式和伪指令必须完全在同一行指定 。
(2),loop/.break/.endloop伪指令
用于通知汇编器按照表达式的计算结果重复汇编一个代
码块 。 要求表达式和伪指令必须完全在同一行指定 。
2010年 5月 18日 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 标记代码块的结束 。
2010年 5月 18日 DSP原理及应用 102
第 4章 汇编语言程序开发工具
4.4.3汇编伪指令
7,定义宏的伪指令
常用的定义宏的伪指令,
助记符及语法格式 说 明
macname,macro [parameter][,...parameter]
model statements or macro directives
,endm
定义宏
.endm 中止宏
.var sym[,sym2,...,sym] 定义宏替代符号
2010年 5月 18日 DSP原理及应用 103
第 4章 汇编语言程序开发工具
4.4.3汇编伪指令
8,汇编时间符号伪指令
用于使符号名与常数值或字符串等价 。
助记符及语法格式 说 明
.asg [”] character string[”],
substitution symbol
把一个字符串赋给一个替代符号。
替代符号也可以重新被定义。
.eval well-defined expresion,
substitution symbol
计算一个表达式, 将其结果转换成字
符, 并将字符串赋给替代符号 。
用于操作计数器 。
.label symbol 定义一个特殊的符号,用来指向在当前段内的装载时间地址 。
symbol,set value 用于给符号赋值 。 符号被存 放 在符号表中, 而且不能被重新定义 。
2010年 5月 18日 DSP原理及应用 104
第 4章 汇编语言程序开发工具
8,汇编时间符号伪指令
助记符及语法格式 说 明
.struct 设置类似 C语言的结构体。.tag伪指令把结构体赋给一个标号。
.endstruct 结束结构体 。
.union 建立类似 C语言的 union(联合 )定义
.endunion 结束 union(联合 )
.struct/.endstruct伪指令允许将信息组织到结构
体中,以便将同类的元素分在一组。然后由汇编器
完成结构体成员偏离地址的计算。
.struct/.endstruct伪指令不分配存储器。只是简
单地产生一个可重复使用的符号模板。
.tag将结构体与一个标号联系起来,.tag伪指令
不分配存储器,且结构体的标记符必须在使用之前
先定义好。
2010年 5月 18日 DSP原理及应用 105
第 4章 汇编语言程序开发工具
8,汇编时间符号伪指令
.union/.endunion伪指令通过创建符号模板,提供在相同
的存储区域内管理多种不同的数据类型的方法。
.union不分配任何存储器,它允许类型和大小不同的定义
临时地存储在相同存储器空间。
.tag伪指令将 union属性与一个标号联系起来,可以定义一
个 union并给定一个标记符,以后可用,tag伪指令将它声明为结
构体的一个成员。
当 union没有标记符时,它的所有成员都将进入符号表,
每一个成员有唯一的名称。
当 union定义在结构体内时,对这样的 union的引用必须通
过包括它的结构体来实现。
2010年 5月 18日 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
2010年 5月 18日 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成员
2010年 5月 18日 DSP原理及应用 108
第 4章 汇编语言程序开发工具
4.4.3汇编伪指令
9,混合伪指令
常用的混合伪指令:助记符及语法格式 说 明
.end 终止汇编,位于程序源程序的最后一行。
.far_mode 通知汇编器调用为远调用 。
.mmregs 为存储器映像寄存器定义符号名 。 使用,mmregs的功能和对所有的存储器映像寄存器执行,set伪指令相同 。
.newblock 用于复位局部标号 。
.version [value] 确定运行指令的处理器, 每个 ’ C54x器件都有一个与之对应的值 。
.emsg string 把错误消息送到标准的输出设备 。
.mmsg string 把汇编时间消息送到标准的输出设备 。
.wmsg string 把警告消息送到标准的输出设备 。
2010年 5月 18日 DSP原理及应用 109
第 4章 汇编语言程序开发工具
9,混合伪指令
.newblock伪指令用于复位局部标号 。
局部标号是形式为 $n或 name?的符号 。 当它们出
现在标号域时被定义 。 局部标号可用作跳转指令的
操作数的临时标号 。
.newblock伪指令通过在它们被使用后将它们复
位的方式来限制局部标号的使用范围 。
2010年 5月 18日 DSP原理及应用 110
第 4章 汇编语言程序开发工具
9,混合伪指令
有 3个伪指令可以允许用户定义自己的错误和警
告消息:
(1),emsg伪指令以和汇编器同样的方式产生错
误, 增加错误的计数并防止汇编器产生目标文件 。
(2),mmsg伪指令的功能与,emsg和,wmsg伪指令相
似, 但它不增加错误计数或警告计数 。 也不影响目
标文件的产生 。
(3).wmsg伪指令的功能与,emsg伪指令相似, 但
它增加警告计数, 而不增加错误计数 。 它也不影响
目标文件的产生 。
2010年 5月 18日 DSP原理及应用 111
第 4章 汇编语言程序开发工具
4.4.4宏定义和宏调用
’C54x汇编器支持宏指令语言。如果程序中有一
段程序需要执行多次,就可以把这一段程序定义 (宏
定义 )为一条宏指令,然后在需要重复执行这段程序
的地方调用这条宏指令 (宏调用 )。利用宏指令,可以
使源程序变得简短。
宏的使用分以下 3个步骤:
① 定义宏 在调用宏时,必须首先定义宏;
② 调用宏 在定义宏之后,可在源程序中调用宏;
③ 扩展宏 在源程序调用宏指令时,汇编器将对
宏指令进行扩展。
2010年 5月 18日 DSP原理及应用 112
第 4章 汇编语言程序开发工具
4.4.4宏定义和宏调用
1.宏定义
在调用宏时,必须首先定义宏。有两种方法定
义宏:
① 可在源文件的开始定义宏,或者在,include
或,copy的文件中定义;
② 在宏库中定义。
宏库 ——是由存档器以存档格式产生的文件集。
宏库中的每一成员包含一个与成员对应的宏定
义。可通过,mlib指令访问宏库。
2010年 5月 18日 DSP原理及应用 113
第 4章 汇编语言程序开发工具
1.宏定义
在调用宏之前,必须先定义宏。可以在源程序
的任何位置定义宏,宏定义的所有内容必须包含在
同一个文件中。
宏定义可以嵌套,即在一条宏指令中调用其他
的宏指令。
2010年 5月 18日 DSP原理及应用 114
第 4章 汇编语言程序开发工具
宏定义的格式:
macname,macro [parameter1][,…, parameter n]
宏程序语句 或 宏伪指令
[.mexit]
.endm
macname,宏程序名称,必须将名称放在源程序标号域。
.macro,用来说明该语句为宏定义的第一行伪指令,
必须放在助记符操作码区域 。
parameters,为 任选的替代参数,作为宏指令的操作数。
宏程序语句, 每次宏调用时要执行的指令或汇编命令。
宏伪指令, 用于控制宏指令展开的命令。
.mexit,相当于一条 跳到,endm语句。
.endm,结束宏定义。
2010年 5月 18日 DSP原理及应用 115
第 4章 汇编语言程序开发工具
宏定义的格式:
macname,macro [parameter1][,…, parameter n]
宏程序语句 或 宏伪指令
[.mexit]
.endm
如果希望在宏定义中包含有注释,但又不希望这些注释
出现在扩展宏中,可在注释前面加上感叹号, !, 。
如果希望这些注释出现在扩展宏中,需在注释前面加上
符号, *” 或, ;, 。
2010年 5月 18日 DSP原理及应用 116
第 4章 汇编语言程序开发工具
4.4.4宏定义和宏调用
2.宏调用
在定义宏之后,可在源程序中使用宏名进行宏
调用。
宏调用的格式:
[label][:] macname [parameter 1][,…, parameter n]
标号
任选项
宏指令名
位于操作码区
任选的替代参数
数目应与宏指令定义的相等
2010年 5月 18日 DSP原理及应用 117
第 4章 汇编语言程序开发工具
4.4.4宏定义和宏调用
3.宏扩展
若源程序中调用宏指令,则汇编时就将对宏指
令进行扩展。
扩展时汇编器先将变量传递给宏参数,按宏定
义取代调用宏语句,然后再对源代码进行汇编。
在默认的情况下,扩展宏将出现在清单文件中,
若不需要扩展宏出现在清单文件中,则可通过伪指
令,mnolist来实现。
2010年 5月 18日 DSP原理及应用 118
第 4章 汇编语言程序开发工具
4.4.4宏定义和宏调用
3.宏扩展
当汇编器遇到宏定义时,将宏名称放进操作码
表中,并将重新定义前面已经定义过的与之具有相
同名称的宏、库成员、伪指令或指令助记符。
用这种方法可以扩展指令和伪指令的功能以及
加入新的指令。
2010年 5月 18日 DSP原理及应用 119
第 4章 汇编语言程序开发工具
4.4.4宏定义和宏调用
宏指令与子程序一样,都是重复执行某一段程
序,但两者是有区别的,主要区别:
⑴ 宏指令和子程序都可以被多次调用,但是把
子程序汇编成目标代码的过程只进行一次,而在用
到宏指令的每个地方都要对宏指令中的语句逐条地
进行汇编。
⑵ 在调用前,由于子程序不使用参数,故子程
序所需要的寄存器等都必须事先设置好;而对于宏
指令来说,由于可以使用参数,调用时只要直接代
入参数就行了。
2010年 5月 18日 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
2010年 5月 18日 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
2010年 5月 18日 DSP原理及应用 122
第 4章 汇编语言程序开发工具
4.5链接器的使用
链接器的主要任务是根据链接命令文件 (.cmd),
将一个或多个 COFF目标文件链接起来,生成存储器映
像文件 (.map)和可执行的输出文件 (.out)。
在链接过程中,链接器将各个目标文件合并,并
完成以下工作:
● 将各个段配置到目标系统的存储器。
● 对各个符号和段进行重新定位,并给它们指
定一个最终的地址。
● 解决输入文件之间未定义的外部引用。
2010年 5月 18日 DSP原理及应用 123
第 4章 汇编语言程序开发工具
4.5.1链接器的运行
1.运行链接程序
’C54x链接器的运行命令,
lnk500 [-options] filename 1 … filename n
lnk500,运行链接器命令。
-options,链接命令选项。可以出现在命令行或链接命令文
件的任何位置。
filenames,文件名。可以是目标文件、链接命令文件或文
件库。所有文件扩展名的默认值为,obj。
2010年 5月 18日 DSP原理及应用 124
第 4章 汇编语言程序开发工具
1.运行链接程序
’C54x链接器的运行,有三种方法,
(1) 键入命令,lnk500
链接器会提示如下信息:
Command files:
Object files [.obj]:
Output Files [a.out]:
Options:
(要求键入一个或多个命令文件 )
(要求键入一个或多个需要链接的目标文件
)(要求键入一个链接器所生成的输出文件名 )
(要求附加一个链接选项 )
2010年 5月 18日 DSP原理及应用 125
第 4章 汇编语言程序开发工具
1.运行链接程序
(2)键入命令:
lnk500 file1.obj file2.obj -o link.out
在命令行中指定选项和文件名。
目标文件,file1.obj,file2.obj
命令选项,-o
输出文件,link.out
将两个目标文件进行链接,生成一个可执行的输
出文件 link.out。
2010年 5月 18日 DSP原理及应用 126
第 4章 汇编语言程序开发工具
1.运行链接程序
(3)键入命令:
lnk500 linker.cmd
linker.cmd,链接命令文件。
在执行上述命令之前,需将链接的目标文件、链
接命令选项以及存储器配置要求等编写到 链接命令文
件 linker.cmd中。
例如:希望完成第二种命令的链接,在链接命令
文件 中,应包含如下内容:
file1.obj
file2.obj
-o link.out
2010年 5月 18日 DSP原理及应用 127
第 4章 汇编语言程序开发工具
4.5.1链接器的运行
2.链接命令选项
在链接时,连接器通过链接命令选项控制链接
操作。
链接命令选项可以放在命令行或命令文件中,
所有选项前面必须加一短划线, -” 。除 -l和 -i选
项外,其他选项的先后顺序并不重要。
选项之间可以用空格分开。最常用选项为 -m
和 -o,分别表示输出的地址分配表映像文件名和输
出可执行文件名。
2010年 5月 18日 DSP原理及应用 128
第 4章 汇编语言程序开发工具
2.链接命令选项
链接命令选项
选 项 含 义
-a
生成一个绝对地址的、可执行的输出模块。所建立的绝
对地址输出文件中不包含重新定位信息。如果既不用 -a
选项,也不用 -r选项,链接器就像规定 -a选项那样处理。
-ar
生成一个可重新定位、可执行的目标模块。这里采用了
-a和 -r两个选项 (可以分开写成 -a -r,也可以连在一起
写作 -ar),与 -a选项相比,-ar选项还在输出文件中保留
有重新定位信息。
-e global_symbol
定义一个全局符号,这个符号所对应的程序存储器地址,
就是使用开发工具调试这个链接后的可执行文件时程序
开始执行时的地址 (称为入口地址 )。当加载器将一个程
序加载到目标存储器时,程序计数器 (PC)被初始化到入
口地址,然后从这个地址开始执行程序。
2010年 5月 18日 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选项时,链接器生成一个不可执行的文件。
2010年 5月 18日 DSP原理及应用 130
第 4章 汇编语言程序开发工具
4.5.2 链接器命令文件的编写与使用
链接命令文件用来为链接器提供链接信息,可将
链接操作所需的信息放在一个文件中,这在多次使用
同样的链接信息时,可以方便地调用。
在链接命令文件中,可使用 MEMORY和 SECTIONS伪
指令,为实际应用指定存储器结构和地址的映射。
MEMORY——用来指定目标存储器结构。
SECTIONS——用来控制段的构成与地址分配。
2010年 5月 18日 DSP原理及应用 131
第 4章 汇编语言程序开发工具
4.5.2 链接器命令文件的编写与使用
链接 命令文件为 ASCⅡ 文件,可包含以下内容:
(1)输入文件名,用来指定目标文件、存档库或
其他命令文件。
(2)链接器选项,它们在命令文件中的使用方法
与在命令行中相同。
(3)MEMORY和 SECTIONS链接伪指令,用来指定目
标存储器结构和地址分配。
(4)赋值说明,用于给全局符号定义和赋值。
2010年 5月 18日 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 /*指定输出文件的选项 */
2010年 5月 18日 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
}
2010年 5月 18日 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
2010年 5月 18日 DSP原理及应用 135
第 4章 汇编语言程序开发工具
4.5.3 目标库
目标库是用完全的目标文件作为成员的存档文件。
通常是将一组有关的模块组合在一起而形成的库。
当指定目标库作为链接器的输入时,链接器将在
库中搜索没有分辨的外部引用,并包括库中已定义有
这些引用的任何成员。
使用目标库可减少链接的时间和可执行模块的长
度。可利用存档器建立主要的库。
2010年 5月 18日 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。
2010年 5月 18日 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的引用
2010年 5月 18日 DSP原理及应用 138
第 4章 汇编语言程序开发工具
4.5.3 目标库
若输入命令:
lnk500 f1.obj f2.obj libc.lib liba.lib
则所有对 clrscr的引用,都由库 libc.libc的成员
Member 1满足。
2010年 5月 18日 DSP原理及应用 139
第 4章 汇编语言程序开发工具
4.5.3 目标库
当链接文件没有引用定义在库中的符号时,可
使用 -u选择项,强迫链接器包括库的成员。此时,
输入命令:
lnk500 -u rout1 libc.lib
则 在链接器全局符号表中,产生一个没有定义
的符号 rout1。
若库 libc.lib的任何成员定义了 rout1,则链接器
将包括这些成员。
2010年 5月 18日 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指令字开始;
② 由大括号括起来的存储器区间说明。
存储区间,存储页面 区间名称 区间属性 起始地址 区间长度
2010年 5月 18日 DSP原理及应用 141
第 4章 汇编语言程序开发工具
4.5.4 MEMORY指令
存储区间说明语句:
PAGE,指定存储器空间页面,最多为 255页,
取决于目标存储器的配置。
每一个 PAGE代表一个完全独立的地址空间。
通常,PAGE 0用于程序存储器;
PAGE 1用于数据存储器。
若没有规定 PAGE,则链接器默认为 PAGE 0。
2010年 5月 18日 DSP原理及应用 142
第 4章 汇编语言程序开发工具
4.5.4 MEMORY指令
存储区间说明语句:
name,存储器区间名称。可由用字母,$,.,_
等组成。
存储器区间为内部记号,因此不需要保留在输出
文件或者符号表中。
不同 PAGE上的存储器区间可以取相同的名字,
但在同一 PAGE内的名字不能相同,且不许重叠配置。
2010年 5月 18日 DSP原理及应用 143
第 4章 汇编语言程序开发工具
4.5.4 MEMORY指令
存储区间说明语句:
attr,为任选项,用来为命名的存储器区间规
定 1~4个属性。
当对输出段定位时,可利用属性限制输出段分配
到一定的存储区间。
属性选项共有 4项:
R 规定可以对存储器执行读操作。
W 规定可以对存储器执行写操作。
X 规定存储器可以装入可执行的程序代码。
I 规定可以对存储器进行初始化。
若未选属性,可将输出段不受限制地定位到任何
一个存储器的位置。
任何一个没有规定属性的存储器 (包括所有默认
方式的存储器 )都有全部 4项属性。
2010年 5月 18日 DSP原理及应用 144
第 4章 汇编语言程序开发工具
4.5.4 MEMORY指令
存储区间说明语句:
origin,用来指 定存储区间的起始地址,可简
写为 org或 o。其值以字为单位,可以
用十进制、八进制或十六进制数表示。
Length,用来 指定存储器空间的长度,可简写
为 len或 l,其值以字为单位,可以用
十进制、八进制或十六进制数表示。
2010年 5月 18日 DSP原理及应用 145
第 4章 汇编语言程序开发工具
4.5.4 MEMORY指令
存储区间说明语句:
fill,为任选项。用来为没有定位输出段的存储
器空单元充填一个数,键入 fill或 f均可。
该值是 2个字节的整型常数,可以是十进制
数、八进制数或十六制数 。
2010年 5月 18日 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
}
两个输入文件
链接命令选项
指令字
页面名称 区间名称
起始地址
区间长度
2010年 5月 18日 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
2010年 5月 18日 DSP原理及应用 148
第 4章 汇编语言程序开发工具
4.5.5SECTIONS指令
用来控制段的构成与地址分配。
指令功能:
① 说明如何将输入段组合成输出段;
② 在可执行程序中定义输出段;
③ 规定输出段在存储器中的存放位置;
④ 允许重新命名输出段。
1.SECTIONS指令语法
2010年 5月 18日 DSP原理及应用 149
第 4章 汇编语言程序开发工具
SECTIONS指令的句法:
SECTIONS
{
name,[property,property,property,… ]
name,[property,property,property,… ]
name,[property,property,property,… ]
}
指令字
输出段
说明语句
段名,定义输出段的名称。
属性, 定义该段的内容和存储器的分配。
段名
1.SECTIONS指令语法
属性 属性 属性
2010年 5月 18日 DSP原理及应用 150
第 4章 汇编语言程序开发工具
1.SECTIONS指令语法
段属性用来定义输出段的内容和存储地址的分
配。包括的内容如下:
① 装入存储器分配
② 运行存储器分配
③ 输入段
④ 段的类型
⑤ 充填值
2010年 5月 18日 DSP原理及应用 151
第 4章 汇编语言程序开发工具
1.SECTIONS指令语法
① 装入存储器分配
用于定义段装入时的存储器地址。
语法格式,load=allocation
或 allocation
或 > allocation
allocation,关于段地址的说明,即给段分配存储
单元。
2010年 5月 18日 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的幂次 )。
2010年 5月 18日 DSP原理及应用 153
第 4章 汇编语言程序开发工具
1.SECTIONS指令语法
① 装入存储器分配
若用到一个以上参数,可以将它们排成一行。
例如:
.text,>ROM (align( 16) PAGE (2 )) 。
2010年 5月 18日 DSP原理及应用 154
第 4章 汇编语言程序开发工具
1.SECTIONS指令语法
② 运行存储器分配
用于定义段运行时的存储器地址。
语法格式,run=allocation
或 run> allocation
2010年 5月 18日 DSP原理及应用 155
第 4章 汇编语言程序开发工具
1.SECTIONS指令语法
链接器为段在目标存储器中分配两个地址:
加载的地址 ——由装入存储器分配完成
执行程序的地址 ——由运行存储器分配完成
通常,这两个地址是相同的。
若要想把程序的加载区分开,先将程序加载到
ROM,然后在 RAM中运行,则用 SECTIONS命令让链接
器对这个段定位两次即可。
例如:
.fir,load=ROM,run=RAM
2010年 5月 18日 DSP原理及应用 156
第 4章 汇编语言程序开发工具
1.SECTIONS指令语法
③ 输入段
用于定义组成输出段的输入段。
语法格式,{input_sections}
大多数情况下,在 SECTIONS命令中是不列出
每个输入文件的输入段的段名。
例如:
SECTIONS
{
.text:
.data:
.bss
}
链接时:在输入文件中的
所有,text段链接成,text输出段
所有,data段链接成,data输出段
所有,bss段链接成,bss输出段
2010年 5月 18日 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段 */
}
}
2010年 5月 18日 DSP原理及应用 158
第 4章 汇编语言程序开发工具
1.SECTIONS指令语法
④ 段的类型
用于为输出段定义特殊形式的标记 。
语法格式,type=COPY
或 type=DSECT
或 type=NOLOAD
⑤ 充填值
用于对未初始化空单元定义一个数值。
语法格式,fill=value
或 name,… {… }=value
2010年 5月 18日 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
}
两个输入文件
链接命令选项指令字







2010年 5月 18日 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位边界
2010年 5月 18日 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
2010年 5月 18日 DSP原理及应用 162
第 4章 汇编语言程序开发工具
4.5.5SECTIONS指令
3.MEMORY和 SECTIONS命令的默认 使用
如果没有利用 MEMORY和 SECTIONS命令,链接器就
按默认算法来定位输出段。
将所有的,text输入段链接成一个,text输出段,
并配置到 PAGE 0上的存储器;
将 所有的,data输入段组合成,data输出段,定位
到 PAGE0上的存储器;
2010年 5月 18日 DSP原理及应用 163
第 4章 汇编语言程序开发工具
3.MEMORY和 SECTIONS命令的默认 使用
所有的,bss输入段则组合成一个,bss输出段,并
由链接器定位到配置为 PAGE 1上的存储器。
如果输入文件中包含有已初始化的命名段,则链
接器将它们定位到程序存储器,紧随,data段之后。
如果输入文件中包括有未初始化的命名段,则链
接器将它们定位到数据存储器,并紧随,bss段之后。
2010年 5月 18日 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
}
2010年 5月 18日 DSP原理及应用 165
第 4章 汇编语言程序开发工具
4.5.6多个文件的链接实例
下面以 example.asm源程序为例,将复位向量列
为一个单独的文件,对两个目标文件进行链接。
(1) 编写复位向量文件 vectors.asm
文件清单:
.title,vectors.asm”
.ref start
.sect,.vectors”
B start
.end
2010年 5月 18日 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
2010年 5月 18日 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
2010年 5月 18日 DSP原理及应用 168
第 4章 汇编语言程序开发工具
(3) 对源文件汇编
(4) 编写链接命令文件
编写的命令文件用来链接两个目标文件 (输入文
件 ),生成一个映像文件 example.map和一个可执行的
输出文件 example.out。 标号 start是程序的入口。
假设目标存储器的配置如下:
程序存储器 EPROM E000h~FFFFh(片外 )
数据存储器 SPRAM 0060h~007Fh(片内 )
DARAM 0080h~017Fh(片内 )
由汇编器分别对两个源文件进行汇编,生成目标
文件 example.obj和 vectors.obj。
2010年 5月 18日 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
}
2010年 5月 18日 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
}
2010年 5月 18日 DSP原理及应用 171
第 4章 汇编语言程序开发工具
(4) 编写链接命令文件
程序存储器配置了一个空间 VECS,它的起始地址
0ff80h,长度为 04h,并将复位向量段,vectors放在
VECS空间。
当 ’ C54x复位后,首先进入 0ff80h,再从 0ff80h
复位向量处跳转到主程序。
在命令文件中,有一条命令 -e start,是软件仿
真器的入口地址命令,目的是在软件仿真时,屏幕从
start语句标号处显示程序清单,且 PC也指向 start位
置 (0e000h)。
2010年 5月 18日 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
2010年 5月 18日 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)
2010年 5月 18日 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)
2010年 5月 18日 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]
2010年 5月 18日 DSP原理及应用 176
第 4章 汇编语言程序开发工具
(5) 链接
将可执行输出文件 example.out装入目标系统后
就可以运行了。
系统复位后,PC首先指向复位向量地址 0FF80h。
在这个地址上,有一条 B start指令,程序马上跳转
到 start语句标号,从程序起始地址 0e000h开始执行
主程序。