第4章汇编语言程序设计本章结合C54x的软件开发过程,介绍DSP所采用的COFF目标文件格式、结构和规范。介绍汇编语言指令的重要组成部分:伪指令和宏指令。讨论建立汇编语言程序并产生可执行文件的设计要求。指出汇编程序设计中的一些关键问题,并通过实例介绍设计的方法和技巧。1目录:•4.1C54x的软件开发过程•4.2公共目标文件格式COFF•4.3汇编器的伪指令•4.4C54x汇编语言的有关知识•4.5汇编语言程序设计第4章汇编语言程序设计2•4.1C54x的软件开发过程提供2种编程语言:汇编语言C/C++语言对于完成一般功能的代码,这两种语言都可使用,但对于一些运算量很大的关键代码,最好采用汇编语言来完成,以提高程序的运算效率。C54x的软件开发过程可以分为文本编辑、编译、汇编和连接这样四个基本步骤,如图4-1所示。第4章汇编语言程序设计3第4章汇编语言程序设计4C54x的软件开发需要借助于TI公司提供的软件开发工具:编译器、汇编器和连接器,另外还有一些辅助的软件包,如归档器、列表器和代码转换器等。这些软件开发工具都被集成在CCS(CodeComposerStudio)开发环境中。将在第6章详细介绍CCS的组成及其使用方法第4章汇编语言程序设计5C源文件C编译器汇编源文件汇编器汇编源文件COFF目标文件链接器可执行的COFF文件宏源文件存档器宏库存档器目标文件库建库工具运行时支持库EPROM编程器交叉引用列表器调试工具TMS320C54x绝对地址列表器HEX代码转换工具第4章汇编语言程序设计6汇编器和链接器生成的目标文件,是一个可以由C54x器件执行的文件。这些目标文件的格式称之为公共目标文件格式(COFF)。4.2公共目标文件格式COFF采用这种文件格式的优点是:将指令和数据按照段的概念进行组织和存储,这使得程序的可读性大大增强,更容易编写程序,更便于进行程序的移植,更利于进行模块化的程序设计,为管理代码段及系统存储器提供了灵活的方法和手段。第4章汇编语言程序设计7COFF文件有3种类型:COFF0、COFF1、COFF2每种类型的COFF文件,其标题格式都有所不同,但数据部分是相同的。链接器能够读/写所有类型的COFF文件,默认时链接器生成的是COFF2文件,采用-vn链接选项可以选择不同类型的COFF文件。第4章汇编语言程序设计84.2.1分段结构所谓“段”就是在存储器映像中占据连续空间的一段独立的代码或数据。每个目标文件都分成若干段。COFF目标文件包含以下三个默认的段:.text段:通常内含可执行代码;.data段:通常内含已初始化数据;.bss段:是为没有初始化的数据保留空间的。COFF目标文件的段又可分为两大基本类型:已初始化段和未初始化段。第4章汇编语言程序设计91.已初始化段包含程序代码、常数表格和数据。每个段都可以独立的进行重定位,且可访问在其它段中定义的符号。已初始化段的值是不可修改的,因而一般将它们建立在程序存储器中。主要有:.text段——已初始化段;.data段——已初始化段;.sect段——已初始化段,由汇编器伪指令建立的自定义段。第4章汇编语言程序设计102.未初始化段是为变量在数据存储器中保留空间的。它们在目标文件中没有实际内容,只是保留出空间,在运行程序时再利用这些空间去建立和存储变量。未初始化段一般应建立在片内或片外RAM中。•由这些段定义的空间仅作为临时存储空间,在程序运行时,可以利用这些存储空间存放变量。•未初始化段分为默认的和命名的两种,分别由汇编器伪指令.bss和.usect产生。.第4章汇编语言程序设计11目标文件中的段与目标存储器之间的关系:目标文件目标存储器.bss.data.textRAME2PROMROM第4章汇编语言程序设计123.段定义伪指令汇编器对段的处理是通过段伪指令来区别各个段的,并将段名相同的语句汇编在一起。汇编器有5条伪指令可识别汇编语言程序的各个部分:●.bss●.usect●.text●.data●.sect——定义未初始化段——定义未初始化段——定义已初始化段——定义已初始化段——定义已初始化段第4章汇编语言程序设计13•定义已初始化段的伪指令.text[段起点].data[段起点].sect“段名”[,段起点]段起点——是任选项。若选用,它为段程序计数器SPC定义一个起始值。若默认,则SPC从0开始。第4章汇编语言程序设计14•定义未初始化段的伪指令(1).bss伪指令用于在bss段中保留若干个空间。格式:.bss符号,字数[,[块标记][,定位标记]]符号——对应于保留的存储空间第一个字的变量名称。字数——表示在bss段或标有名字的段中保留若干个存储单元。每调用一次.bss伪指令,汇编器在相应的段保留更多的空间。第4章汇编语言程序设计15(2).usect伪指令用于为指定的命名段保留若干个空间。格式:标号.usect“段名”,字数[,[块标记][,定位标记]]建立一个自定义段但是没有初始化的段,在自定义的段中保留空间。每调用一次.usect伪指令,汇编器在指定的命名段保留更多的空间。第4章汇编语言程序设计•定义未初始化段的伪指令16•例4-1:段定义程序举例。.text.word1,2,3,4,5,6,7,8.data.word9,10,11,12.word13,14.word15,16.sect“var1”.word17,18.bssx1,19;为.bss段保留19个字单元空间。y1.usect“var2”,40;为var2段保留40个单元空间。第4章汇编语言程序设计17上列程序建立了5个段,情况如下:.text段:8个16位字1~8。.data段:8个16位字9~16。Var1段:2个16位字17,18。.bss段:保留19个字的连续空间,第一个单元的标号是x1。Var2段:保留40个字的连续空间,第一个单元的标号是y1。第4章汇编语言程序设计•例4-1:段定义程序举例。184.2.2汇编器对段的建立当汇编器遇到.text或.data或.sect命令时,将停止对当前段的汇编(相当于一条结束当前段汇编的命令),然后将紧接着的程序代码或数据汇编到指定的段中,直到再遇到另一条.text、.data或.sect命令为止。当汇编器遇到.bss或.usect命令时,并不结束当前段的汇编,只是暂时从当前段脱离出来,并开始对新的段进行汇编。第4章汇编语言程序设计19段程序计数器SPC汇编器为每个段都安排了一个单独的程序计数器称之为段程序计数器SPC。SPC表示在程序代码或数据段内当前的地址。开始时汇编器将每个SPC置0。当汇编器将程序代码或数据加到段内时,增加相应的SPC值。若再继续对某个段汇编,则相应的SPC就在先前的数值上继续增加。第4章汇编语言程序设计4.2.2汇编器对段的建立20•例4-2段定义应用举例汇编语言源程序:.datacoeff.word011h,022h,033h.bssbuffer,10prt.word0123h.textadd:LD0Fh,Aaloop:SUB#1,ABCaloop,AGEQ.dataivals.word0AAh,0BBh,0CCh;初始化数据段;3组数据放入.data段;在.bss段保留10个单元;0123h放入.data段;初始化文本段;1字指令;2字指令;2字指令;初始化数据段;3组数据放入.data段第4章汇编语言程序设计21汇编语言源程序:var2.usect“newvars”,1inbuf.usect“newvars”,7.textmpy:LD0Ah,Bmloop:MPY#0Ah,BBCmloop,BNOV.sect“vectors”.word011h,033h;建立newvars命名段,保留1个单元;在newvars段保留7个单元;初始化文本段;1字指令;2字指令;2字指令;建立vectors命名段;2组数据放入vectors命名段第4章汇编语言程序设计22经汇编后,得列表文件(部分):2**********************************3**汇编一个初始化表到.data段**4**********************************50000.data600000011coeff.word011h,022h,033h00010022000200337**********************************8**在.bss段中为变量保留空间**9**********************************100000.bssbuffer,1011**********************************12**仍然在.data段中**13**********************************1400030123prt.word0123h第4章汇编语言程序设计2315**********************************16**汇编代码到.text段**17**********************************180000.text190000100fadd:LD0Fh,A200001f010aloop:SUB#1,A00020001210003f842BCaloop,AGEQ00040001’22**********************************23**汇编另一个初始化表到.data段**24**********************************250004.data26000400aaivals.word0AAh,0BBh,0CCh000500bb000600cc27**********************************28**为更多的变量定义另一个段**29**********************************300000var2.usect“newvars”,1310001inbuf.usect“newvars”,7第4章汇编语言程序设计2432****************************************33**汇编更多代码到.text段**34****************************************350005.text360005110ampy:LD0Ah,B370006f166mloopMPY#0Ah,B0007000a380008f868BCmloop,BNOV00090006’39****************************************40**为中断向量.vectors定义一个自定义段**41****************************************420000.sect“vectors”4300000011.word011h,033h00010033源程序的行号段程序计数器目标代码汇编语言源程序第4章汇编语言程序设计25汇编语言源程序经过汇编后,共建立了5个段:.text段——文本段,段内有10个字可执行的程序代码.data段——已初始化的数据段,段内有7个字的数据vectors段——用.sect命令生成的命名段,段内有2个字的初始化数据.bss段——未初始化的数据段,在存储器中为变量保留10个存储单元newvars段——用.usect命令建立的命名段,为变量保留8个存储单元第4章汇编语言程序设计262*******************************3**汇编一个初始化表到.data段**4*******************************50000.data600000011coeff.word011h,022h,033h00010022000200337*******************************8**在.bss段中为变量保留空间**9*****