第3章 语言程序开发工具_第1页
第3章 语言程序开发工具_第2页
第3章 语言程序开发工具_第3页
第3章 语言程序开发工具_第4页
第3章 语言程序开发工具_第5页
已阅读5页,还剩83页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章汇编语言程序开发工具

可编程DSP芯片开发需要一套完整的软、硬件开发工具。通常可分成代码生成工具和代码调试工具两大类。

代码生成工具是指将高级语言或汇编语言编写的DSP程序转换成可执行的DSP芯片目标代码的工具程序,主要包括C编译器、汇编器和链接器以及一些辅助工具程序等。

代码调试工具包括C/汇编语言源码调试器、仿真器等。

本章主要介绍代码生成工具,包括C54x软件开发流程、汇编语言程序的编写、编辑、汇编和链接过程、COFF段的一般概念等。

2023/2/31DSP原理及应用第3章汇编语言程序开发工具

3.1

TMS320C54x软件开发过程

3.2汇编语言程序的编写方法3.3汇编语言程序的编辑、汇编和链接过程3.4

COFF的一般概念3.5汇编伪指令3.6链接器命令文件的编写和使用2023/2/32DSP原理及应用第3章汇编语言程序开发工具3.1TMS320C54x软件开发过程

’C54x的应用软件开发主要完成以下工作:(1)

选择编程语言编写源程序

’C54x提供2种编程语言,即汇编语言和C/C++语言。(2)

选择开发工具和环境

’C54x提供了两种开发环境。即非集成开发环境和集成开发环境CCS。

2023/2/33DSP原理及应用第3章汇编语言程序开发工具3.1TMS320C54x软件开发过程1.

’C54x应用软件开发流程

’C54x应用软件的开发可在TI公司提供的开发环境中进行,用户可以用C/C++语言或汇编语言编写源文件,经C编译器、汇编器生成COFF格式的目标文件,再用链接器进行链接,生成在’C54x上可执行的目标代码,然后利用调试工具对可执行的目标代码进行仿真和调试。

当调试完成后,通过Hex代码转换工具,将调试后的可执行目标代码转换成EPROM编程器能接受的代码,并将该代码固化到EPROM中或加载到用户的应用系统中,以便DSP目标系统脱离计算机单独运行。

2023/2/34DSP原理及应用第3章汇编语言程序开发工具1.

’C54x应用软件开发流程开发过程的目的是产生一个可以由’C54x目标系统执行的模块。C源文件C编译器汇编源文件汇编器汇编源文件COFF目标文件链接器可执行的COFF文件宏源文件存档器宏库存档器目标文件库建库工具运行时支持库EPROM编程器交叉引用列表器调试工具TMS320C54x绝对地址列表器HEX代码转换工具2023/2/35DSP原理及应用第3章汇编语言程序开发工具2.

’C54x的开发工具

TI公司提供的DSP开发环境和工具主要包括以下两个部分:

代码生成工具代码调试工具2023/2/36DSP原理及应用第3章汇编语言程序开发工具2.

’C54x的开发工具(1)代码生成工具:C编译器:用来将C/C++语言源程序自动编译为’C54x汇编语言源程序。

汇编器:用来将汇编语言源文件汇编成机器语言COFF目标文件。

链接器:将汇编生成的COFF目标文件组合成一个可执行的COFF目标文件。

文档管理器:允许用户将一组文件(源文件或目标文件)组合成一个文档或库。

2023/2/37DSP原理及应用第3章汇编语言程序开发工具2.

’C54x的开发工具助记符指令—代数式指令翻译器:用来将助记符指令的汇编语言源文件转换成代数式指令的汇编语言源文件。

建库实用程序:用来建立用户自己使用的、并用C/C++语言编写的支持运行的库函数。

十六进制转换程序:可以很方便地将COFF目标文件转换成TI、Intel、Motorola等公司的目标文件格式。以便烧制EPROM。(1)代码生成工具:2023/2/38DSP原理及应用第3章汇编语言程序开发工具2.

’C54x的开发工具(1)代码生成工具:绝对制表程序:将链接后的目标文件作为输入,生成.abs输出文件。

交叉引用制表程序:利用目标文件生成一个交叉引用清单,列出链接的源文件中的符号以及它们的定义和引用情况。2023/2/39DSP原理及应用第3章汇编语言程序开发工具2.

’C54x的开发工具(2)代码调试工具:

软件仿真器:是一种模拟DSP芯片各种功能并在非实时条件下进行软件调试的调试工具,它不需目标硬件支持,只需在计算机上运行。初学者工具DSK:是TI公司提供给初学者进行DSP编程练习的一套廉价的实时软件调试工具。评价模块EVM板:是一种低成本的开发板,可进行DSP芯片评价、性能评估和有限的系统调试。

