dsp第六章汇编程序_第1页
dsp第六章汇编程序_第2页
dsp第六章汇编程序_第3页
dsp第六章汇编程序_第4页
dsp第六章汇编程序_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

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

文档简介

第六章汇编语言程序设计

汇编语言——DSP的灵魂

有一位长期从事单片机开发的工程师说:“每一条汇编指令都执行了一个硬件操作。”“单片机本质上是一条条汇编语言。把一条条汇编指令搞清楚了,也就把单片机彻底掌握了。”第六章汇编语言程序设计

使用汇编语言编写程序的好处:汇编速度快、效率高、实时性好;对汇编语言的理解和掌握能使程序员写出更好的C语言代码;对汇编语言编程可精确控制DSP的时间特性;C语言存在无法控制的盲区(寄存器)第六章汇编语言程序设计汇编语言包括汇编指令、伪指令和宏指令。汇编指令即为DSP指令系统,该类指令在汇编时将产生一一对应的目标代码;伪指令仅在汇编和连接时提供控制信息和数据,并不产生目标代码;宏指令则是用户自己创建的“指令”,在汇编时将其展开并汇编为对应的目标代码汇编语言源程序经过汇编器汇编生成机器语言目标程序;再由连接器将多个目标程序连接成一个单一的可执行程序DSP汇编程序设计开发过程汇编语言程序的编辑、汇编、链接过程编辑Edit汇编dspa链接dsplnk仿真SimulatorEmulator.asm汇编源程序.obj目标文件.out输出文件.cmd连接命令文件.lst列表文件-l.map内存映像文件-m§6.1汇编语言格式

一、语言格式TMS320汇编语言源程序由源语句组成。源语句包括汇编指令、伪指令、宏指令。源语句的格式[标号][:]助记符[操作数1,操作数2,…][;注释]︸︸︸︸标号域助记符域操作数域注释域例: SYMl .set 2 ;符号SYM1等于2 BEGIN:LDP #SYMl;将2装入DP .word016h;初始化一个字为16h标号域标号域是任选域,若使用必须从源语句的第一列开始书写。标号包含1-32个字母、数字、字符,可识别符号的大小写,且规定第一个字符不能是数字;标号后可加或不加冒号(:)

;如果不使用标号,则第一个字必须是空格或分号或星号。当选用标号时,其值为段程序计数器(SPC)的当前值,标号指向与它们相关联的语句。例:行号 SPC 目标代码 源语句10 0040 000A START:.word 0Ah,3,7 0003 0007

标号START的值为40h,它指向字0Ah。2.助记符域助记符是源语句中的关键部分,不能缺省,它表示本指令的操作类型。助记符不能从源语句的第一列开始,如果从第一列开始,将被解释为标号。助记符包括下列操作码之一

汇编指令——一般用大写(例如ABS,MPYSPH); 伪指令——用“.”开始,且为小写

(例如.data,.list.set): 宏指令——同伪指令(例如.macro.endm)。3.操作数域操作数域是跟在助记符域后面的操作数列表,可缺省。如果多于两个操作数,则用逗号隔开。操作数可以是常数、符号和表达式。4.注释域注释域可以从源语句行的任一列开始并直至本行的末尾;如果它从第一列开始则可以用分号(;)或星号(*)开始,在行的其他地方开始的注释,必须以分号(;)开始。二、常数、字符串和符号1.常数汇编器支持6种类型的常数;二进制整数八进制整数十进制整数十六进制整数字符常数汇编时间常数以字母B(或b)结尾,由二进制数字(0,1)组成的数字串。长度最大为16位例:00101000b10001111B二、常数、字符串和符号1.常数汇编器支持6种类型的常数;二进制整数八进制整数十进制整数十六进制整数字符常数汇编时间常数以字母Q(或q)结尾

