资源描述
6.1 汇编语言格式汇编语言格式 TMS320汇汇编编语语言言源源程程序序由由源源语语句句组组成成。源源语语句句包包括括汇汇编编指指令令、伪伪指令、宏指令。指令、宏指令。源语句的一般格式为源语句的一般格式为标号标号:助记符助记符 操作数操作数1,操作数,操作数2,;注释注释标号域标号域 助记符域助记符域 操作数域操作数域 注释域注释域注:注:“”表示该项可缺省。表示该项可缺省。例例6.1 SYM1 .set 2 ;符号符号SYM1等于等于2 BEGIN:LDP SYM1 ;将将2装入装入DP .word 016h ;初始化一个字为初始化一个字为16h 1、标号域、标号域标标号号包包含含132个个字字母母、数数字字、字字符符(AZ,a2,09,及及$),可可识识别别符符号号的的大小写,且规定第一个字符不能是数字。大小写,且规定第一个字符不能是数字。标号可以后随冒号标号可以后随冒号(:),冒号并不作为标号的一部分被处理。,冒号并不作为标号的一部分被处理。如果不使用标号,则第一个字必须是空格或分号或星号。如果不使用标号,则第一个字必须是空格或分号或星号。当当选选用用标标号号时时,其其值值是是段段程程序序计计数数器器(SPC)的的当当前前值值,标标号号指指向向与与它它们们相相关关联联的的语语句。例如,如果用句。例如,如果用.word伪指令初始化几个字,那么标号将指向第一个字。伪指令初始化几个字,那么标号将指向第一个字。行号行号 SPC 目标代码目标代码 源语句源语句10 0040 000A START:.word 0Ah,3,7 0041 0003 0042 0007标号也可以单独出现在行中,此时它指向下一行中的指令。如:标号也可以单独出现在行中,此时它指向下一行中的指令。如:3 0050 HERE:4 0050 0003 .word 3 ;此行此行SPC无增量无增量2、助记符域、助记符域 助助记记符符是是源源语语句句中中的的关关键键部部分分,不不能能缺缺省省,它它表表示示本本指指令令的的操操作作类类型型。助助记记符符不不能能从从源源语语句句的的第第一一列列开开始始,如如果果从从第第一一列列开开始始,将将被解释为标号。被解释为标号。助记符包括下列操作码之一:助记符包括下列操作码之一:(1)汇编指令汇编指令(例如例如ABS,MPY,SPH);(2)伪指令伪指令(例如例如.data,.fist,.set);(3)宏指令宏指令(例如例如.macro,.mexit)。3、操作数域、操作数域 操操作作数数域域是是跟跟在在助助记记符符域域后后面面的的操操作作数数列列表表,可可缺缺省省。如如果果多多于于两两个操作数,则只用逗号隔开。操作数可以是常数、符号和表达式。个操作数,则只用逗号隔开。操作数可以是常数、符号和表达式。4、注释域、注释域注注释释域域可可以以从从源源语语句句行行的的任任一一列列开开始始并并直直至至本本行行的的末末尾尾,即即仅仅包包括括注注释释的的源源语语句句是是有有效效的的。如如果果它它从从第第一一列列开开始始则则可可以以用用分分号号(;)或或星号星号(*)开始;在行的其他地方开始的注释,必须以分号开始。开始;在行的其他地方开始的注释,必须以分号开始。上述各个域必须用一个或多个空格分开。上述各个域必须用一个或多个空格分开。6、1、1 常数、字符串和符号常数、字符串和符号(1)二二进进制制整整数数:以以字字母母B(或或b)结结尾尾,由由二二进进制制数数字字(0,1)组组成成的的数数字字串串。数数字串长度长度最多可达字串长度长度最多可达16个二进制数字,如个二进制数字,如01000110B。(2)八八进进制制整整数数:以以字字母母Q(或或q)结结尾尾,由由八八进进制制数数字字(07)组组成成的的数数字字串串。数数字串长度最多可达字串长度最多可达6个八进制数字,如个八进制数字,如100000Q。(3)十十进进制制整整数数:以以字字母母D(或或d)结结尾尾(也也可可缺缺省省),十十进进制制整整数数由由09数数字字组组成成,范围从范围从-3267865535,如,如-30000。(4)十十六六进进制制整整数数:以以字字母母H(或或h)结结尾尾,由由十十六六进进制制数数字字09和和AF(或或af)组组成的数字串。数字串长度最多可达成的数字串。数字串长度最多可达4个十六进制数字。个十六进制数字。(5)字字符符常常数数:包包含含在在单单引引号号中中的的一一个个或或两两个个字字符符的的串串。每每个个字字符符表表示示为为8位位ASCII码,如码,如a定义字符定义字符a,并在内部用并在内部用61H表示。表示。(6)汇汇编编时时间间常常数数:用用.set伪伪指指令令对对符符号号进进行行赋赋值值,赋赋值值的的内内容容不不同同,汇汇编编时时符号所表达的含义也就不同。符号所表达的含义也就不同。1、常数、常数例例如如,用用.set向向符符号号赋赋值值,则则符符号号成成为为常常数数,为为了了在在表表达达式式中中使用此常数,赋予它的值必须是绝对值。使用此常数,赋予它的值必须是绝对值。SHIFT .set 3 LACC *,SHIFT,AR1也也可可用用.set将将寄寄存存器器名名赋赋予予符符号号常常数数,此此时时符符号号与与寄寄存存器器为为同同一一词,如:词,如:AUXR1 .set AR1 LACC *,0,AUXR12、字符串、字符串 字字符符串串是是包包含含在在双双引引号号内内的的一一串串字字符符,双双引引号号是是字字符符串串的的一一部部分分。串串的的最最大大长长度度是是变变化化的的,并并由由每每一一个个使使用用字字符符串串的的伪伪指指令令定定义义。字字符符在在内内部部被被表表示示为为8位位ASCII字字符符,如如:“sample program”定定义义13个个字字符符的的字字符符串串sample program。字符串用于下列场合:字符串用于下列场合:(1).copy “filename”中的文件名;中的文件名;(2).sect “section name”中的段名;中的段名;(3).byte “chasing”中数据初始化伪指令;中数据初始化伪指令;(4).string伪指令的操作数。伪指令的操作数。字符串与字符常数不同,字符常数代表一个单独的整数值,而字符字符串与字符常数不同,字符常数代表一个单独的整数值,而字符串是字符的列表。串是字符的列表。3、符号、符号 符符号号被被用用做做标标号号、常常数数及及替替代代符符号号。符符号号名名最最多多可可由由32个个字字母母和和数数字字混混合合组组成成(AZ,az,09,$和和_)。符符号号的的第第一一个个字字符符不不能能是是数数字字,符符号号内内不不能能有有空空格格。用用户户定定义义的的符符号号分分大大小小写写,例例如如汇汇编编时时ABC,Abc及及abc被识别为被识别为3个不同的符号。个不同的符号。表达式由运算符、常数和符号组成。有效表达式值的范围是表达式由运算符、常数和符号组成。有效表达式值的范围是-32768+32767。6 6、1 1、2 2 表达式和运算符表达式和运算符 表达式内使用的运算符的优先级见下表:表达式内使用的运算符的优先级见下表:高组运算符说明优先级1+-取正取负求反 低2*/%乘除求模左移右移3+-|&加减按位逻辑异或按位逻辑或按位逻辑与4=或=!=小于大于小于或等于大于或等于等于不等于6.2 宏指令宏指令 为了简化汇编语言源程序的书写,常常将一些频繁出现的程序段定为了简化汇编语言源程序的书写,常常将一些频繁出现的程序段定义为宏指令。义为宏指令。TMS320系列系列DSP汇编器支持宏语言。使用宏的过程要经过以下汇编器支持宏语言。使用宏的过程要经过以下3个步骤。个步骤。(1)定定义义宏宏:用用户户在在使使用用宏宏之之前前必必须须先先定定义义宏宏。在在程程序序的的任任何何地地方方都都可可以以定定义义一一个个宏宏。一一般般是是在在源源文文件件开开始始处处定定义义,或或者者在在.include.copy文件中定义,或者在宏库中定义。文件中定义,或者在宏库中定义。宏定义语句格式如下:宏定义语句格式如下:宏名宏名 .macro形式参数形式参数1,形式参数,形式参数2,形式参数,形式参数n .mexit .endm(2)调调用用宏宏:在在定定义义了了宏宏以以后后,就就可可以以在在源源程程序序中中将将宏宏的的名名字字作作为为操操作作码码来调用。来调用。格式:格式:宏名宏名 实参数实参数1,实参数,实参数2,实参数,实参数n(3)展展开开宏宏:汇汇编编器器在在对对源源文文件件进进行行汇汇编编时时,对对调调用用的的宏宏进进行行展展开开。在在展展开开过过程程中中,汇汇编编器器用用宏宏体体取取代代宏宏调调用用语语句句,宏宏体体中中的的形形式式参参数数(替替代代符号符号)用实际参数代替。用实际参数代替。如如果果某某个个形形式式参参数数没没有有对对应应的的实实参参数数为为其其赋赋值值,该该形形式式参参数数将将被被空空串串(“”)代替。代替。如如果果实实参参数数的的个个数数多多于于形形式式参参数数,则则余余下下的的实实参参数数将将赋赋给给最最后后一一个个形形式参数式参数(用逗号隔开用逗号隔开)。如如果果要要把把一一串串变变量量赋赋给给一一个个形形式式参参数数,或或者者把把一一个个逗逗号号(或或分分号号)传传给给一个形式参数,就必须用引号将它们引起来。一个形式参数,就必须用引号将它们引起来。汇汇编编时时,汇汇编编器器先先用用实实参参数数代代替替形形式式参参数数并并展展开开宏宏,然然后后把把源源语语句句汇汇编为目标代码,编为目标代码,并输出到列表文件中。并输出到列表文件中。例例 宏定义:宏定义:parms .macro x,y,z a=x b=y c=z .endm调用宏:调用宏:汇编时展开宏汇编时展开宏 parms 100,200 ;a=100 ;b=200;c=“”parms “100,200,300”,55,66,77 ;a=“100,200,300”;b=55;c=66,77 6.3 通用目标文件格式通用目标文件格式 CCS开开发发环环境境可可以以看看成成是是一一个个大大的的软软件件包包,里里面面包包含含了了源源代代码码编编辑辑器器,以以及及工工程程文文件件组组织织、编编译译和和调调试试等等一一切切功功能能模模块块。该该软软件件包包里里,shell程程序序可可以以完完成成3个个功功能能:编编译译、汇汇编编和和链链接接。shell程程序序缺缺省省在在C盘盘安安装装时时,被被安安装装在在C:tic2400cgtool子子目目录录下下,对对应应的的文件名为文件名为dspcl.exe。(1)编编辑辑器器:包包括括分分析析器器、优优化化器器、代代码码产产生生器器。把把C语语言言程程序序编编译译成汇编语言程序。成汇编语言程序。(2)汇汇编编器器:把把汇汇编编语语言言源源代代码码或或C语语言言已已经经编编译译成成汇汇编编语语言言代代码码进进行汇编,以产生行汇编,以产生COFF目标文件。目标文件。(3)链接器:将文件链接,产生可执行的目标文件。)链接器:将文件链接,产生可执行的目标文件。使使用用汇汇编编器器可可以以将将汇汇编编语语言言源源程程序序汇汇编编为为目目标标文文件件,用用链链接接器器将将若若干干个个目目标标文文件件连连接接成成个个可可被被芯芯片片执执行行的的可可执执行行文文件件。这这些些目目标标文文件的格式称为通用目标文件格式件的格式称为通用目标文件格式(COFF,Common Object File Format)。通用目标文件格式的核心是使程序员在编写通用目标文件格式的核心是使程序员在编写DSPDSP程序时基于代码块程序时基于代码块和数据块的概念,而不是一条条指令或一个个数据,基于这种文件格和数据块的概念,而不是一条条指令或一个个数据,基于这种文件格式编写的式编写的DSPDSP程序可读性强、可移植性好。程序可读性强、可移植性好。在在COFF文件中,将文件中,将代码块和数据块称为代码块和数据块称为SectionSection,编译器,编译器/汇编器汇编器和链接器都提供了有关的命令来创建块和对块进行处理,编译器和链接器都提供了有关的命令来创建块和对块进行处理,编译器/汇编汇编器创建的块的名称有些是已经定义好的,程序员也可以自己定义块名。器创建的块的名称有些是已经定义好的,程序员也可以自己定义块名。6.3.1 块块 目目标标文文件件的的最最小小单单位位被被称称为为块块,它它是是在在存存储储器器中中占占有有连连续续空空间间的的一一块块代代码码或或数数据据。目目标标文文件件中中的的每每一一个个块块都都是是独独立立的的。一一般般地地,COFF目目标标文文件件应应包包含含3个个缺省的块:缺省的块:.text块:通常包含可执行代码。块:通常包含可执行代码。.data块:通常包含已初始化的数据。块:通常包含已初始化的数据。.bss块块:通常为未初始化的变量保留空间。:通常为未初始化的变量保留空间。此外,汇编器和连接器允许用户建立和链接自定义的块,这些块与此外,汇编器和连接器允许用户建立和链接自定义的块,这些块与.text,.data类似。所有的块可以分为两类:类似。所有的块可以分为两类:已已初初始始化化块块:包包含含程程序序代代码码和和数数据据。如如.text和和.data及及用用.sect或或.asect汇汇编器命令创建的块。编器命令创建的块。未初始化未初始化块块:为未初始化数据在存储器映像中保留空间。:为未初始化数据在存储器映像中保留空间。.bss段和用段和用.usect汇编器命令创建的块汇编器命令创建的块是未初始化的段。是未初始化的段。6.3.2 汇编器对块的处理汇编器对块的处理 汇汇编编器器对对块块的的处处理理功功能能主主要要是是确确定定汇汇编编语语言言程程序序的的各各部部分分属属于于哪哪个个特特定定的的块块。汇汇编编器器有有六六个个命命令令来来完完成成这这种种功功能能:.bss,.usect,.text,.data,.sect及及.asect。其其中中.bss和和.usect 命命令令创创建建未未初初始始化化块块,而而.text,.data,.sect及及.asect 命命令令则则建建立立已已初初始始化化块块。如如果果在在程程序序中中未未用用任任何何命命令令来来指指示示,汇汇编器将把所有程序块或数据块统一汇编至编器将把所有程序块或数据块统一汇编至.text 中。中。(1)未初始化块)未初始化块 未未初初始始化化块块主主要要用用来来在在存存储储器器中中保保留留空空间间,它它们们通通常常分分配配在在RAM中中。这这些些块块在在目目标标文文件件中中没没有有实实际际内内容容,只只是是保保留留空空间间而而已已。程程序序可可以以在在运运行时利用这些空间建立和存储变量。行时利用这些空间建立和存储变量。未未初初始始化化数数据据块块是是通通过过使使用用.bss和和.usect汇汇编编器器命命令令来来建建立立。.bss命命令令在在.bss块块中中保保留留空空间间,而而.usect命命令令在在自自定定义义块块中中保保留留空空间间。格格式式为:为:.bss 符号符号,字数字数 符号符号.usect “块名块名”,字数字数 其其中中,符符号号指指向向由由.bss或或.usect保保留留的的第第一一个个字字,它它对对应应于于为为变变量量保保留留空空间间的的变变量量名名,可可以以在在其其他他任任何何块块中中被被访访问问,也也可可以以用用.global定定义义为为全全局局符符号号。字字数数表表示示空空间间的的大大小小,块块名名是是程程序序员员自自己己定定义义的的名名字字。汇汇编编器器遇遇到到.text,.data,.sect和和.asect命命令令时时立立即即停停止止汇汇编编至至当当前前块块中中且且开开始始汇汇编编至至相相应应块块中中。汇汇编编器器遇遇到到.bss或或.usect命命令令并并不不结结束束当当前前块块开始一个新块,它们只是暂时离开当前块。开始一个新块,它们只是暂时离开当前块。(2)已初始化块)已初始化块 已已初初始始化化块块包包含含可可执执行行代代码码或或已已初初始始化化数数据据。块块的的内内容容存存储储在在目目标标文文件件中中,当当程程序序装装入入时时存存放放在在DSP存存储储器器中中。每每个个已已初初始始化化块块可可以以独独立立地地进进行行重重定定位位,且且可可访访问问在在其其他他块块中中定定义义的的符符号号。链链接接器器可可自自动动解解决决块块与与块块之之间间符符号号访访问问的的问问题题。有有四四个个命命令令通通知知汇汇编编器器将将代代码码或或数数据据存存放放在在严格块中,格式为:严格块中,格式为:.text .data .sect “块名块名”.asect “块名块名”,地址,地址 上上述述命命令令中中,.text 和和.data建建立立的的块块名名就就是是.text 和和.data,而而后后两两命命令令建建立立的的是是自自定定义义块块,其其中中.asect 建建立立的的块块有有绝绝对对地地址址,一一般般不不建建议议使用。使用。当当汇汇编编器器遇遇到到上上述述命命令令时时,立立即即停停止止汇汇编编至至当当前前块块中中,且且开开始始将将随随后后的的代代码码或或数数据据汇汇编编至至相相应应的的块块中中。块块是是通通过过迭迭代代过过程程建建立立的的。如如,当当汇汇编编器器首首次次遇遇到到一一个个.data命命令令,.data块块是是空空的的,.data后后面面的的语语句句被被汇汇编编到到.data块块中中,直直到到遇遇到到一一个个.text,.sect或或.asect命命令令为为止止。如如果果汇汇编编器器在在后后面面又又遇遇到到.data命命令令,则则将将.data后后面面的的语语句句加加到到已已存存在在于于.data块块中中语语句句的后面,这样建立的唯一的的后面,这样建立的唯一的.data块可以在存储器中分配一个连续的空间。块可以在存储器中分配一个连续的空间。(3)自定义块)自定义块 自自定定义义块块就就是是程程序序员员自自己己建建立立的的块块,与与缺缺省省的的.text,.data和和.bss块块一一样样使使用用,但但它它与与缺缺省省块块分分开开汇汇编编。如如,重重复复使使用用.text命命令令在在目目标标文文件件中中只只建建立立一一个个.text块块,链链接接后后这这个个.text块块也也作作为为一一个个单单位位分分配配到到存存储储器器中中。有有时时候候程程序序员员想想把把一一部部分分程程序序放放至至不不同同于于.text的的存存储储器器中中,则则须须使使用自定义块,对数据也可同样处理。用自定义块,对数据也可同样处理。有有三三条条指指令令可可建建立立自自定定义义块块:.usect,.sect和和.asect,其其中中.usect建建立立的的块块用用法法类类似似于于.bss,是是在在RAM中中为为变变量量保保留留空空间间;而而.sect和和.asect建建立立包包含含代代码码或或数数据据的的块块,用用法法类类似似于于.text和和.data。.sect建建立立的块是可重定位的,而的块是可重定位的,而.asect建立具有绝对地址的块。建立具有绝对地址的块。符号符号.usect “块名块名”,字数,字数 .sect “块名块名”.asect “块名块名”,地址,地址例例 此例表示如何用此例表示如何用.usect伪指令定义两个未初始化的命名段伪指令定义两个未初始化的命名段var1和和var2。符号符号ptr指向指向var1段中保留的第一个字。符号段中保留的第一个字。符号array指向指向var1段中段中100个字块内的第一个字。个字块内的第一个字。符号符号dflag指向指向var1段中段中50个字块内的第一个字。符号个字块内的第一个字。符号vec指向指向Var2段中保留的第段中保留的第一个字。一个字。0000 .text ;汇编到汇编到.text段段0000 2003 LAC 03h0000 ptr .usect “var1”,1 ;在在var1段保留段保留1个字个字0001 array .usect “var1”,100 ;在在var1段保留段保留100个字个字0001 0037 ADD 037h ;还在还在.text段段0065 dflag .usect “var1”,50 ;在在var1段保留段保留50个字个字0002 0065 ADD dflag ;还在还在.text段段0000 vec .usect “var2”,100 ;在在var2段保留段保留100个字个字0003 0000 ADD vec ;还在还在.text段段 .global array ;将将array定义为外部符号名定义为外部符号名 6.3.3 链接器对块的处理链接器对块的处理 链链接接器器对对块块的的处处理理有有两两个个功功能能。首首先先,将将COFF目目标标文文件件中中的的块块用用来来建建立立程程序序块块或或数数据据块块,将将输输入入块块组组合合起起来来以以建建立立可可执执行行的的COFF输输出出模模块块;其其次次,链链接接器器为为输输出出块块选选择择存存储储器器地地址址。链链接接器器提提供供两两个个命命令令完完成成上上述述功功能能:MEMORY和和SECTION。MEMORY命命令令定定义义目目标标系系统统的的存存储储器器,程程序序员员可可定定义义每每一一块块存存储储器器,指指定定每每一一块块的的起起始始地地址址和和长长度度。SECTION命命令令告告诉诉链链接接器器如如何何组组合合输输入入块块以以及及在在存存储储器器何何处处存存放放输输出出块块。若若不不用用这这两两个个命命令令,则则链链接接器器采采用用缺缺省省的的分分配配算算法法。若若要要用用这这两两条条命命令令,则一般需要建立一个链接命令文件,扩展名为则一般需要建立一个链接命令文件,扩展名为.cmd。6.3.4 程序的重定位程序的重定位 汇汇编编器器对对每每块块汇汇编编时时都都假假定定其其起起始始地地址址为为0,每每块块中中所所有有的的重重定定位位符符号号(标标号号)都都是是相相对对于于0地地址址而而言言的的。当当然然,实实际际上上并并不不是是所所有有块块在在存存储储器器中中都都是是以以0地地址址定定位位的的,因因此此链链接接器器必必须须通通过过下下列列方方法法对对每每块块进进行行重重定定位。位。(1)分配块至存储器,使各块有合适的起始地址。)分配块至存储器,使各块有合适的起始地址。(2)调整符号值,使之对应于新的块地址。)调整符号值,使之对应于新的块地址。(3)调整重定位后符号的参考值,以反映调整后的符号值。)调整重定位后符号的参考值,以反映调整后的符号值。链链接接器器利利用用重重定定位位项项来来调调整整符符号号的的参参考考值值。汇汇编编器器每每次次在在可可重重定定位位符符号号被被参参考考时时建建立立一一个个重重定定位位项项,链链接接器器则则在在符符号号被被重重定定位位之之后后利利用用这这些项来修正参考值。些项来修正参考值。COFF目目标标文文件件中中的的每每一一块块都都有有一一个个重重定定位位项项目目表表。表表中中包包含含了了块块中中每每一一个个可可重重定定位位参参考考的的一一个个重重定定位位项项。链链接接器器在在使使用用完完重重定定位位项项后后将将其去除以防止对输出块再次重定位。其去除以防止对输出块再次重定位。产生重定位项的代码产生重定位项的代码 1 .ref X 2 0000 .text 3 0000 FF80 B X ;产生一个重定位项;产生一个重定位项 0001 0000!4 0002 D001 LALK Y ;产生一个重定位项;产生一个重定位项 0003 0004 5 0004 CEIF Y:IDLE 链链接接后后,假假定定X重重定定位位至至地地址址100h,且且.text块块重重定定位位到到起起始始地地址址200h,则则Y重重定定位位后后的的地地址址为为204h。链链接接器器利利用用这这两两个个重重定定位位项项在在目目标标代码中补上这两个参考:代码中补上这两个参考:FF80 B X 变为 FF80 0000 0100 D001 LALK Y 变为 D001 0004 0204 有有时时,一一块块程程序序装装入入在在某某块块存存储储器器中中但但需需在在另另一一块块存存储储器器中中运运行行。如如,程程序序中中的的一一段段关关键键代代码码装装在在ROM中中,但但需需在在速速度度更更高高的的RAM中中运运行行。此此时时,必必须须进进行行运运行行时时的的重重定定位位。实实现现运运行行时时的的重重定定位位的的方方法法,可可在在链链接接器器命命令令文文件件的的SECTION中中将将块块分分配配两两次次:一一次次设设定定装装入入地地址址,另另一一次次则设定运行地址。如:则设定运行地址。如:.text:load=ROM,run=ROM06.3.5 COFF中的符号中的符号 COFF中中包包含含一一个个存存储储程程序序中中符符号号信信息息的的信信息息表表,链链接接器器在在进进行行重重定位时要用到这个符号表。定位时要用到这个符号表。在在一一个个模模块块中中定定义义在在另另一一个个模模块块中中引引用用的的符符号号称称为为外外部部符符号号。一一般般可可用用.def、.ref、.global等等命命令令来来标标明明某某一一符符号号为为外外部部符符号号。在在一一个个源源模模块中,外部符号可以用块中,外部符号可以用.def、.ref、.global来定义:来定义:(1)定义()定义(.def):在当前模块中定义,在其他模块中引用):在当前模块中定义,在其他模块中引用 (2)参考()参考(.ref):):在当前模块中引用,在其他模块中定义:在当前模块中引用,在其他模块中定义 (3)全局()全局(.global):包含上两者):包含上两者 .globle X ;X在本模块中定义,可在其他模块中引用在本模块中定义,可在其他模块中引用 .globle Y ;Y在其他模块中定义,在本模块中引用在其他模块中定义,在本模块中引用 X:ADD 056h ;定义;定义X MPY Y ;引用;引用Y6.4链接命令文件链接命令文件 链接器的缺省分配算法是:链接器的缺省分配算法是:(1)程序存储器的起始地址是)程序存储器的起始地址是0 x1000h,长度为,长度为0 xEFFF。(2)数据存储器的起始地址是)数据存储器的起始地址是0 x300h,长度为,长度为0 xFCFF。(3)将)将.text分配到起始地址为分配到起始地址为0 x1000h的程序存储器中。的程序存储器中。(4)将)将.data分配到紧跟在分配到紧跟在.text的程序存储器中。的程序存储器中。(5)将)将.cinit分配到紧跟在分配到紧跟在.data的程序存储器中。的程序存储器中。(6)将将自自定定义义的的已已初初始始化化块块分分配配到到紧紧跟跟在在.data的的存存储储器器中中,若若自自定定义义块块不止不止1个,则按自定义块在输入文件的先后顺序存放。个,则按自定义块在输入文件的先后顺序存放。(7)将)将.bss分配到起始地址为分配到起始地址为0 x300h的数据存储器中。的数据存储器中。(8)将将自自定定义义的的未未初初始始化化块块分分配配到到紧紧跟跟在在.bss的的存存储储器器中中,若若自自定定义义块块不止不止1个,则按自定义块在输入文件的先后顺序存放。个,则按自定义块在输入文件的先后顺序存放。1、MEMORY伪指令伪指令 MEMORY伪指令的一般语句格式为:伪指令的一般语句格式为:MEMORY PAGE0:存储器名存储器名1(属性)(属性):origin=常数,常数,length=常数常数 PAGEn:存储器名存储器名n(属性)(属性):origin=常数,常数,length=常数常数 (1)PAGE:定义一个存储器空间,用户可以定义多达定义一个存储器空间,用户可以定义多达255页。通常页。通常PAGE0定定义程序存储器,义程序存储器,PAGE1定义数据存储器。如果用户没有使用定义数据存储器。如果用户没有使用PAGE选项,那选项,那么连接器把段定位到么连接器把段定位到PAGE0。每个每个PAGE代表一个完全独立的地址空间。在代表一个完全独立的地址空间。在PAGE0上已配置的存储器可以和在上已配置的存储器可以和在PAGE1上已配置的存储器重叠。上已配置的存储器重叠。(2)存储器名:命名存储器范围。存储器名由)存储器名:命名存储器范围。存储器名由18个字符组成,有效的字符包个字符组成,有效的字符包括括AZ,az,$及及_。名字对于连接器没有特殊的意义,仅指明存储器的区域。名字对于连接器没有特殊的意义,仅指明存储器的区域。在不同页上存储器范围可以有相同的名字,而在同一页,所有的存储器范。在不同页上存储器范围可以有相同的名字,而在同一页,所有的存储器范围不能有相同的名字,且不能重叠。围不能有相同的名字,且不能重叠。(3)属性:对于已命名的范围有)属性:对于已命名的范围有14个属性。属性是可选项,当被使用时,必个属性。属性是可选项,当被使用时,必须用括号括起来。属性把输出段的定位限制在某些存储器范围内。如果用户须用括号括起来。属性把输出段的定位限制在某些存储器范围内。如果用户不使用任何属性,则输出段即可以定位到任何范围内。有效的属性包括:不使用任何属性,则输出段即可以定位到任何范围内。有效的属性包括:R:规定存储器可以被读出;:规定存储器可以被读出;W:规定存储器可以被写入;:规定存储器可以被写入;I:规定存储器可以被初始化。:规定存储器可以被初始化。(4)origin:指定一个存储器区域的起始地址,也可以写成指定一个存储器区域的起始地址,也可以写成org或或0。这。这个值是以字节规定的个值是以字节规定的16位常数,也可以是十进制、八进制或十六进制。位常数,也可以是十进制、八进制或十六进制。(5)length:指定一个存储器的长度,也可以写成指定一个存储器的长度,也可以写成len或或1。数值的表示。数值的表示方法与方法与origin相同。相同。例:例:MEMORY指令举例指令举例*SampleCommandfilewithMEMORYdirective */file1obj file2Obj -o prog.out MEMORY PAGE0:ROM:ORIGIN=0h,LENGTH=1000h PAGE1:B2:ORIGIN=60h,LENGTH=20h B0B1:ORIGIN=200h,LENGTH=200h SECTIONS伪指令的一般语法形式是:伪指令的一般语法形式是:SECTIONS 段名段名1:特性特性1,特性,特性2,段名段名2:特性特性1,特性,特性2,.2、SECTION伪指令伪指令 特性列表的选项特性列表的选项(块块所具备的特性所具备的特性)有以下几种:有以下几种:(1)装载地址:规定装载地址:规定块块将被装载在存储器中的位置。将被装载在存储器中的位置。语法:语法:load=allocation 或或 allocation 或或 allocation allocation是是MEMORY伪伪指指令令所所定定义义的的范范围围内内地地址址,包包括括ROM、RAM、实际地址值实际地址值(16位常数位常数)等。等。(2)运行地址:定义运行地址:定义块块在存储器内运行的位置。在存储器内运行的位置。语法:语法:run=allocation 或或 runallocation 如果在一个如果在一个块块中中load和和run的地址相同,的地址相同,run可以省略可以省略。(3)调调准准地地址址:规规定定块块应应在在地地址址边边界界上上开开始始。调调准准可可以以使使连连接接器器把把输输出出块块放在位于放在位于n字边界的地址,其中字边界的地址,其中2是是2的幂。的幂。语法:语法:align=n 或或 align=(n)如如 .text align=128,即将即将.text段定位于页边界。段定位于页边界。(4)块块地地址址:规规定定块块必必须须装装在在两两个个地地址址边边界界之之间间,它它把把块块定定位位在在大大小小为为n的的块块内内任任何何地地方方,如如果果块块大大于于大大小小为为的的n块块,那那么么块块将将从从该该边边界界开开始始。和调准一样,和调准一样,n必须是必须是2的幂。的幂。语法:语法:block=n或或 block(n)如如.bss load=block(0 x80)。定定位位.bss块块使使其其包包含含在在单单个个128字字的的页页内内或或者者从从新新页页开开始始。用用户户可可以以单单独独使使用用调调准准或或块块,也也可可以以和和装装入入地地址址、运运行行地地址址结结合合在在一一起起使使用用,但是调准和块不能一起使用。但是调准和块不能一起使用。(5)输入块:定义组成输出块的输入块。输入块:定义组成输出块的输入块。语法:语法:input_sections输输入入文文件件中中的的块块组组合合起起来来形形成成输输出出块块,连连接接器器按按照照所所列列出出的的输输入入块块的次序连接并组合它们。输出块的大小是组成它的输入块的大小之和。的次序连接并组合它们。输出块的大小是组成它的输入块的大小之和。通用类型的块的规格说明中没有输入块。通用类型的块的规格说明中没有输入块。如如SECTIONS .text:.data:.bss:此此时时链链接接器器从从输输入入文文件件取取出出所所有有.text块块并并把把它它们们组组合合到到.text输输出出块块内内。链链接接器器按按照照它它在在输输入入文文件件中中遇遇到到的的次次序序连连接接.text输输入入块块,对对.data和和.bss块的操作与块的操作与.text相同。相同。例:例: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和和.sec1段段*(6)块块类型:定义特殊类型:定义特殊块块类型的标志。类型的标志。语法:语法:type=COPY或或 type=DSECT或或 type=NOLOAD用用户户可可以以把把这这3种种特特殊殊的的类类型型赋赋予予输输出出块块。用用COPY和和DSECT创创建建的的块块是是一一个个虚虚块块,它它不不包包括括在在输输出出块块存存储储器器分分配配内内,也也不不占占据据存存储储器器空空间间,不不包包括括在在存存储储器器映映象象列列表表中中。但但在在虚虚块块中中定定义义的的全全局局符符号号可可以以被被其其他他输输入入块块引引用用,COPY段段可可以以将将块块的的内内容容、重重定定位位信信息息及及行行号号信息放在输出模块中,而信息放在输出模块中,而DSECT块则不放置。块则不放置。NOLOAD创创建建的的块块不不将将块块的的内内容容、重重定定位位信信息息及及行行号号信信息息放放在在输输出模块中,但链接器为其分配空间并包括在存储器映象列表中。出模块中,但链接器为其分配空间并包括在存储器映象列表中。例例SETIONS伪指令的使用伪指令的使用 file1.obj file2.obj *输入文件输入文件 *-o prog.out *输出文件输出文件 *SECTIONS .text:load=ROM run=0800h .const:load=ROM .bss:load=ROM Vectors:load=0h t1.obj(.intvec1)t2.obj(.intvec2)endvec=.;/*将将vectors段段的的最最后后连连接接地地址址赋赋给给endvec符符号号*.data:align=16(7)填充值:定义用于填充初始化空位的数值。填充值:定义用于填充初始化空位的数值。语法:语法:file=value或或 name:value 当初始化输出块内有空位存
展开阅读全文