可扩展的开发系统仿真器(XDS510):可用来进行系统级的集成调试,是进行DSP芯片软硬件开发的最佳工具。

2023/2/310DSP原理及应用第3章汇编语言程序开发工具2.

’C54x的开发工具评价模块EVM板:XDS510:2023/2/311DSP原理及应用3.2汇编语言程序的编写方法程序行一般包含4个部分,其一般组成形式为:[标号][:]助记符[操作数][;注释]1.标号区所有汇编指令和大多数汇编伪指令前面都可以带有标号;标号最多可达32个字符,由A~Z、a~z、0~9、_、和$符号组成;且第一个字符不能是数字,区分大小写。

如果不用标号,则第一个字母必须为空格、分号或星号。第3章汇编语言程序开发工具2023/2/312DSP原理及应用2.助记符区助记符指令、汇编伪指令、宏指令和宏调用。助记符区不能从第一列开始,否则被认为是标号。3.操作数区操作数区是一个操作数列表,可以是常数、符号或常数与符号构成的表达式。操作数间需用“,”号隔开。有的指令无操作数。第3章汇编语言程序开发工具2023/2/313DSP原理及应用4.注释区注释用分号(;)标注,可以从任何一列开始,如果从第一列开始也可用星号(*)标注;可以包含ASCII字符和空格;是任选项。

常用的汇编伪指令(汇编命令)如表3-1。第3章汇编语言程序开发工具2023/2/314DSP原理及应用表3-1常用汇编伪指令2023/2/315DSP原理及应用补充:.def定义一个或多个符号,可在别的模块中使用;

.ref

标识当前模块中使用的符号是在另一个模块中定义的;

.global

可以是上面随便哪一种情况;

.mmregs

将‘C54X各寄存器名定义为全局符号,这样可以无须再定义这些符号,而直接引用寄存器;第3章汇编语言程序开发工具2023/2/316DSP原理及应用第3章汇编语言程序开发工具3.3汇编语言程序的编辑、汇编和链接过程示意图汇编器调试程序链接器文本编辑器.asm源文件.obj目标文件.out输出文件.cmd链接命令文件.lst列表文件.map存储器映像文件十六进制转换程序HEX500-

o-

m-

l2023/2/317DSP原理及应用第3章汇编语言程序开发工具3.3汇编语言程序的编辑、汇编和链接过程1.

编辑

利用各种文本编辑器,如记事本、WORD、EDIT和TC等,可编写汇编语言源程序。

2.

汇编当汇编语言源程序编写好以后,可利用C54x的汇编器ASM500,对一个或多个源程序分别进行汇编,并生成列表文件(.lst)和目标文件(.obj)。

2023/2/318DSP原理及应用第3章汇编语言程序开发工具3.3汇编语言程序的编辑、汇编和链接过程3.

链接所谓链接,就是利用C54x的链接器LNK500,根据链接器命令文件(.cmd)对已汇编过的一个或多个目标文件(.obj)进行链接,生成输出文件(.out)和存储器映像文件(.map)

2023/2/319DSP原理及应用第3章汇编语言程序开发工具3.4

COFF的一般概念汇编器和链接器生成的目标文件,是一个可以由C54x器件执行的文件。这些目标文件的格式称为公共目标文件格式(COFF-CommonObjectFileFormat)。

在编写汇编语言程序时,COFF采用代码段和数据段的形式,以便于模块化的编程,使编程和管理变得更加方便。这些代码段和数据段简称为段。汇编器和链接器提供一些伪指令来建立和管理各种各样的段。

2023/2/320DSP原理及应用第3章汇编语言程序开发工具3.4.1

COFF文件的基本单元

1.

段(sections)

是COFF文件中最重要的概念,一个段就是最终在存储器中占据连续空间的一个数据或代码块。每个目标文件都分成若干段,每一个段都是相互独立的。

COFF目标文件都包含以下3种形式的段:

.text

段(文本段),通常包含可执行代码;.data

段(数据段),通常包含初始化数据;.bss

段(保留空间段),通常为未初始化变量保留存储空间。2023/2/321DSP原理及应用第3章汇编语言程序开发工具3.4.1

COFF文件的基本单元

2.

段的基本类型

COFF目标文件中的段有两种基本类型。

初始化段

未初始化段(1)

初始化段初始化段中包含有数据或程序代码。主要有:

.text段——已初始化段;.data段——已初始化段;.sect段——已初始化段,由汇编器伪指令建立的自定义段。