;由八进制数宁(0-7)组成的数字串。长度最大为6位例:103010q300000Q二、常数、字符串和符号1.常数汇编器支持6种类型的常数;二进制整数八进制整数十进制整数十六进制整数字符常数汇编时间常数以字母H(或h)结尾;由十六进制数字。0-9和A-F(或a-f)组成的数字串。长度最大为4位例:032Fh1A03H二、常数、字符串和符号1.常数汇编器支持6种类型的常数;二进制整数八进制整数十进制整数十六进制整数字符常数汇编时间常数包含在单引号中的一个或两个字

符的串。每个字符表示为8位ASCII码例:‘a’定义字符a其值为61H二、常数、字符串和符号1.常数汇编器支持6种类型的常数;二进制整数八进制整数十进制整数十六进制整数字符常数汇编时间常数用.set伪指令对符号进行赋值例:SHIFT.set3即SHIFT=32.字符串字符串是包含在双引号内的一串字符;字符在内部被表示为8位ASCII码字符中用于下列场合:

.copy“filename”中的文件名; .sect“sectionname”中的段名; .byte“charstring”中数据初始化伪指令 .string伪指令的操作数。3.符号符号被用做标号、常数及替代符号;符号名最多可由32个字母和数字混合组成;符号的第一个字符不能是数字,符号内不能有空格;由户定义的符号分大小写例如汇编时ABc、Abc、abc被识别为3个不同的符号。用汇编器选项(-C)可消除对大小写的识别。§6.2伪指令伪指令仅在汇编和连接时提供控制信息和数据,并不产生目标代码;TMS320C2000的汇编伪指令的功能:汇编代码和数据到指定的段;为未定义的变量保存空间;控制列表文件;分配存储器;汇编条件块;定义全局变量;指定汇编器能得到的宏;检查符号调试信息。

伪指令分为8类。 1)段定义伪指令 2)初始化常数伪指令 3)段程序计数器排列伪指令 4)输出列表格式伪指令 5)引用其他文件伪指令 6)条件汇编伪指令 7)汇编时的符号伪指令 8)其他伪指令

共有五条伪指令

.bss ·data .text .sect ·usect

把汇编语句程序的各部分与适当的段联系起来

伪指令分为8类。 1)段定义伪指令 2)初始化常数伪指令 3)段程序计数器排列伪指令 4)输出列表格式伪指令 5)引用其他文件伪指令 6)条件汇编伪指令 7)汇编时的符号伪指令 8)其他伪指令

这类伪指令为当前段汇编数值。例 .int .word .long .byte .string

伪指令分为8类。 1)段定义伪指令 2)初始化常数伪指令 3)段程序计数器排列伪指令 4)输出列表格式伪指令 5)引用其他文件伪指令 6)条件汇编伪指令 7)汇编时的符号伪指令 8)其他伪指令

可使段程序计数器SPC指向预定的位置共有两条伪指令

.align .even

伪指令分为8类。 1)段定义伪指令 2)初始化常数伪指令 3)段程序计数器排列伪指令 4)输出列表格式伪指令 5)引用其他文件伪指令 6)条件汇编伪指令 7)汇编时的符号伪指令 8)其他伪指令

该类伪指令控制列表文件的格式。

伪指令分为8类。 1)段定义伪指令 2)初始化常数伪指令 3)段程序计数器排列伪指令 4)输出列表格式伪指令 5)引用其他文件伪指令 6)条件汇编伪指令 7)汇编时的符号伪指令 8)其他伪指令

该类伪指令为文件提供信息或提供这些文件的信息。

伪指令分为8类。 1)段定义伪指令 2)初始化常数伪指令 3)段程序计数器排列伪指令 4)输出列表格式伪指令 5)引用其他文件伪指令 6)条件汇编伪指令 7)汇编时的符号伪指令 8)其他伪指令

这类伪指令使汇编器根据表达式求值结果的真或假来汇编代码的某些段。

伪指令分为8类。 1)段定义伪指令 2)初始化常数伪指令 3)段程序计数器排列伪指令 4)输出列表格式伪指令 5)引用其他文件伪指令 6)条件汇编伪指令 7)汇编时的符号伪指令 8)其他伪指令

