版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第四章DSP软件开发软件开发过程一个DSP软件可以使用汇编或C语言编写源程序,通过编译、连接工具产生DSP的执行代码。在调试阶段,可以利用软仿真(Simalator)在计算机上运行;也可以利用硬件调试工具(xps510)将代码下载到DSP中,并通过计算机监控、调试该程序。当调试完成后,可以将程序代码固化到EPROM中,以便DSP目标系统脱离计算机单独运行。代码生成工具:1.C编译器(CCompiler):将C源程序代码编译成为C54x汇编语言源代码程序。
在编译软件包中包括一个外壳程序(Shellprogram)、一个优化器(Optimizer)和一个内部列表公用程序(Interlistutility)。其中,外壳程序能自动编译、汇编、连接源模块。优化器能改进代码来提高C程序的效率。内部列表公用程序能将C源程序同汇编语言输出相结合。2.汇编器(Assembler):将汇编语言源文件转变为基于公用目标文件格式(COFF)的机器语言目标文件。源文件中包括指令、汇编命令以及宏命令。汇编器的输入文件为汇编语言源文件,其默认的文件扩展名为.asm。由汇编器所建立的目标文件的默认扩展名为.obj。由汇编器建立的列表文件的默认扩展名为.lst。
3.连接器(Linker):将汇编生成的、可重新定位的COFF目标模块组合成一个可执行的COFF目标模块。
连接器的输入是可重新定位的COFF目标文件和目标库文件。当连接器生成可执行模块时,它要调整对符号的引用,并解决外部引用的问题。它也可以接受来自文档管理器中的目标文件,以及连接以前运行时所生成的输出模块。4.文档管理器(Archiver):将一组文件(包括源文件或目标文件)集中归入一个文档文件库。
利用文档管理器,可以方便地替换、添加、删除和提取文件来调整库,其最有用的应用之一是建立目标文件库,C编译器自带有目标文件库。汇编时,可以搜索宏文件库,并通过源文件中的宏命令来调用。例如:将若干宏归入一个宏库,汇编器搜索这个库,并调用源文件中使用的宏。
5.助记符到代数式指令翻译器(Mnemonic-to-algbraictranslatorutility):将包含助记符指令的汇编语言源文件转换成包含代数指令的汇编语言源文件。
6.运行支持库公用程序(Runtime-suportutility):建立用户的C语言运行支持库。标准运行支持库在rts.src里提供源代码,在rts.lib里提供目标代码。包含ANSI标准运行支持函数、编译器公用程序函数、浮点算术函数和被C54x编译器支持的C输入/输出函数。7.建库实用程序(Library-buildutility):用来建立用户自己的、C语言编写的支持运行的库函数。链接时,用rts.src中的源文件代码和rts.lib中的目标代码提供标准的支持运行的库函数。8.十六进制转换程序(Hexconversionutlity):可以很方便地将COFF目标文件转换成TI、Intel、Motorola或Tektronix公司的目标文件格式。转换后生成的文件可以下载到EPROM编程器,以便对用户的EPROM进行编程。9.绝对制表程序(Absolutelister):将链接后的目标文件作为输入,生成.abs输出文件。对.abs文件汇编产生包含绝对地址而不是相对地址的清单。如果没有绝对制表程序,所生成清单可能是冗长的,并要求进行许多人工操作。10.交叉引用制表程序(Cross-referencelister):利用目标文件生成一个交叉引用清单,列出所链接的源文件中的符号以及它们的定义和引用情况。
11.C54x调试器:接收可执行的COFF文件作为输入,但大多可擦除存储器却不支持COFF文件。
汇编语言程序的编写方法
要点以.asm为扩展名每一行由4个部分组成格式
[标号][:]空格[助记符]空格[操作数]空格[;注释]
[]中的内容为可选择部分
供本程序的其它部分或其它程序调用。标号是任选项,标号后面可以加也可以不加冒号“:”。
在编写汇编语句时,应遵循以下规则:
语句的开头只能是标号、空格、星号或分号。标号是可选项;如果使用,必须从第一列开始。每个域必须由一个或多个空格来分开。制表符等同于空格。注释是可选项。开始于第一列的注释用星号或分号(*或;)来标明,开始于其它列的注释必须由分号开头。要点建议
[标号][:]空格[助记符]空格[操作数]空格[;注释]
可以是助记符指令、汇编指令、宏指令和宏调用命令。1.助记符指令,一般用大写;2.汇编命令和宏命令,以句号“.”
开始,且为通常用小写。
要点[标号][:]空格[助记符]空格[操作数]空格[;注释]
1.指令中的操作数或汇编命令中定义的内容
2.操作数之间必须用逗号“,”分开。
1.从分号“;”开始
2.可以放在指令或汇编命令后面,也可以放在单独的一行或数行。要点
汇编语言程序中的数据型式有下列几种:二进制:如1110001b或1111001B;八进制:226q或572Q;十进制:1234或+1234或-1234(缺省型)十六进制:0A40h或0A40H或0xA40浮点数:1.623e-23(仅C语言程序中能用,汇编程序不能用)字符:‘D’字符串:“thisisastring”
汇编器和链接器建立的目标文件,是一个可以TMS320C54x器件上执行的文件。这些目标文件的格式称之为公共目标文件格式,即COFF(CommonObjectFileFormat)。COFF会使模块编程和管理变得更加方便,因为当编写一个汇编语言程序时,它可以按照代码和数据段来考虑问题。汇编器和链接器都有一些命令建立并管理各种各样的段。公共目标文件格式COFF建立公共目标文件格式的目标文件汇编器和链接器功能的异同相同点不同点汇编器建立的是相对地址COFF文件,即.obj文件链接器建立的是绝对地址COFF文件,即.out文件汇编器根据汇编命令用适当的段将各部分程序代码和数据连在一起,构成目标文件;链接器的一个任务就是分配存储单元,即把各个段重新定位到目标存储器中。不同种类的区别COFF文件种类C54x汇编器和C编译器建立的是COFF2文件。C54x能够读/写所有形式的COFF文件,缺省值下链接器生成的是COFF2文件,用链接器-vn选项可以选择不同形式的COFF文件。COFF0COFF1COFF2
标题格式不相同数据部分是相同汇编指令汇编指令(伪指令)是用来为程序提供数据和控制汇编进程的。C54x汇编器共有64条汇编命令。将代码和数据汇编到特定的段中。为未初始化的变量保留存储器空间。控制展开列表的形式。存储器初始化。汇编条件块。定义全局变量。(1)段定义指令
.bass
在.bass段中为未初始化的变量保留存储器空间
.date
确认.bass段中的代码段。.bass段中通常包含了初始化的数据。.sect
定义初始化的带命名的段,并将紧接着的代码或数据并入该段。.text
该段中包含了可执行的代码.usect
在一个未初始化的有命名的段中保留空间(2)常数初始化指令
.bes和
.space
在当前段保留确定数目的位。
当在.space段使用了标号时,它指向保留位的第一个字;当在.bes段使用了标号时,它指向保留位的最后一个字。.byte
把一个8位值放入当前段的连续字中。.filed
把一个数放入当前字的特定数目的位中。
.float和
.xloat
计算以IEEE格式表示的单精度(32位)浮点数,并存放在当前段的连续字中,高位字先存。.int和
.word
把一个或多个16位数存放在当前段的连续字中。.long和
.xlong
把32位数存放在当前段的连续的两个字中,高位字先存。.string和
.pstring
把8位的字符从一个或多个字符串中传到当前段中。(3)段程序计数器定位指令
.align
使SPC对准1-word到128-word的边界。保证了紧接着该指令的代码从一个整字或页边界开始。
操作数:1让SPC对准字边界2让SPC对准长字/偶地址边界128让SPC对准页边界不带操作数时,确省值为128。(4)输出列表格式指令
.drlist/
.drnolist.fclist/
.fcnolist.length.width.list/
.nolist.mlist/
.mnolist.option.page.title.sslist/
.ssnolist(5)引用其他文件的指令
.copy/
.include告诉汇编器器开始从其他文件中读源语言。.def确认一个在当前模块中定义的且被其他模块使用的符号。.global声明一个外部符号,使其他模块在连接的时候可以使用它。.mlib向汇编器提供一个包含宏定义的文档库的名称。.ref确认一个在当前段中使用但在其它段中定义的符号。(6)条件汇编指令
.if/
.elseif/.else/
.endif告诉汇编器根据表达式的值条件汇编一块代码。.loop/
.break/.endloop告诉汇编器按照表达式的值循环汇编一块代码。.loopexpression标注一块循环代码的开始。.breakexpression告诉汇编器当表达式为假时,继续循环汇编;当表达式为真时,立即转到.endloop后面懂得代码去。(7)汇编时的符号指令使有意义的符号名与常数值或字符串相等同。
.asg规定一个字符串与一个替代符号相等,并将其存放在替代符号表中。.eval计算一个表达式的值并把结果传送到与一个替代符号等同的字符串中。.label定义一个专门的符号以表示当前段内装入时的地址而不是运行时的地址。.set/
.equ
把一个常数值等效成一个符号,存放在符号表中且不能被清除。(8)其他方面的汇编指令
.algebraic.end.mmregs.newblock.sblock.version
汇编程序的编辑与汇编和链接
汇编语言源程序编好后,必须经过汇编和链接才能运行。汇编语言程序的汇编汇编语言源程序要素汇编命令助记符指令宏命令汇编程序(汇编器)功能将源程序汇编成可重定位的目标文件(.obj文件);如果需要,可以生成一个列表文件(.lst文件);将程序代码分段,每段的目标代码都有一个SPC管理;定义和引用全局符号,可在列表后附加交叉引用表;对条件程序块进行汇编;支持宏功能,允许定义宏命令。段(sections)的概念
特点定义分段的优点:在目标文件中将放置程序、数据、变量的代码分开,便于在链接时作为一个单独的部分分配存储器。由于大多数系统都有好几种形式的存储器,通过对各个段重新定位,可以使目标存储器得到更为有效的利用。
段是在存储器图中占据相邻空间的代码或数据块。一个目标文件中的每一个段都是分开的和不相同的。目标文件中的段与目标存储器之间的关系所谓段,就是在存储器图中占据相邻空间的代码或数据块。一个目标文件中的每一个段都是分开的和不相同的。所有的COFF目标文件都包含以下3种形式的段:.text段(此段通常包含可执行代码).data段(此段通常包含初始化数据).bss段(此段通常为未初始化变量保留存储空间)
此外,汇编器和链接器可以建立、命名和链接自定义段。这种自定义段是程序员自己定义的段,使用起来与.data、.text以及.bss段类似。它的好处是在目标文件中与.data、.text以及.bss分开汇编,链接时作为一个单独的部分分配到存储器。段有两类:(1)未初始化段:.bss和.usect命令建立未初始化段。
未初始化段就是C54x存储器中的保留空间,通常将它们定位到RAM区。在目标文件中,这些段中没有确切的内容;在程序运行时,可以利用这些存储空间存放变量。这两条命令的句法为:
.bss符号,字数
符号.usect“段名”,字数其中:符号:对应于保留的存储空间第一个字的变量名称。这个符号可以让其它段引用,也可以用.global命令定义为全局符号。字数:表示在.bss段或标有名字的段中保留多少个存储单元。段名:程序员为自定义未初始化段起的名字。
(2)已初始化段:
.text、.data的.sect命令建立已初始化段。
已初始化段中包含有可执行代码或初始化数据。这些段中的内容都在目标文件中,当加载程序时再放到C54x的存储器中。每一个已初始化段是可以重新定位的,并且可以引用其它段中所定义的符号。链接器在连接时会自动地处理段间的相互引用。这3条初始化命令的句法为:.text[段起点].data[段起点].sect“段名”[,段起点]其中,段起点是任选项,如果选用,它就是为段程序计数器(SPC)定义的一个起始值。SPC值只能定义一次,而且必须在第一次遇到这个段时定义。如果缺省,则SPC从0开始。段的构成要经过一个反复过程。例如,当汇编器第一次遇到.data命令时,这个.data段是空的。接着将紧跟其后的语句汇编到.data段,直到汇编器遇到一条.text或.sect命令。如果汇编器再遇到一个.data段,它就将紧跟这条命令的语句汇编后加到已经存在的.data中。这样,就建立了单一的.data段,段内数据都是连续地安排到存储器中的。⑶子段:
子段是大段中的小段。链接器可以像处理段一样处理子段。采用子段结构,可以使存储器图更加紧密。子段命名的句法为:基段名:子段名对于子段,可以单独为其分配存储单元,或者在相同的基段名下与其它段组合在一起。例如,若要在.text段内建立一个称之为_func的子段,可以用如下的命令:.sect“.text:_func”
⑷段程序计数器(SPC):
汇编器为每个段都安排了一个单独的程序计数器,即段程序计数器(SPC)。SPC表示一个程序代码段或数据段内的当前地址。一开始,汇编器将每个SPC置0。当汇编器将程序代码或数据加到一个段内时,相应的SPC就增加。如果再继续对某个段汇编,则相应的SPC就在先前的数值上继续增加。链接器在链接时要对每个段进行重新定位。1.运行汇编程序
axm500[inputfile[objectfile[listingfile]]][-options]汇编器是名为asm500.exe的可执行程序
例如axm500cjy.asm-l-s-x源程序cjy.asm经汇编后将生成一个cjy.obj目标文件、列表文件、符号表(在目标文件中)以及交叉引用表(在列表文件中)。2.列表文件TMS320C54xCOFFAssemblerVersion3.70TueOct1912:42:592004Copyright(c)1996-2001TexasInstrumentsIncorporatedexample.asmPAGE11*********************************2*example.asmy=a1*x1+a2*x2+a3*x3+a4*x4*3*********************************5.mmregs;定义存储器映象寄存器6000000STACK.usect"STACK",10h;分配10个单元的堆栈空间7000000.bssa,4;为系数a分配4个单元的空间8000004.bssx,4;为变量x分配4个单元的空间9000008.bssy,1;为结果y分配1个单元的空间10.global_c_int00;定义标号
列表文件中包括源程序语句和目标代码
11000000.data;定义数据代码段120000000001table:.word1,2,3,4;在标号table开始的8个单元中000001000200000200030000030004130000040008.word8,6,4,2;为这8个单元赋初值00000500060000060004000007000214000000.text;定义文本代码段150000007728_c_int00STM#0,SWWSR;软件等待状态寄存器置0,不设等待0000010000160000027718STM#STACK+10h,SP;设置堆栈指针初值0000030010-170000047711STM#a,AR1;AR1指向a的地址0000050000-18000006EC07RPT#7;从程序存储器向数据存储器190000077C91MVPDtable,*AR1+;重复传送8个数据0000080000"
源文件的每一行都会在列表文件中生成一行。包括行号、段程序计数器SPC的数值、汇编后的目标代码、源程序语句。一条指令可以生成1或2个字的目标代码。
第2字单独列一行,列出了SPC的数值和目标代码。
20000009F074CALLSUM;调用SUM实现乘法累加和的子程序00000a000D'2100000bF073end:Bend;循环等待00000c000B'2200000d7713SUM:STM#a,AR3;将系数a的地址赋给AR3000007714STM#x,AR4;将变量x的地址赋给AR30000100004-24000011F071RPTZA,#3;将A清0,并重复执行下条指令4次000012000325000013B09AMAC*AR3+,*AR4+,A;执行乘法并累加,结果放在A中260000148008-STLA,@y;将A的低字内容送结果单元y27000015FC00RET;结束子程序28.end;结束全部程序NoAssemblyErrors,NoAssemblyWarningsField
1源程序语句的行号,用十进制数表示
Field2段程序计数器(SPC),用十六进制数表示
Field4:源程序语句
Field3目标代码!未定义的外部引用。’.text段重新定位。”.data段重新定位。+.sect段重新定位。-.bss和.usect段重新定位。下例列出的是一个汇编语言程序经汇编后的.lst文件(部分)。.lst文件由4个部分组成,即:第一部分:源程序的行号;第二部分:段程序计数器;第三部分:目标代码;第四部分:源程序。一条指令可以生成1或2个字的目标代码。汇编器为第2字单独列一行,列出了SPC的数值和目标代码。目标代码后面的一些记号,表示在连接时需要重新定位。如:
!未定义的外部引用。’.text段重新定位。”.data段重新定位。+.sect段重新定位。-.bss和.usect段重新定位。2**************************3**Reservespacein.bssforavariable**4**************************50000.data600000011coeff.word011h,022h,033h00010022000200337**************************8**Reservespacein.bssforavariable**9**************************100000.bssbuffer,1011**************************12**stillin.data**13**************************1400030123ptr.word0123h15**************************16**Assemblecodeintothe.textsection**17**************************180000.text190000100fadd:ld0Fh,A200001f010aloop:SUB#1,A00020001210003f842BCaloop,AGEQ00040001’22**************************23**Anotherinitializedtableinto.data**24**************************250004.data26000400aaivals.word0AAh,0BBh,0CCh000500bb000600cc27**************************28**Defineanothersectionformorevariables**29**************************300000var2.usect“newvars”,1310001inbuf.usect“newvars”,732**************************33**Assemblemorecodeinto.text**34**************************350005.text360005110ampy:LD0Ah,B370006f166mloop:MPY#0Ah,B0007000a380008f868BCmloop,BNOV00090006’39**************************40**Defineanamedsectionforint.vectors**41**************************420000.sect“vectors”4300000011.word011h,033h4400010033↓↓↓↓field1field2field3field4在此例中,一共建立了5个段:.text段内有10个字的程序代码。.data段内有7个字的数据。vectors是一个用.sect建立的自定义段,段内有2个字的已初始化数据。.bss在存储器中为变量保留10个存储单元。newvars是一个用.usect命令建立的自定义段,它在存储器中为变量保留8个存储单元。本例的目标代码如图4-4所示。目标文件的链接
链接器主要功能根据链接命令或链接命令文件(.cmd文件),将一个或多个COFF目标文件链接起来,生成存储器映象文件(.map)和可执行的输出文件(.out)(COFF目标模块)
.cmd文件中除了指出输入文件和输出文件外,还说明系统中有哪些可用的存储器,程序段、数据段、堆栈以及复位向量和中断向量等安排在什么地方。链接后生成的.map文件中给出了存储器的配置情况、程序文本段、数据段、堆栈段、向量段、在存储器中的定位表,以及全局符号在存储器中的位置。链接后生成的.out文件是一个可执行文件。1.运行链接程序
(1)键入命令lnk500
(2)键入命令lnk500file1.objfile2.obj–o(3)键入命令lnk500linker.cmd链接器是名为lnk500.exe的可执行程序应包含如下内容:file1.objfile2.obj-olind.out2.链接器选项
建立一个名为a.out(默认情况)的可重新定位的输出模块。
3.链接器对段的处理
(1)把一个或多个COFF目标文件中的各种段作为链接器的输入段,经链接后在一个可执行的COFF输出模块中建立各个输出段。(2)为各个输出段选定存储器地址。链接器在对段进行处理时,主要完成汇编器在需要引用重新定位的符号处都留了一个重定位入口。链接器对符号重定位时,利用这些入口修正对符号的引用值。
4.链接器命令文件
(1)将有多个选项的命令,写成一个链接器命令文件.cmd。
(2)运行链接器命令文件.cmd,生成一个映象文件.map和一个可执行的输出文件.out
(3)进行存储器分配主要功能
使用方法
lnk500链接器命令文件名.cmd
5.两条链接器命令的使用方法MEMORY命令用来定义目标系统中所包含的各种形式的存储器的存储器配置图,包括对存储器各部分命名,以及规定它们的起始地址和长度。定义系统(1)MEMORY命令
功能EMEORY{PAGE0:name1[(attr)]:origin=constant,length=constant┆PAGEn:namen[(attr)]:origin=constant,length=constant}MEMORY命令的一般句法对一个存储空间加以标记,每一个PAGE代表一个完全独立的地址空间。页号n最多可规定为255,取决于目标存储器的配置。通常PAGE0定为程序存储器,PAGE1定为数据存储器。如果没有规定PAGE,则链接器就目标存储器配置在PAGE0。EMEORY{PAGE0:name1[(attr)]:origin=constant,length=constant┆PAGEn:namen[(attr)]:origin=constant,length=constant}MEMORY命令的一般句法名字可以包含8个字符,A~Z、a~z、$、.、_均可。名字并没有特殊的含义,用来标记存储器的区间而已;名字都是内部记号,不需要保留在输出文件或者符号表中。不同PAGE上的存储器区间可以取相同的名字,但在同一PAGE内的名字不能相同,且不许重叠配置。EMEORY{PAGE0:name1[(attr)]:origin=constant,length=constant┆PAGEn:namen[(attr)]:origin=constant,length=constant}MEMORY命令的一般句法任选项,为命名区规定1~4个属性。如果有选项,应写在括号内。当输出段定位到存储器时,可利用属性加以限制。规定一个存储区的起始地址。键入origin、org或o都可以。这个值是一个16位二进制常数,可以用十进制数、八进制数或十六进制数表示。
规定一个存储区的长度,键入length、len或l都可以。
例MEMORY命令的使用方法。/*ExamplecommandfilewithMEMORYdirective*/file1.objfile2.obj/*Inputfiles*/-oprog.out/*Options*/MEMORY{PAGE0:ROM:origin=c00h,length=1000hPAGE1:SCRTCH:origin=60h,length=20hONCHIP:origin=80h,length=200h}名为ROM的程序存储器:4K字ROM,起始地址C00h。
名为SCRATCH的数据存储器:32字RAM,起始地址60h。名为ONCHIP的数据存储器:512字RAM,起始地址为80h。告诉链接器如何将输入段合成输出段在可执行程序中定义输出段规定输出段在存储器中的存放位置允许重新命名输出项。(2)SECTIONS命令
功能在链接器命令文件中,SECTIONS命令用大写字母,紧随其后并用大括号括起来的是关于输出段的详细说明。每一个输出段的说明都从段名开始。段名后面是一行说明段的内容和如何给段分配存储单元的性能参数。
注意SECTIONS{name:[property,property,property,…]name:[property,property,property,…]name:[property,property,property,…]}SECTIONS命令的一般句法
性能参数在链接器命令文件中,SECTIONS命令用大写字母,紧随其后并用大括号括起来的是关于输出段的详细说明。每一个输出段的说明都从段名开始。段名后面是一行说明段的内容和如何给段分配存储单元的性能参数。一个段可能的性能参数有:(1)loadallocation:用来定义将输出段加载到存储器中的什么位置。(2)Runallocation用来定义输出段在存储器的什么位置上开始运行。(3)Inputsections:用来定义由哪些输入段组成输出段。(4)Sectiontype:用它为输出段定义特殊形式的标记。MEMORY和SECTIONS命令的缺省算法:
如果没有利用MEMORY和SECTIONS命令,链接器就按缺省算法来定位输出段:MEMORY{PAGE0:PROG:origin=0x0080,length=0xFF00PAGE1:DATA:origin=0x0080,length=0xFF80}SECTIONS{.text:PAGE=0.data:PAGE=0.cinit:PAGE=0.bss:PAGE=1}在缺省MEMORY和SECTIONS命令情况下,链接器将所有的.text输入段,链接成一个.text输出段,它是可执行的输出文件;所有的.data输入段组合成.data输出段。又将.text和.data段定位到配置为PAGE0上的存储器,即程序存储空间。所有的.bss输入段则组合成一个.bss输出段,并由链接器定位到配置为PAGE1上的存储器,即数据存储空间。
如果输入文件中包含有自定义已初始化段(如上面的.cinit段),则链接器将它们定位到程序存储器,紧随.data段之后;如果输入文件中包括有自定义未初始段,则链接器将它们定位到数据存储器,并紧随.bss之后。汇编器处理每个段都是从地址0开始,而所有需要重新定位的符号(标号)在段内都是相对于地址0的。事实上,所有段都不可能从存储器中地址0单元开始,因此链接器通过以下方法对各个段进行重新定位,即:⑴将各个段定位到存储器图中,这样一来每个段都从一个恰当的地址开始。⑵将符号的数值调整到相对于新的段地址的数值。⑶调整对重新定位后符号的引用。
例:链接器命令文件举例。a.objb.obj/*被连接的文件*/-oprog.out/*选项,生成一个可执行输出文件*/-mprog.map/*选项,生成一个映象文件*/MEMORY/*定义目标存储器配置*/{PAGE0:ROM:origin=1000h,length=0100hPAGE1:RAM:origin=0100h,length=0100h}SECTIONS/*规定各个段放在存储器什么位置*/{.text:>ROM.data:>ROM.bss:>RAM}链接器命令文件都是ASCII码文件,由上例可见,它主要包含如下内容:第一:输入文件名,就是要链接的目标文件和文档库文件,或者是其它的命令文件。(如果要调用另一个命令文件作为输入文件,此句一定要放在本命令文件的最后,因为链接器不能从新调用的命令文件返回。)第二:链接器选项。这些选项既可以用在链接器命令行,也可以编在命令文件中。第三:MEMORY和SECTIONS都是链接器命令。例:编写计算y=a1*x1+a2*x2+a3*x3+a4*x4的汇编源程序*****************************example.asmy=a1*x1+a2*x2+a3*x3+a4*x4*****************************.title“example.asm”;说明程序名称.mmregs;定义寄存器STACK.usect“STACK”,10h;开辟堆栈空间.bssa,4;为a预留4个字空间.bssx,4.bssy,1.defstart;确认符号.data;确认data段table:.word1,2,3,4;data段有8个数据.word8,6,4,2.text;确认程序段start:STM#0,SWWSR;软件等待状态寄存器置0STM#STACK+10h,SP;SP指向栈底STM#a,AR1;AR1指向aRPT#7;后一语句循环8次MVPDtable,*AR1+;从程序空间到数据空间CALLSUM;调用子程序end:Bend;无条件结束SUM:STM#a,AR3;AR3指向aSTM#x,AR4;AR4指向xRPTZA,#3;累加器清0,;然后后一语句循环4次MAC*AR3+,*AR4+,A;乘积放累加器STLA,@y;结果放入yRET.end链接器命令文件example.cmd列于下例中。该命令文件指出只对example.obj文件进行链接。链接后生成example.out文件和example.map文件。另外,还说明了可用的程序存储器(PAGE0)和数据存储器(PAGE1),以及汇编语言程序中各个段(.text,.data,.bss,以及STACK)在存储器中的配置情况。例:example.cmd文件。example.obj;/*被连接的文件*/-oexample.out;/*生成一个可执行输出文件*/-mexample.map;/*生成一个映象文件*/-estart;/*程序开始时的地址*/MEMORY;/*规定各个段放在存储器什么位置*/{PAGE0:EPROM:org=0E000h,len=100hPAGE1:SPRAM:org=0060h,len=0020hDARAM:org=0080h,len=100h}SECTIONS{.text:>EPROMPAGE0.data:>EPROMPAGE0.bss:>SPRAMPAGE1STACK:>DARAMPAGE1}
链接后生成的.map文件中给出了存储器的配置情况、程序文本段、数据段、堆栈段、向量段、在存储器中的定位表,以及全局符号在存储器中的位置。链接后生成的example.map文件。**************************TMS320C54COFFLinkerVersion1.10**************************FriMay2809:48:59:1999OUTPUTFILENAME:<example.out>ENTRYPOINTSYMBOL:“start”address:0000e000MEMORYCONFIGURATION
Name
origin
length
attributesfillPAGE0:EPROM0000e000000000100RWIXPAGE1:SPRAM00000060000000020RWIXDARAM00000080000000100RWIXSECTIONALLOCATIONMAPoutpoutattributes/section
page
origin
length
inputsections.text00000e000000000160000e00000000016example.obj(.text).data00000e016000000080000e01600000008example.obj(.data).bss10000006000000009UNINITIALIZED0000006000000009example.obj(.bss)STACK10000008000000010UNINITIALIZED0000008000000010example.obj(STACK).xref00000000000000076COPYSECTION0000000000000076example.obj(.xref)GLOBALSYMBOLSaddress
name
address
name00000060.bss00000060.bss0000e016.data00000069end0000e000.text0000e000start0000e01eedata0000e000.text00000069end0000e016etext0000e016etext0000e016.data0000e000start0000e01eedata[7symbols]链接后生成的.out文件是一个可执行文件。DSP的C语言开发与ANSIC规范完全正确兼容;具有ANSI标准运行支持库;程序可转化为ROM,可重定位、重入;提供与汇编语言的接口,允许对时
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/Z 30556.8-2025电磁兼容安装和减缓导则第8部分:分布式基础设施的HEMP防护方法
- 2026年眉山药科职业学院单招职业技能测试题库含答案详解
- 2026年辽宁医药职业学院单招职业适应性考试题库带答案详解
- 2026年石家庄财经职业学院单招职业倾向性测试题库及参考答案详解1套
- 2026年黎明职业大学单招职业技能测试题库附答案详解
- 2026年牡丹江大学单招职业技能测试题库附答案详解
- 2026年宝鸡三和职业学院单招职业技能测试题库带答案详解
- 2026年广西金融职业技术学院单招职业技能考试题库及答案详解1套
- 2026年长沙职业技术学院单招职业倾向性考试题库及答案详解1套
- 2026年山东旅游职业学院单招职业技能考试题库及答案详解1套
- 【2025年】熔化焊接与热切割操作证考试题库及答案
- 2025年检察院书记员面试真题及答案解析
- 石材购买意向合同(标准版)
- 小学四年级上册口算练习题500道(A4打印版)
- (2025年)(完整版)特种设备作业人员考试题库及答案
- 知到《性与生殖健康讲堂(湖南中医药大学)》智慧树网课完整版章节测试答案
- 车联网教育平台构建-洞察与解读
- 输液连接装置安全管理专家共识解读
- 国土变更调查培训
- 2025pmp历年考试真题及答案下载
- 《成人肠道菌群移植的护理规范》
评论
0/150
提交评论