2023/2/322DSP原理及应用第3章汇编语言程序开发工具3.4.1

COFF文件的基本单元

(2)

未初始化段

在存储空间中,为未初始化数据保留存储空间。它包括:

.bss段——未初始化段;.usect段——未初始化段,由汇编命令建立的命名段(自定义段)。2023/2/323DSP原理及应用第3章汇编语言程序开发工具3.

段与目标存储器的对应关系目标文件中的段与目标存储器之间的关系

目标文件目标存储器.bss.data.textRAME2PROMROM2023/2/324DSP原理及应用第3章汇编语言程序开发工具3.4.2

汇编器对段的处理

汇编器对段的处理是通过段伪指令来区别各个段的,并将段名相同的语句汇编在一起。

汇编器有5条伪指令可识别汇编语言程序的各个部分:

.bss

.usect

.text

.data

.sect——定义未初始化段——定义未初始化段——定义已初始化段——定义已初始化段——定义已初始化段2023/2/325DSP原理及应用第3章汇编语言程序开发工具3.4.2汇编器对段的处理

未初始化段就是在C54x存储器中保留空间,通常它们被定位在RAM区。在目标文件中,这些段中没有确切的内容。

由这些段定义的空间仅作为临时存储空间,在程序运行时,可以利用这些存储空间存放变量。

未初始化段分为默认的和命名的两种,分别由汇编器伪指令.bss和.usect产生。

1.未初始化段

2023/2/326DSP原理及应用第3章汇编语言程序开发工具(1).bss伪指令1.未初始化段

用于在bss段中保留若干个空间。

格式:.bss

符号,字数符号——保留的存储空间第一个单元的符号地址。可以让其他段引用,也可以用.global命令定义为全局符号。

字数——表示在bss段保留多少个存储单元。2023/2/327DSP原理及应用第3章汇编语言程序开发工具1.未初始化段

(2).usect伪指令

用于为指定的命名段保留若干个空间。

格式:符号.usect

“段名”,字数段名——程序员为未初始化的命名段定义的名字。2023/2/328DSP原理及应用第3章汇编语言程序开发工具3.4.2汇编器对段的处理

已初始化段中包含有可执行代码或初始化数据。

已初始化段由.text、.data和.sect三个伪指令建立。句法为:2.

已初始化段

.text[段起点]

.data[段起点]

.sect“段名”[,段起点]2023/2/329DSP原理及应用第3章汇编语言程序开发工具3.4.2汇编器对段的处理

命名段由用户指定,与默认的.text,.data和.bss段的使用相同,但它们被分开汇编。

假如一部分可执行代码(例如初始化程序)不希望和.text段分配在一起,可将它们汇编进一个命名段,这样就可定位在与.text不同的地方。

可用.usect和.sect两个伪指令产生命名段。3.

命名段(自定义段)2023/2/330DSP原理及应用第3章汇编语言程序开发工具3.

命名段

产生命名段伪指令格式:符号

.usect“段名”,字数

.sect“段名”

可以产生多达32767个不同的命名段。段名可长达200个字符。

2023/2/331DSP原理及应用第3章汇编语言程序开发工具3.4.2汇编器对段的处理

子段是较大段中的小段。子段结构可用来对存储器空间进行更紧凑的控制,使存储器空间分配更紧密。

4.

子段子段命名格式:基段名:子段名用.sect命令建立的段是已初始化的子段;用.usect命令建立的段是未初始化的子段。

例:

.sect“.text:_func”

2023/2/332DSP原理及应用第3章汇编语言程序开发工具3.4.2汇编器对段的处理

汇编器为每个段都安排了一个单独的程序计数器称之为段程序计数器SPC。SPC表示一个代码段或数据段内当前的地址。开始时汇编器将每个SPC置0。当汇编器将程序代码或数据加到段内时,增加相应的SPC值。若再继续对某个段汇编,则相应的SPC就在先前的数值上继续增加。

5.

段程序计数器SPC2023/2/333DSP原理及应用第3章汇编语言程序开发工具3.4.3

链接器对段的处理

链接器是对段处理时有2个主要任务:

将一个或多个COFF目标文件中的各种段作为链接器的输入段,经链接后产生一个可执行的COFF输出文件,并在该文件中建立各个输出段;

为各个输出段配置存储器地址。

2023/2/334DSP原理及应用第3章汇编语言程序开发工具3.4.3链接器对段的处理

链接器有2条伪指令支持上述任务:

MEMORY伪指令——用来定义目标系统的存储器空间,包括对存储器各部分命名,以及规定它们的起始地址和长度。