该类伪指令使定义的符号名等同于常数值或字符串例 .set .equ .struct .endstruct

常用的伪指令

终止源程序汇编伪指令.end

赋值伪指令.set和.equ

句法:符号.set数值 符号.equ

数值

例: DAC0.set0001h;DAC0=0001h

存储16位字伪指令.int

和.word

句法;.int

数值1[,…,数值n] .word数值1[,…,数值n]

例:.word11h,22h,33h

定义标题伪指令.title

句法:.title“字符串”

例: .title“example

定义代码段伪指令.text

创建一个可执行的代码段。(即为汇编程序正文,通常称为.text段)

定义数据段伪指令.data

创建一个已初始化数据段。(通常称为.data段)

在存储器中为变量保留空间伪指令.bss

创建一个未初始化数据段。(即保留一个数据空间,通常称.bss段)

定义初始化命名段伪指令.sect

创建一个可定义段名的已初始化数据段。句法:.sect“段名”

为未命名段中的变量保留空间伪指令.usect

创建一个可定义段名的未初始化数据段句法:.usect“段名”,长度*******************exmple.asm****************** .datacoeff .word 011h,022h,033h

.bss var1,1 ;reservespace .bss buffer,10 ;fortwovariablesptr .word 1234h .textadd: LACC 0Fhaloop: SUB #1 BCND aloop,LEQ SACL var1,0 .dataivals .word 0AAh,0BBhvar2 .usect “newvars”,1inbuf .usect “newvars”,7 .text ADD #0FFh§6.3宏指令为了简化汇编语言程序的书写,常把一些频繁出现的程序段定义为宏指令当程序需要执行这一段程序段时只要一条宏调用语句,减少汇编语言程序的重复书写TMS320系列DSP汇编器支持宏指令 (1)宏定义 (2)宏调用 举例(1)宏定义格式:宏名.macro[形式参数1],[形式参数2],[形式参数3]…宏体.endm§6.3宏指令为了简化汇编语言程序的书写,常把一些频繁出现的程序段定义为宏指令当程序需要执行这一段程序段时只要一条宏调用语句,减少汇编语言程序的重复书写TMS320系列DSP汇编器支持宏指令 (1)宏定义 (2)宏调用 举例(2)宏调用格式:宏名 [实参数1],实参数2],[实参数3]…

§6.3宏指令为了简化汇编语言程序的书写,常把一些频繁出现的程序段定义为宏指令当程序需要执行这一段程序段时只要一条宏调用语句,减少汇编语言程序的重复书写TMS320系列DSP汇编器支持宏指令 (1)宏定义 (2)宏调用 举例例1宏定义:parms .macro x,y,z LACC x ADDy ADDCz .endm宏调用: parms 55,66,77例2:宏定义:KICK_DOG .macro ;看门狗复位宏定义 LDP #00E0h ;DP→7000h~707Fh SPLK #055h,WDKEY ;WDCNTR由下一步复位被使能 SPLK #0AAh,WDKEY ;WDCNTR被复位 .endm

宏调用:

KICK_DOG例3:宏定义:DELAY_S .macro delay_value ;延时=0.05μs×delay_value RPT#delay_value NOP .endm

宏调用:

DELAY_S

20 ;延时=1μs§6.3宏指令宏调用与子程序的区别:1)宏调用与子程序都可以被多次调用,但在程序汇编时,子程序只在一个地方形成目标代码,而宏调用在每个调用的地方都形成相应的目标代码(即只省汇编指令,不省目标代码)2)宏调用使用参数,而子程序不使用参数

§6.4公共目标文件格式COFF

TMS320系列DSP的目标文件格式为公共目标文件格式 (COFF:CommonObjectFileFormat)采用这种目标文件格式的优点:将指令和数据按照段的概念进行组织和存储;程序可读性大大增强;编写程序更容易;便于程序的移植;有利于进行模块化的程序设计;为管理代码段及系统存储器提供了灵活的方法和手段。

