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