SECTIONS伪指令——用来指定链接器将输入段组合成输出段的方式,以及定位输出段在存储器中的位置,也可用于指定子段。

若未使用伪指令,则链接器将使用默认的方法将段放入存储空间。

2023/2/335DSP原理及应用第3章汇编语言程序开发工具1.默认的存储器分配

①将所有.text段组合在一起,形成一个.text段,并分配到程序存储器中;

②将多个目标文件中的.data段组合在一起,分配到紧接着.text段的程序存储空间中;

③将.bss段组合,配置到数据存储器中;

④组合命名段。初始化的命名段按顺序分配到紧随.data段的程序存储器,而未初始化命名段将被配置到紧随.bss段的数据存储器中。

2023/2/336DSP原理及应用第3章汇编语言程序开发工具默认的存储器分配过程:File1.obj.text.data.bsstable_1(初始化的命名段)u_vars(未初始化的命名段)File2.obj.text.data.bsstable_1(初始化的命名段)u_vars(未初始化的命名段)FFT(初始化的命名段)程序存储器数据存储器.text.text.text.data.data.data.bss.bss.bsstabletable_1table_1u_varsu_varsu_varsFFTFFT没有使用没有配置没有配置没有使用2023/2/337DSP原理及应用第3章汇编语言程序开发工具3.4.3链接器对段的处理2.段放入存储器空间

若不希望链接器将所有的.text段结合在一起形成单个的.text段,就不能采用默认的方式。若不采用默认的方式,通常需要建立一个链接器命令文件,在命令文件中用MEMORY和SECTIONS伪指令定义存储器和配置段地址。

2023/2/338DSP原理及应用第3章汇编语言程序开发工具3.4.4

程序装入

链接器产生可执行的COFF目标文件。为了脱离计算机DSP系统能单独运行,该文件必须装入目标系统存储器中。

可以采用以下方法装入程序:

使用调试工具装入程序’C54x的调试工具包括软件模拟器,XDS仿真器和集成系统CCS。它们都具有内部的装入器,调用装入器的LOAD命令,装入器将程序复制到目标系统的存储器中。

采用Hex转换工具装入程序可以使用转换工具Hex500,将可执行COFF目标文件转换成几种其他目标格式文件,然后将转换后的文件通过编程器将程序装(烧)进ROM或EPROM。

2023/2/339DSP原理及应用第3章汇编语言程序开发工具3.5汇编伪指令汇编伪指令是汇编语言程序的一个重要内容。用于为程序提供数据,并控制汇编程序如何汇编源程序。没有机器指令与它对应,是不可执行的语句。

将代码和数据汇编进指定的段●为未初始化的变量在存储器中保留空间●控制清单文件是否产生

●初始化存储器●汇编条件代码块

●定义全局变量●为汇编器指定从中可以获得宏的库●考察符号调试信息

汇编器伪指令可完成以下工作:

2023/2/340DSP原理及应用第3章汇编语言程序开发工具3.5汇编伪指令

伪指令和它所带的参数必须书写在一行。在包含汇编伪指令的源程序中,伪指令可以带有标号和注释。虽然标号一般不作为伪指令语法的一部分列出,但是有些伪指令必须带有标号,此时,标号将作为伪指令的一部分出现。

2023/2/341DSP原理及应用第3章汇编语言程序开发工具3.5汇编伪指令

’C54x汇编器共有64条汇编伪指令,根据它们的功能,可以将其分成8类:

对各种段进行定义的伪指令

如.bss、.data、.sect、.text、.usect等。

对存储器进行初始化的伪指令

如.bes、.byte、.field、.float、.int、.log、.space、.string、.pstring、.xfloat、.xlong、.word等。

2023/2/342DSP原理及应用第3章汇编语言程序开发工具3.5汇编伪指令⑶

调整SPC的伪指令

如.align等。

对输出列表文件格式化的伪指令

如.drlist、.drnolist等。

引用其他文件的伪指令

如copy、.def、.global、.include、.mlib、.ref等。

2023/2/343DSP原理及应用第3章汇编语言程序开发工具3.5汇编伪指令⑹

控制条件汇编的伪指令

如.break、.else、.elseif、.endif、.endloop、.if、.loop等。

在汇编时定义符号的伪指令

如.asg、.endstruct、.equ、.eval、.label、.set、.sruct等。

⑻执行其他功能的伪指令

如.algebraic、.emsg、.end、.mmregs、.mmsg、.newblock、.sblock、.version、.vmsg等。2023/2/344DSP原理及应用第3章汇编语言程序开发工具3.5汇编伪指令1.定义段的伪指令

用于定义相应的汇编语言程序段。