COFF鼓励用户在编写汇编语言程序时使用代码块和数据块,这些块被称为段一、段段是目标文件中的最小单位。在存储器中占据连续空间的一块代码和数据。每个段都是相互独立分开的。COFF目标文件包含三个默认的段:

文本段:用.text伪指令来定义,该段通常包含可执行代码

数据段:用.data伪指令来定义,该段通常包含巳初始化数据

预留段:用.bss伪指令来定义,该段是为未初始化的数据保留空间 另外还有两个自定义段: 用.sect伪指令来定义一个自定义数据段 用..usect伪指令来定义一个自定义预留段COFF目标文件的段分为两大类:

已初始化段 未初始化段。

有明确内容存储在目标文件中;该段的值是不可修改的是建立在程序存储器中通常包含程序代码、常数表格和数据已初始化段包括:

.text段(文本段)

.data段(数据段) 用.sect创建的自定义段COFF目标文件的段分为两大类:

已初始化段 未初始化段。

在存储器中保留空间;在目标文件中没有实际内容;运行程序时用于存储变量

建立在片内或片外RAM中未初始化段包括:

.bss段 用.usect创建的自定义段各段在存储器中的定位

.text.data.bss.sect自定义段.usect自定义段ROMRAM二、汇编器对段的处理汇编器根据定义段的伪指令来识别汇编程序中的各个部分: 未初始化段: .bss .usect 已初始化段: .text .data .sect格式:.bss符号,字数符号——保留存储器空间第一个字的变量名;字数——保留存储器空间的字长例:

.bss var1,5在存储器中保留5个字的空间,第一个字的变量名为var1二、汇编器对段的处理汇编器根据定义段的伪指令来识别汇编程序中的各个部分: 未初始化段: .bss .usect 已初始化段: .text .data .sect格式:符号.usect“段名”,字数符号——保留存储器空间第一个字的变量名;字数——保留存储器空间的字长段名——用户为自定义段起的名字例:var2.usect“newvars”,7在存储器中保留7个字的空间,段名为newvars,第一个字的变量名为var2二、汇编器对段的处理汇编器根据定义段的伪指令来识别汇编程序中的各个部分: 未初始化段: .bss .usect 已初始化段: .text .data .sect

.text

段包含可执行代码

.data

和.sect(自定义段)包含已初始化数据已初始化段的内容在目标程序中,并定位到ROM中每个初始化段可重新定位(实际地址不确定)

每个初始化段的编写可以是不连续的,通过汇编器可以把相同的段汇编在一起。二、汇编器对段的处理汇编器根据定义段的伪指令来识别汇编程序中的各个部分: 未初始化段: .bss .usect 已初始化段: .text .data .sect段程序计数器(SPC):

汇编器为每个段设立独立的程序计数器,即段程序计数器

SPC即为文本段或数据段的当前地址。起始值为0*******************exmple.asm******************

.datacoeff .word 011h,022h,033h ;创建.data段

.bss var1,1 ;在.bss段中为两个 .bss buffer,10 ;变量保留空间ptr .word 1234h ;继续建.data段

.text ;创建.text段add: LACC 0Fhaloop: SUB #1 BCND aloop,LEQ SACL var1,0

.data ;继续创建.data段ivals .word 0AAh,0BBhvar2 .usect “newvars”,1;创建自定义段newvarsinbuf .usect “newvars”,7;为两个变量保留空间 .text ;继续创建.text段 ADD #0FFh*******************exmple.asm******************SPC 代码 0000 .data0000 0011 coeff .word 011h,022h,033h ;创建.data段00010022 0002 00330000 .bss var1,1 ;在.bss段中为两个0001 .bss buffer,10 ;变量保留空间0003 0123 ptr .word 0123h ;继续建.data段 0000 .text ;创建.text段0000 100f add: LACC 0Fh0001 bfa0 aloop: SUB #1h0002 00010003 e3cc BCND aloop,LEQ0004 0001 0005 9000 SACL var1,

