您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 酒店餐饮 > 第五章 C54X编译连接工具的使用
第五章编译连接工具的使用一.C54X汇编工具的使用C54X的源程序可以使用汇编或C语言编写。使用汇编语言是可以使用助记符指令集(MnemonicInstructionSet)或代数指令集(AlgebraicInstructionSet),但两种不能混用。两种指令的汇编语言比较low_pass_mac:push(st1);pshmst1push(st0);pshmst0push(ar0);pshmar0push(bk);pshmbkar2=data(#t_ar2);mvdm#t_ar2,ar2ar3=data(#t_ar3);mvdm#t_ar3,ar3ar0=#1;stm#1,ar0bk=#N;stm#N,bk*ar3+%=a;stla,*ar3+%repeat(#(N-1)),a=0;rptza,#(N-1)a+=*ar2+0%**ar3+0%;mac*ar2+0%,*ar3+0%,aASM500命令格式如下:asm500[inputfile[objectfile[listingfile]]][-options]inputfile:汇编源文件名,缺省后缀为.asmobjectfile:编译输出的OBJ文件名,缺省后缀为.objlistingfile:产生的列表文件名,缺省后缀为.lstoptions:编译器使用的各种选择。常用选项有:-c:若使用该选项,编译器忽略字母的大小写。例如abc与ABC是一样的。系统缺省为区分大小写。-i:设置搜索路径。通知编译器在指定的搜索路径中去查找.copy,.include中的文件。用法举例:-ic:\c54x。-l:(小写的L)在编译时产生列表文件,缺省后缀为.lst-mg:汇编源程序使用代数指令集或在源代码中使用.Algebraic-s:将所有的符号都放入符号表。若不使用该选项,编译器仅将全局变量放入符号表。-v:指定版本。特别是需要使用BOOTLOADER时,应加-v548开关。先看两个汇编源程序:file1.asm.globaltestloop:calltestbcloop,ageq.endfile2.asmfile3.asm.globaltest.globaltesttest:test:mar*ar3+mar(*ar3+)add#1,aa=a+#1retreturn.end.end汇编工具ASM500的使用举例asm500file1.asmenterasm500file2-lenterasm500file3-mg-lenterTMS320C54xCOFFAssemblerVersion1.20SunJul3012:11:252000Copyright(c)1997TexasInstrumentsIncorporatedfile2.asmPAGE11.globaltest23000000test:40000006D93mar*ar3+5000001F000add#1,a00000200016000003FC00ret78.endNoErrors,NoWarningsTMS320C54xCOFFAssemblerVersion1.20SunJul3012:21:262000Copyright(c)1997TexasInstrumentsIncorporatedfile3.asmPAGE11.globaltest23000000test:40000006D93mar(*ar3+)5000001F000a=a+#100000200016000003FC00return78.endNoErrors,NoWarningsC54X汇编语言书写规范语法:[label][:]指令[操作数][;注释]#前缀表示立即数或直接地址后缀B或b表示二进制常数例如:LD#1000B,A后缀Q或q表示八进制常数,或以0开始的常数例如:LD#10Q,A(010,A)十二进制常数例如:LD#1000,AC54X汇编语言书写规范后缀H或h表示十六进制常数例如:LD#1000H,A使用.set定义一个符号的值例如addr.set1000h…stm#addr,ar0标号的使用例如bloop…loop:ssbxintm使用.global定义全局标号C54X汇编语言书写规范使用符号$表示当前PC值例如B$可以使用结构例如item.struct..intvalue..intdeltat.i_len.endstruct..array.tagitem..bssarray,i_lenC54X汇编语言书写规范可以定义宏例如mypush.macro.pshmah.pshmal.pshmbh.pshmbl..endm二.C54X连接工具的使用使用LNK500命令可以将一个或多个OBJ文件连接为一个.OUT文件。在连接时,可以通过段定位控制命令将不同的代码、数据写入不同的内存单元。注意:LNK500生成的OUT文件不是纯二进制代码文件,而是包含代码、符号表、代码定位信息的复合文件。LNK500的使用格式:lnk500[-options]filename1....filenamen使用举例:lnk500file1.objfile2.obj-ofile.outLNK500命令常用的选项有:-eglobal_symbol:定义程序的进入点。global_symbol必须在源程序中使用.global命令说明。-c:使用C编译器的ROM初始化模式。-cr:使用C编译器的RAM初始化模式。-idir:指定库文件的路径。-lfilename:指定连接时使用的库文件名。-mfilename:生成MAP文件。-ofilename:指定生成的OUT文件名。系统缺省为a.out。将文件file1.asm和file2.asm连接成OUT文件:lnk500file1file2-mfile.map-ofile.out通过查看MAP文件可以获得变量、子程序等符号的具体地址。注意:MAP文件只列出全局变量的地址。(用.global说明的符号)举例:编译连接实验程序exer0.asm,得到exer0.map文件。从MAP文件获得变量temp,子程序int_ser的地址。三.汇编连接工具对段的处理为了灵活使用C54X的内存,可以将不同的代码段放入不同的内存中。在汇编源程序中可以使用下列指令:.bss该指令表示在.bss段中保留空间。用法:.bsssymbol,size.usect该指令表示在指定的段中保留空间。用法:symbol.usect“sectionname”,size.text将代码或数据放入.text段中.data将数据放入.data段中.sect将代码或数据放入指定的段中。用法:symbol.sect“sectionname”,size在连接时使用相应的控制命令以确定具体的内存地址。下面给出其中一种方法:其中,.bss,.text,.data三个段是标准定义,而.vect,.buffer是自定义的。(t.cmd)MEMORY{PAGE0:PROG:origin=1800h,length=800hPAGE4:PROG:origin=0200h,length=100hPAGE1:DATA:origin=0c00h,length=100hPAGE2:DATA:origin=0d00h,length=200hPAGE3:DATA:origin=0f00h,length=100h}SECTIONS{.textPROGPAGE0.vectPROGPAGE4.bssDATAPAGE1.dataDATAPAGE2.bufferDATAPAGE3}下面是例子程序t.asm的一部分,其中红色部分为段的定义.bsstemp,1buf.usect.buffer,10.sect.vectstart:bmainstartnopnopb$.textmainstart:ssbxintm;disableallinterrupt!编译连接程序exer.asm,通过MAP文件检查各个段是否装入指定的内存地址。LNK500的选项可以放入内存定位文件中。如user.cmd,这时使用连接命令可以简化为:lnk500user.cmd四.C编译器C54X的C编译器有两个部分组成:先剖系C源代码并完成优化,然后将其转化为汇编源代码。另一部分就是前面介绍过的汇编语言工具。所以当使用CL500命令对C语言进行编译时,它实际上调用:ac500——C剖析器opt500——优化器cg500——汇编语言生成器asm500——汇编编译器若在CL500命令中使用了-z选项,C编译器还可以自动调用LNK500完成连接操作。下面是一些常用的选项:-g:允许使用C代码级的调试。-k:保留生成的汇编源程序。-ss:产生C的注释汇编源程序。-z:允许调用连接程序。-o:完成优化CL500还有许多有关C剖析,优化的选项。请参考《TMS320C54xOptimizingCCompilerUserGuide》我们举一个例子:/**************************************//*function.c*//*(Samplefileforwalkthrough)*//**************************************/intmain(i)inti;{return(i0?-i:i);}cl500-ofunctionentercl500-k-ofunctionenter(保留汇编)cl500-ss-ofuntionenterlnk500-cfunction.objlnk.cmd-ofunction.out-lrts.lib或cl500function.c-zlnk.cmd-ofunction.out-lrts.libC代码的程序入口地址符号为_c_int00。LNK500时使用的-c和-cr是对C语言中常量(放在.cinit段中)的处理不同。-c表示在运行时处理,而-cr则在装入时处理。_main:;*Aassignedto_iFRAME#-1nopSTLA,*SP(0);|2|;------------------------------------------------------------------------------;3|return(i0?-i:i);;------------------------------------------------------------------------------SSBXSXMnopLD*SP(0),A;|3|BCL3,AGEQ;|3|;branchoccurs;|3|BDL4;|3|LD*SP(0),A;|3|NEGA,A;|3|;branchoccurs;|3|L3:LD*SP(0),A;|3|L4:FRAME#1;|4|RET;|4|;returnoccurs;|4|;_main:;*Aassignedto_i;*Aassignedto_i;3|return(i0?-i:i);;------------------------------------------------------------------------------SSBXSXMLD*(AL),A;|3|ABSA,A;|3|RET;|4|;returnoccurs;|4|优化后的结果再例:优化编译器比较a.asm(优化后)和a0.asm(未优化)C语言编写说明使用Interrupt关键字说明函数的返回使用RETE,例如interruptvoidint_handle(){intj,flag;……}汇编完成后,使用开中断RETE返回。C语言编写说明使用volatile关键字。优化器会尽量减少存储器的访问,所以有时必须禁止优化,特别是循环控制变量。参见下面的例子unsignedint*ctrl;while(*ctrl!=0xff);……L2:;------------------------------------
本文标题:第五章 C54X编译连接工具的使用
链接地址:https://www.777doc.com/doc-3973646 .html