助记符及语法格式

说明

.bsssymbol,sizeinwords[,blocking][,alignment]

为未初始化的数据保留存储空间。

.text

指定.text后面的代码为文本段,通常包含可执行的代码。

.data指定.data后面的代码为数据段,通常包含初始化的数据。

.sect“sectionname”

定义初始化的命名段,可以包含可执行代码或数据。

symbol.usect“sectionname”,sizeinwords[,blocking][,alignmentflag]

为未初始化的命名段保留空间。类似.bss伪指令,但允许保留与.bss段不同的空间。

2023/2/345DSP原理及应用第3章汇编语言程序开发工具3.5.3

汇编伪指令2.常数初始化的伪指令

用于为当前的段汇编常数值。助记符及语法格式

说明

.bytevalue[,…,value]

初始化当前段中的一个或多个连续字。将8位的值放入单元中。.fieldvalue[,sizeinbits]

初始化一个可变长度的域。将单个值放入当前字的指定位域中。

.floatvalue[,…,value]

初始化一个或多个IEEE的单精度(32位)浮点数。.xfloatvalue[,…,value]

初始化一个或多个IEEE的单精度(32位)浮点数。并将它保存在当前段的两个连续的字中。不自动对准最接近的长字边界。

2023/2/346DSP原理及应用第3章汇编语言程序开发工具2.初始化常数的伪指令助记符及语法格式

说明

.intvalue[,…,value]

初始化一个或多个无符号16位整数。.shortvalue[,…,value]初始化一个或多个16位整数。.wordvalue[,…,value]

初始化一个或多个带符号16位整数。.doublevalue[,…,value]

初始化一个或多个双精度(64位)浮点数。.longvalue[,…,value]初始化一个或多个32位整数。

.string“string[,…,“string”]”

初始化一个或多个字符串。2023/2/347DSP原理及应用第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位值放入当前段的连续字中。word15

01500,100AA

00BB

.word:将一个或多个16位值放入当前段的连续字中。20CCC

.xlong:将32位值放入当前段的2个连续的字中,先存最高有效位。3,40EEE

EFFF

.long:将32位值放入当前段的2个连续的字中,先存最高有效位。6,7

EEEE

FFFF

.int:将一个或多个16位值放入当前段的连续的字中。8

DDDD

.xfloat:初始化单精度(32位)浮点数,并保存在当前段的两个连续的字中。9,A3FFF

FFAC

.float:初始化单精度(32位)浮点数,并保存在当前段的两个连续的字中。C,D3FFF

FFAC

.string:将一个或多个字符串中的8位字符放入当前段中。heE,F0068

0065lp10,11006C

00702023/2/348DSP原理及应用第3章汇编语言程序开发工具3.5汇编伪指令3.调准段程序计数器的伪指令调准段程序计数器的伪指令包括:.align伪指令和.even伪指令。助记符及语法格式

说明

.align[sizeinwords]

用于将段程序计数器(SPC)对准在1~128字的边界。

.even

用于使SPC指到下一个字的边界(偶字边界)。

2023/2/349DSP原理及应用第3章汇编语言程序开发工具3.5

汇编伪指令4.格式化输出清单文件的伪指令用于格式化输出清单文件。助记符及语法格式

说明

.drnolist用于抑制某些伪指令在清单文件中的出现。

.drlist允许.drnolist抑制的伪指令在清单文件中重新出现。

.fclist允许按源代码在清单文件中列出条件为假的代码块。汇编器默认状态。

.fcnolist只列出实际汇编的条件为真的代码块。

.lengthpagelength调节清单文件输出页面的长度。可针对不同的输出设备灵活调节输出页面的长度。

.list允许汇编器将所选择的源语句输出到清单文件。2023/2/350DSP原理及应用第3章汇编语言程序开发工具4.格式化输出清单文件的伪指令助记符及语法格式

说明

.nolist禁止汇编器将所选择的源语句输出到清单文件。

.mlist允许列出所有的宏扩展和循环块。.mnolist禁止列出所有的宏扩展和循环块。.option

{B│L│M│R│T│W│X}

用于控制清单文件的某些功能。.page把新页列在输出清单文件中。.sslist允许列出替代符号扩展。.ssnolist禁止列出替代符号扩展。.title“string”

在每页的顶部打印文件标题。.widthpagewidth调节清单文件页面的宽度。2023/2/351DSP原理及应用第3章汇编语言程序开发工具3.5

汇编伪指令5.引用其他文件的伪指令该指令主要为引用其他文件提供信息。助记符及语法格式

说明