0004 .data ;继续创建.data段0004 00aa ivals .word 0AAh,0BBh0005 00bb 0000 var2 .usect “newvars”,1 ;创建自定义段newvars0001 inbuf .usect “newvars”,7;为两个变量保留空间000 6 .text ;继续创建.text段0006 b8ff ADD #0FFh例中:创建了四个段 1).text段——7个字的目标代码 2).data段——6个字的数据 3).bss段——在存储器中保留11个字 4)newvars段——自定义段,在存储器中保留8个字100fbfa00001e3cc00019000b8ff.text001100220033123400AA00BB.data保留11个字.bss保留8个字newvars三、链接器对段的处理

链接器对段的处理要完成两个功能:把一个或多个目标文件(文件名.obj)的各个段作为链接的输入段,经连接产生可执行的COFF输出文件(文件名.out),在其中建立各个输出段。为输出文件的各个输出段确定存储器地址链接器使用两个命令来支持上述任务:MEMORY——来定义目标系统的存储器配置SECTIONS——告诉连接器怎样组合输入段以及输出段放在存储器的位置.text.data.bsstable_1初始化段u_vars未初始化段file1.objtable_1初始化段.text.data.bsstable_1初始化段u_vars未初始化段file2.objtable_1初始化段FFT初始化段file1.textfile2.textfile1.datafile2.datafile1table_1file2table_1file2FFTunusedfile1.bssfile2.bssfile1u_varsfile2u_varsunusedRAMROM

文件的链接

重定位连接器在处理每一个段时,原来的段地址都是从地址0000开始,所有可重定位符号(标号)均相对于它们的段内地址。连接器通过下列措施来重定位段 1)把各段定位到存储器内,从适当的地址开始; 2)调整符号(标号)值对应于新的段地址; 3)调整对已重定位符号的引用,以便反映调整后的符号值汇编器在需要引用重新定位的符号处留了重定位的入口;连接器在符号重定位时,利用这些入口修正对符号的引用;例:重定位前 重定位后SPC 代码 PC 代码 .ref X0000 .text0000 7980 B Y 0200 79800001 0004’

0201 02040002 bf80 LACC X 0202 bf8000030000!

0203 00100004 be22 Y: IDLE 0204 be22说明:1)X,Y都是需重定位的,Y在本模块定义,X在另一个模块定义;2)程序进行汇编时,X值为0(外部引用),Y值为0004(段内地址)3)形成两个重定位入口:X,Y .text段对X的引用是外部引用(列表文件中用“!”表示) 对Y的引用是内部引用(列表文件中用“’”表示) 4)假设:X被重定位到地址10h .text段被重定位后从地址0200h开始四、外部符号的定义与引用所谓外部符号是在一个模块定义,在另一个模块引用的符号外部符号定义与引用的伪指令:

.def——在当前模块中定义,并可在别的模块中使用的符号 .ref——在当前模块中使用,但在别的模块中定义的符号 .global——全局符号例: .def X ;定义X .ref Y ;引用YX: ADD 056h MPY Y§6.5程序的汇编汇编程序(汇编器)是将汇编语言源程序转换成COFF的机器语言目标文件汇编器的功能:将汇编语言源程序汇编成可重定位的目标文件(.obj文件)如果需要的话,可生成一个列表文件(.lst文件)将程序代码分成若干个段,每个段的目标代码都有一个段程序计数器(SPC)来管理定义和引用符号,需要的话可形成一张交叉引用表汇编程序(汇编器)的运行dspa [inputfile[objectfile[listingfile]]][-options]dspa——汇编程序名