.copy[”]filename[”]通知汇编器开始从其他文件读取源程序语句。.include[”]filename[”]通知汇编器开始从其他文件读取源程序语句。.defsymbil[,…,symbil]识别定义在当前模块中,但可被其他模块使用的符号。.globalsymbil

[,…,symbil]声明当前符号为全局符号。对定义了的符号,其作用相当于.def;对没有定义的符号,其作用相当于.ref。.refsymbil[,…,symbil]识别在当前模块中使用的,但在其他模块中定义的符号。2023/2/352DSP原理及应用第3章汇编语言程序开发工具3.5

汇编伪指令6.条件汇编伪指令

用来通知汇编器按照表达式计算出的结果的真假,决定是否对某段代码进行汇编。

有两组伪指令用于条件代码块的汇编:

(1).if/.elseif/.else/.endif伪指令

用于通知汇编器按照表达式的计算结果,对某段代码块进行条件汇编。要求表达式和伪指令必须在同一行。

(2).loop/.break/.endloop伪指令

用于通知汇编器按照表达式的计算结果重复汇编一个代码块。要求表达式和伪指令必须在同一行。

2023/2/353DSP原理及应用第3章汇编语言程序开发工具6.条件汇编伪指令助记符及语法格式

说明

.ifwell-definedexpression标记条件块的开始。仅当.if条件为真时,对紧接着的代码块进行汇编。.elseifwell-definedexpression

若.if条件为假,而.elseif条件为真时,

对紧接着的代码块进行汇编。

.elsewell-definedexpression

若.if条件为假,对紧接着的代码块进行汇编。

.endif标记条件代码块的结束,并终止该条件代码块。.loop[well-definedexpression]按照表达式确定的次数进行重复汇编的代码块的开始。表达式是循环的次数。.break[well-definedexpression]

若.break表达式为假,通知汇编器继续重复汇编;而当表达式为真时,跳到紧接着.endloop后面的代码。

.endloop

标记代码块的结束。

2023/2/354DSP原理及应用第3章汇编语言程序开发工具3.5

汇编伪指令7.定义宏的伪指令常用的定义宏的伪指令:助记符及语法格式

说明

macname.macro[parameter][,...parameter]modelstatementsormacrodirectives.endm定义宏

.endm中止宏

.varsym

[,sym2,...,sym]定义宏替代符号2023/2/355DSP原理及应用第3章汇编语言程序开发工具7.定义宏的伪指令

宏指令与子程序一样,都是重复执行某一段程序,但两者是有区别的,主要区别:

⑴宏指令和子程序都可以被多次调用,但是把子程序汇编成目标代码的过程只进行一次,而在用到宏指令的每个地方都要对宏指令中的语句逐条地进行汇编。

在调用前,由于子程序不使用参数,故子程序所需要的寄存器等都必须事先设置好;而对于宏指令来说,由于可以使用参数,调用时只要直接代入参数就行了。

2023/2/356DSP原理及应用第3章汇编语言程序开发工具【例】宏定义、宏调用和宏展开举例

1*2*add34*5*ADDRP=P1+P2+P36

7add3.macroP1,P2,P3,ADDRP8

9LDP1,A10ADDP2,A11ADDP3,A12STLA,ADDRP13.endm14

第7~14行

定义宏:add3

4个参数:P1P2P3ADDRP2023/2/357DSP原理及应用第3章汇编语言程序开发工具【例】宏定义、宏调用和宏展开举例

15

16.globalabc,def,ghi,adr1718000000add3abc,def,ghi,adr

110000001000!LDabc,A10000010000!ADDdef,A10000020000!ADDghi,A10000038000!STLA,adr

第18行

调用宏:add3

所用变量:abcdefghiadr汇编时

将变量传递给参数abc

P1def

P2ghi

P3adr

ADDRP2023/2/358DSP原理及应用第3章汇编语言程序开发工具3.5

汇编伪指令8.汇编时定义符号的伪指令用于使符号名与常数值或字符串等价。助记符及语法格式

说明

.asg[”]characterstring[”],substitutionsymbol

把一个字符串赋给一个替代符号。替代符号也可以重新被定义。

.evalwell-definedexpresion,substitutionsymbol计算一个表达式,将其结果转换成字符,并将字符串赋给替代符号。.labelsymbol定义一个特殊的符号,用来指向在当前段装载时的地址。

symbol.setvalue用于给符号赋值。符号被存放在符号表中,而且不能被重新定义。

2023/2/359DSP原理及应用第3章汇编语言程序开发工具8.汇编时定义符号的伪指令助记符及语法格式

说明

.struct

设置类似C语言的结构体。

.tag伪指令把结构体赋给一个标号。

.endstruct

结束结构体。.union建立类似C语言的union(联合)定义

.endunion结束union(联合)例:.asg AR0,INDEX_PN.set172023/2/360DSP原理及应用第3章汇编语言程序开发工具3.5

汇编伪指令9.混合伪指令助记符及语法格式

说明

.end

终止汇编,位于汇编语言源程序的最后一行。

.far_mode

通知汇编器调用为远调用。.mmregs

定义存储器映像寄存器的符号名。

.newblock用于复位局部标号。.version[value]确定运行指令的处理器,每个’C54x器件都有一个与之对应的值。.emsgstring把错误消息送到标准的输出设备。.mmsgstring把汇编时的消息送到标准的输出设备。.wmsgstring把警告消息送到标准的输出设备。2023/2/361DSP原理及应用第3章汇编语言程序开发工具3.6

链接器命令文件的编写和使用

链接命令文件用来为链接器提供链接信息,可将链接操作所需的信息放在一个文件中,这在多次使用同样的链接信息时,可以方便地调用。

在链接命令文件中,可使用MEMORY和SECTIONS伪指令,为实际应用指定存储器结构和地址的映射。

MEMORY——用来指定目标存储器结构。

SECTIONS——用来控制段的构成及存放位置。

2023/2/362DSP原理及应用第3章汇编语言程序开发工具3.6.1链接器命令文件的编写与使用链接命令文件为ASCⅡ文件,可包含以下内容:

(1)

输入文件名,用来指定要链接的目标文件。

(2)

链接器选项,它们在命令文件中的使用方法与在命令行中相同。

(3)

MEMORY和SECTIONS链接伪指令,用来指定目标存储器结构和地址分配。

(4)

赋值说明,用于给全局符号定义和赋值。2023/2/363DSP原理及应用第3章汇编语言程序开发工具

【例】链接器命令文件举例。

a.objb.obj/*输入文件名*/

-lrts.lib/*指定库文件的选项*/-oprog.out/*指定输出文件的选项*/-mprog.map/*指定map文件的选项*/

MEMORY/*MEMORY伪指令*/

{PAGE0:ROM:origin=1000h,length=0100hPAGE1:RAM:origin=0100h,length=0100h}SECTIONS/*SECTIONS伪指令*/

{.text:>ROM.data:>ROM.bss:>RAM}

2023/2/364DSP原理及应用第3章汇编语言程序开发工具注:在链接器命令文件中,不能采用下列符号作为段名或符号名:

alignDSECTlenorunALIGNflengthorgRUNattrfillLENGTHoriginSECTIONSATTRFILLloadORIGINspareblockgroupLOADpagetypeBLOCKGROUPMEMORYPAGETYPECOPYl(小写L)NOLOADrangeUNION2023/2/365DSP原理及应用

MEMORY伪指令用来规定目标存储器的结构。在实际的应用中,目标系统所配置的存储器是各不相同的,通过MEMORY伪指令,可以进行各种各样的存储器配置。第3章汇编语言程序开发工具3.6.2MEMORY伪指令的使用MEMORY伪指令的句法:

MEMORY{PAGE0:name1[(attr)]:origin=constant,length=constant;PAGEn:namen[(attr)]:origin=constant,length=constant;}

伪指令存储区间说明语句书写方式:①由大写MEMORY伪指令字开始;

②由大括号括起存储器区间的说明。存储区间:存储页面区间名称区间属性起始地址区间长度2023/2/366DSP原理及应用第3章汇编语言程序开发工具3.6.2MEMORY伪指令的使用存储区间说明语句:

PAGE:

对存储空间加以标记,每一个PAGE代表一个完全独立的地址空间。

通常,PAGE0定为程序存储器;

PAGE1定为数据存储器。

若没有设定PAGE,则链接器默认为PAGE0。2023/2/367DSP原理及应用第3章汇编语言程序开发工具3.6.2MEMORY伪指令的使用存储区间说明语句:

name:

存储器区间名称。可由用字母、$、.、_等组成。

存储器区间为内部记号,不同PAGE上的存储器区间可以取相同的名字;但在同一PAGE内的名字不能相同,且不许重叠配置。

2023/2/368DSP原理及应用第3章汇编语言程序开发工具3.6.2MEMORY伪指令的使用存储区间说明语句:

attr:

为任选项,用来为存储器区间规定属性。属性选项共有4项:

R

规定可以对存储器执行读操作。

W规定可以对存储器执行写操作。

X