§6.5程序的汇编汇编程序(汇编器)是将汇编语言源程序转换成COFF的机器语言目标文件汇编器的功能:将汇编语言源程序汇编成可重定位的目标文件(.obj文件)如果需要的话,可生成一个列表文件(.lst文件)将程序代码分成若干个段,每个段的目标代码都有一个段程序计数器(SPC)来管理定义和引用符号,需要的话可形成一张交叉引用表汇编程序(汇编器)的运行dspa [inputfile[objectfile[listingfile]]][-options]inputfile——输入汇编语言源程序文件名(.asm文件)(扩展名可省缺)§6.5程序的汇编汇编程序(汇编器)是将汇编语言源程序转换成COFF的机器语言目标文件汇编器的功能:将汇编语言源程序汇编成可重定位的目标文件(.obj文件)如果需要的话,可生成一个列表文件(.lst文件)将程序代码分成若干个段,每个段的目标代码都有一个段程序计数器(SPC)来管理定义和引用符号,需要的话可形成一张交叉引用表汇编程序(汇编器)的运行dspa [inputfile[objectfile[listingfile]]][-options]objectfile——命名创建的目标文件名(.obj文件)(若不提供文件名,则以“输入文件名.obj”来命名)§6.5程序的汇编汇编程序(汇编器)是将汇编语言源程序转换成COFF的机器语言目标文件汇编器的功能:将汇编语言源程序汇编成可重定位的目标文件(.obj文件)如果需要的话,可生成一个列表文件(.lst文件)将程序代码分成若干个段,每个段的目标代码都有一个段程序计数器(SPC)来管理定义和引用符号,需要的话可形成一张交叉引用表汇编程序(汇编器)的运行dspa [inputfile[objectfile[listingfile]]][-options]listingfile——命名产生的列表文件名(.lst文件)(若不提供文件名,则以“输入文件名.lst”来命名)§6.5程序的汇编汇编程序(汇编器)是将汇编语言源程序转换成COFF的机器语言目标文件汇编器的功能:将汇编语言源程序汇编成可重定位的目标文件(.obj文件)如果需要的话,可生成一个列表文件(.lst文件)将程序代码分成若干个段,每个段的目标代码都有一个段程序计数器(SPC)来管理定义和引用符号,需要的话可形成一张交叉引用表汇编程序(汇编器)的运行dspa [inputfile[objectfile[listingfile]]][-options] -options——选项例: -l 产生列表文件

-x 产生交叉引用表列表文件:1 0000 .data2 0001 0011 coeff .word 011h,022h,033h ;创建.data段 00020022 0003 00333 0000 .bss var1,1 ;在.bss段中为两个4 0001 .bss buffer,10 ;变量保留空间5 0003 0123 ptr .word 0123h ;继续建.data段

6 0000 .text ;创建.text段7 0000 200f add: LAC 0Fh8 0001 d003 aloop: SBLK #1 0002 00018 0003 f280 BLEZ aloop 0004 0001 9 0005 6000 SACL var1,010 0004 .data ;继续创建.data段11 0004 00aa ivals .word 0AAh,0BBh 0005 00bb ︸︸ ︸

︸行号 SPC目标代码 源程序语句§6.6程序的链接链接器的主要任务: 根据链接命令或链接命令文件(.cmd文件)把1个或多个目标文件(文件名.obj)链接起来,生成可执行的输出文件(文件名.out)和存储器映像文件(.map文件)链接器所做工作:把各个段配置到目标系统的存储器对段和符号进行重定位,给它们指定一个最终的地址解决输入文件之间未定义的外部引用链接器的运行: dsplnkfile1.objfile2.obj-ofile.out或 dsplnklinker.cmd

链接命令文件链接命令文件的扩展名为.cmd,包含以下内容: 1)输入文件名:要链接的目标文件、归档库文件或其他命令文件 2)链接器选项 3)MEMORY和SECTIONS链接器伪指令 4)赋值语句:定义并赋值给全局符号 5)注释:用/*和*/定界符加注释链接命令文件(.cmd文件)举例:a.Objb.objc.obj /*inputfilename*/-oprog.out-mprog.map /*options*/MEMORY{ RAM: origin=0100hlength=0100h ROM: origin=0200hlength=0100h}SECTIONS{ .text >ROM .data >ROM .bss >RAM}

MEMORY伪指令MEMORY伪指令用于规定目标存储器的模型,定义用户系统所包含的存储器的形式,以及占据的地址范围TMS320C2000芯片的型号不同,其存储器的配置是不相同的。通过MEMORY伪指令可以进行不同型号芯片存储器的配置MEMORY伪指令的一般句法:MEMORY(大写){ PAGE0:name1[(attr)]:origin=constant,length=constant; …… PAGEn:name1[(attr)]:origin=constant,length=constant;}PAGE:定义一个存储器空间,最多可定义255页通常PAGE0定义为程序存储器

PAGE1

定义为数据存储器

PAGE2

定义为I/O空间不使用PAGE选项,则链接器默认为PAGE0一个PAGE代表一个完全独立的地址空间。PAGE0上配置的存储器可以和PAGE1上已配置的存储器交叠

MEMORY伪指令MEMORY伪指令用于规定目标存储器的模型,定义用户系统所包含的存储器的形式,以及占据的地址范围TMS320C2000芯片的型号不同,其存储器的配置是不相同的。通过MEMORY伪指令可以进行不同型号芯片存储器的配置MEMORY伪指令的一般句法:

MEMORY(大写) {

PAGE0:name1[(attr)]:origin=constant,length=constant; …… PAGEn:name1[(attr)]:origin=constant,length=constant; }name:对存储器区域取名,有1-8个字符组成名字对链接器没有特殊意义,仅标识通常存储器的区域范围不同PAGE上的存储器范围可以取相同的名字,但同一PAGE内的存储器范围不能有相同的名字,且不能重叠

MEMORY伪指令MEMORY伪指令用于规定目标存储器的模型,定义用户系统所包含的存储器的形式,以及占据的地址范围TMS320C2000芯片的型号不同,其存储器的配置是不相同的。通过MEMORY伪指令可以进行不同型号芯片存储器的配置MEMORY伪指令的一般句法:

MEMORY(大写) {

PAGE0:name1[(attr)]:origin=constant,length=constant; …… PAGEn:name1[(attr)]:origin=constant,length=constant; }attr(属性):(可选项)为已命名的存储器区间规定1-4个属性

R——规定对存储器可读;

W——规定对存储器可写;

X——规定存储器可装入可执行代码;

I——规定存储器可进行初始化任何没有规定属性的存储器都具有全部四项属性

MEMORY伪指令MEMORY伪指令用于规定目标存储器的模型,定义用户系统所包含的存储器的形式,以及占据的地址范围TMS320C2000芯片的型号不同,其存储器的配置是不相同的。通过MEMORY伪指令可以进行不同型号芯片存储器的配置MEMORY伪指令的一般句法:

MEMORY(大写) {

PAGE0:name1[(attr)]:origin=constant,length=constant; …… PAGEn:name1[(attr)]:origin=constant,length=constant; }origin:指定一个存储器区域的起始地址也可写成org或o

MEMORY伪指令MEMORY伪指令用于规定目标存储器的模型,定义用户系统所包含的存储器的形式,以及占据的地址范围TMS320C2000芯片的型号不同,其存储器的配置是不相同的。通过MEMORY伪指令可以进行不同型号芯片存储器的配置MEMORY伪指令的一般句法:

MEMORY(大写) {

PAGE0:name1[(attr)]:origin=constant,length=constant; …… PAGEn:name1[(attr)]:origin=constant,length=constant; }length:指定一个存储器区域的长度也可写成len

或l例:所定义的存储器映像VECSPROG未定义PAGE00000h003Fh0040hFF3FhFF40hFFFFhMMRS未定义PAGE10000h005Fh0060h03FFhFFFFhB2B0B1未定义007Fh