规定存储器可以装入可执行的程序代码。I规定可以对存储器进行初始化。任何一个没有规定属性的存储器(包括所有默认方式的存储器)都有全部4项属性。2023/2/369DSP原理及应用第3章汇编语言程序开发工具3.6.2MEMORY伪指令的使用存储区间说明语句:

origin:用来指定存储区间的起始地址,可简写为org或o。其值可以用十进制、八进制或十六进制数表示。

Length:

用来指定存储器空间的长度,可简写为len或l,其值以字为单位,可以用十进制、八进制或十六进制数表示。2023/2/370DSP原理及应用第3章汇编语言程序开发工具【例】用MEMORY伪指令编写连接命令文件。要求:

程序存储器:起始地址为C00h,长为1000h,取名为PROG

数据存储器:起始地址为60h,长为20h,取名为DATA起始地址为80h,长为200h,取名为CHIPfile1.objfiel2.obj-oProg.outMEMORY{

PAGE0:

PROG:origin=C00h,length=1000h

PAGE1:

DATA

:origin=60h,length=20h

CHIP:origin=80h,length=200h}

两个输入文件链接命令选项伪指令页面名称区间名称起始地址区间长度2023/2/371DSP原理及应用第3章汇编语言程序开发工具【例】用MEMORY伪指令编写连接命令文件。file1.objfiel2.obj-oProg.outMEMORY{ PAGE0:

PROG:org=C00h,len=1000hPAGE1:

DATA:org=60h,len=20h

CHIP:org=80h,len=200h}

PAGE0:PROG:org=C00h,len=1000h程序存储器00000h0FFFFh00C00h1000h01BFFhPROGPAGE1:

DATA:org=60h,len=20h数据存储器00000h0FFFFh00060h0007Fh20hDATA

CHIP:org=80h,len=200h00080h200h0027FhCHIP2023/2/372DSP原理及应用第3章汇编语言程序开发工具3.6.3SECTIONS伪指令的使用用来控制输出段的构成与地址分配。指令功能:

①说明如何将输入段组合成输出段;

在可执行程序中定义输出段;③

规定输出段在存储器中的存放位置;④

允许重新命名输出段。1.

SECTIONS伪指令语法

2023/2/373DSP原理及应用第3章汇编语言程序开发工具SECTIONS伪指令的句法:

SECTIONS{name:[property,property,property,…]name:[property,property,property,…]name:[property,property,property,…]}

伪指令输出段说明语句

段名:定义输出段的名称。

属性:定义该段的内容和存储器的分配。段名1.

SECTIONS伪指令语法属性属性属性2023/2/374DSP原理及应用第3章汇编语言程序开发工具1.

SECTIONS伪指令语法段属性用来定义输出段的内容和存储地址的分配。包括的内容如下:①装入存储器分配

②运行存储器分配③输入段④

段的类型2023/2/375DSP原理及应用第3章汇编语言程序开发工具1.

SECTIONS伪指令语法①装入存储器分配

用于定义将输出段加载到存储器的什么位置。语法格式:load=allocation

或>allocation或allocationallocation:关于段地址的说明,即给段分配的存储单元。

2023/2/376DSP原理及应用第3章汇编语言程序开发工具1.

SECTIONS伪指令语法①装入存储器分配例如:

.text:load=0x1000.text:load>ROM.text:>0x80PAGE0.text:PAGE0

将.text段定位到地址0x1000开始的单元

将.text段定位到命名为ROM的存储区间

将.text段定位到地址0x80开始的单元将.text段定位到PAGE02023/2/377DSP原理及应用第3章汇编语言程序开发工具1.

SECTIONS伪指令语法②运行存储器分配

用于定义输出段在存储器的什么位置上开始运行。语法格式:run=allocation

run>allocation

2023/2/378DSP原理及应用第3章汇编语言程序开发工具1.

SECTIONS伪指令语法链接器为段在目标存储器中分配两个地址:

加载的地址和执行程序的地址。通常,这两个地址是相同的。

若要想把程序的加载区和运行区分开,先将程序加载到ROM,然后在RAM中运行,则在SECTIONS命令中让链接器对这个段定位两次即可。

例如:

.fir:load=ROM,run=RAM

2023/2/379DSP原理及应用第3章汇编语言程序开发工具1.

SECTIONS伪指令语法③输入段用于定义组成输出段的输入段。语法格式:{input_sections}

大多数情况下,在SECTIONS命令中是不列出每个输入文件的输入段的段名。

例如:

SECTIONS{.text:.data:.bss

}链接时:将所有输入文件中的所有.text段链接成.text输出段所有.data段链接成.data输出段所有.bss段链接成.bss输出段2023/2/380DSP原理及应用第3章汇编语言程序开发工具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段*/

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论