0200h02FFh0300hMEMORY{ PAGE0:VECS: origin=0h,length=0040h PROG: origin=40h,length=0FF00h PAGE1:MMRS: origin=0h,length=0060h B2: origin=60h,length=20h B0: origin=200h,length=100h B1: origin=300h,length=100h}

SECTIONS伪指令SECTIONS伪指令的功能:描述如何将输入段组合成输出段定义在执行程序中的输出段规定输出段在存储器中存放的位置允许重新命名输出段SECTIONS伪指令的一般句法:

SECTIONS(大写){段名1:[特性1,特性2,……]段名2:[特性1,特性2,……]……}输出段段名段名后面是段的特性说明:

段的内容段的分配存储器地址特性可以若干个,用逗号隔开

SECTIONS伪指令SECTIONS伪指令的功能:描述如何将输入段组合成输出段定义在执行程序中的输出段规定输出段在存储器中存放的位置允许重新命名输出段SECTIONS伪指令的一般句法:

SECTIONS(大写) {

段名1:[特性1,特性2,……] 段名2:[特性1,特性2,……] …… }特性选项:(1)装载地址:规定段将被装载在存储器中的地址句法:load=allocation或allocation或{}>allocationallocation是MEMORY伪指令定义的地址

SECTIONS伪指令SECTIONS伪指令的功能:描述如何将输入段组合成输出段定义在执行程序中的输出段规定输出段在存储器中存放的位置允许重新命名输出段SECTIONS伪指令的一般句法:

SECTIONS(大写) {

段名1:[特性1,特性2,……] 段名2:[特性1,特性2,……] …… }特性选项:(2)运行地址:定义段在存储器内运行的地址句法:run=allocation或run>allocation如果在一个段中load和run的地址相同,run可省略。通常load和run的地址相同。

SECTIONS伪指令SECTIONS伪指令的功能:描述如何将输入段组合成输出段定义在执行程序中的输出段规定输出段在存储器中存放的位置允许重新命名输出段SECTIONS伪指令的一般句法:

SECTIONS(大写) {

段名1:[特性1,特性2,……] 段名2:[特性1,特性2,……] …… }特性选项:(3)输入段:定义组成输出段的输入段句法:{input_sections}

SECTIONS伪指令SECTIONS伪指令的功能:描述如何将输入段组合成输出段定义在执行程序中的输出段规定输出段在存储器中存放的位置允许重新命名输出段SECTIONS伪指令的一般句法:

SECTIONS(大写) {

段名1:[特性1,特性2,……] 段名2:[特性1,特性2,……] …… }特性选项:(4)段类型:定义特定段类型的标志句法:type=COPYtype=DSECTtype=NOLOAD

SECTIONS伪指令SECTIONS伪指令的功能:描述如何将输入段组合成输出段定义在执行程序中的输出段规定输出段在存储器中存放的位置允许重新命名输出段SECTIONS伪指令的一般句法:

SECTIONS(大写) {

段名1:[特性1,特性2,……] 段名2:[特性1,特性2,……] …… }特性选项:(5)填充值:定义用于填充未初始化单元的数值句法:fill=valuename:…{…}=value例:SECTIONS{ .reset:{}>VECSPAGE0 .vectors: {}>VECSPAGE0 .start: {}>PROGPAGE0 .text:{}>PROGPAGE0 .data:{}>PROGPAGE0 .mmrs:{}>MMRSPAGE1 .bss:{}>B2PAGE1 .blk0:{}>B0PAGE1 .blk1:{}>B1PAGE1 .blk2:{}>B2PAGE1} MEMORY{PAGE0:VECS: origin=0h,length=0040h PROG: origin=40h,length=0FF00hPAGE1:MMRS:origin=0h,length=0060h B2: origin=60h,length=20h B0: origin=200h,length=100h B1: origin=300h,length=100h}

在省缺MEMORY和SECTIONS的情况下,链接器的默认处理:将所有.text输入段链接成一个.text输出段;将所有.data输入段组合成一个.data输出段,并将.text

温馨提示

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

评论

0/150

提交评论