《DSP汇编语言程序设计.ppt》由会员分享,可在线阅读,更多相关《DSP汇编语言程序设计.ppt(187页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第4章章DSP汇编语言程序设计汇编语言程序设计4.1TMS320C54x汇编语言的基本概念汇编语言的基本概念4.2TMS320C54x汇编语言程序设计的基本方法汇编语言程序设计的基本方法4.3TMS320C54x汇编语言程序的编辑、汇编与链接过程汇编语言程序的编辑、汇编与链接过程4.4汇编器汇编器4.5链接器链接器4.6汇编程序举例汇编程序举例1 1汇编语言源程序的句法格式汇编语言源程序的句法格式 要点要点以以.asm.asm为扩为扩展名展名每一行由每一行由4 4个部分个部分组组成成 格式格式 标号标号:空格空格 助记符助记符 空格空格 操作数操作数 空格空格 ;注释;注释 中的内容为可选择
2、部分供本程序的其它部分或其它程序调用。标号是任选项,标号后面可以加也可以不加冒号“:”。4.1 TMS320C54x4.1 TMS320C54x汇编语言的基本概念汇编语言的基本概念要要 点点1.1.标号必须从第列写起,标号必须从第列写起,2.2.标号最多可达标号最多可达3232个字符,可以是个字符,可以是A AZ Z,a az z,0 0 9 9,_ _,以及,以及$,但标号的第,但标号的第1 1个字符不能是数字。个字符不能是数字。3.3.引用标号时,标号的大小写必须一致。引用标号时,标号的大小写必须一致。4.4.标号的值就是段程序计数器标号的值就是段程序计数器SPCSPC的值。的值。5.5.
3、如果不用标号,则第一个字母必须为空格、分号如果不用标号,则第一个字母必须为空格、分号 或星号(或星号(*)。)。要点要点建议建议 标号标号:空格空格 助记符助记符 空格空格 操作数操作数 空格空格 ;注释;注释 可以是助记符指令、汇编指令、宏可以是助记符指令、汇编指令、宏指令和宏调用命令。指令和宏调用命令。1.1.助助记记符指令,一般用大写;符指令,一般用大写;2.2.汇编汇编命令和宏命令,以句号命令和宏命令,以句号“.”“.”开始,且开始,且为为通常用小写。通常用小写。要点要点 标号标号:空格空格 助记符助记符 空格空格 操作数操作数 空格空格 ;注释;注释 1.1.指令中的操作数或汇指令中
4、的操作数或汇编命令中定义的内容编命令中定义的内容2.2.操作数之间必须用逗操作数之间必须用逗号号“,”分开。分开。1.1.从分号从分号“;”开始开始 2.2.可以放在指令或汇编命令后面,可以放在指令或汇编命令后面,也可以放在单独的一行或数行。也可以放在单独的一行或数行。要点要点2 2汇编语言源程序的数据型式汇编语言源程序的数据型式 二进制:如二进制:如1110001b或或1111001B;八进制:八进制:226q或或572Q;十进制:十进制:1234或或+1234或或-1234(缺省型)(缺省型)十六进制:十六进制:0A40h或或0A40H或或0 xA40浮点数:(仅浮点数:(仅C语言程序中能
5、用,汇编程序不能用)语言程序中能用,汇编程序不能用)字符:字符:D,每位字符由每位字符由8位位ASCII码表示;码表示;字符串:字符串:“thisisastring”符号用作标号、常数和替代符号。符号名可以是长达符号用作标号、常数和替代符号。符号名可以是长达200个字符的字母个字符的字母(AZ,az)、数字、数字(09)加上加上$或下或下划线划线(_)。第一个字符不能是数字,符号中间不能有空格。第一个字符不能是数字,符号中间不能有空格。符号分大小写,例如:符号分大小写,例如:Abc。3汇编语言源程序的汇编语言源程序的符号符号4表达式1)运算顺序影响表达式运算顺序的三个主要因素是:圆括号、优先级
6、和同级运算顺序。圆括号内的表达式最先运算,不能用或来代替()。TMS320C54x汇编器的优先级使用与C语言类似,优先级高的运算先执行。表4-1给出了表达式中可用的运算符及优先级。表4-1表达式的运算符及优先级符号操作计算顺序+、取正、取负、按位求补从右到左*、/、%乘、除、求模从左到右左移、右移从左到右+、加、减从左到右、小于、小于等于、大于、大于等于从左到右!=、=不等于、等于从左到右&按位与从左到右按位异或从左到右|按位或从左到右2)表达式的合法性表达式在使用符号时,汇编器对符号在表达式中的使用具有一些限制,由于符号的属性不同(即定义不同),使表达式存在合法性问题。符号按属性可分为三种:
7、外部符号、可重定位符号和绝对符号。外部符号是那些在一个模块定义而被另一个模块引用的符号。(一般用.global定义)在汇编和执行阶段,符号值、符号地址不同的是可重定位符号,相同的是绝对符号。含有乘、除法的表达式中只能使用绝对符号(其值不能改变)。表达式中不能使用未定义的符号。表4-2表达式符号的合法性若A为若B为则A+B为则AB为绝对绝对绝对绝对绝对外部外部非法绝对可重新定位可重新定位非法可重新定位绝对可重新定位可重新定位可重新定位可重新定位非法绝对可重新定位外部非法非法外部绝对外部外部外部可重新定位非法非法外部外部非法非法4.1.3TMS320C54x伪指令TMS320C54x伪指令给程序提
8、供数据、控制汇编过程。具体实现以下任务:(1)将数据和代码汇编到特定的段。(2)为未初始化的变量保留存储空间。(3)控制展开列表的形式。(4)存储器初始化。(5)汇编条件块。(6)定义全局变量。(7)指定汇编器可以获得宏的特定库。(8)检查符号调试信息。表4-3常用伪指令伪指令句法作用title.title“string”标题名。例如:.title“example.asm”end.end结束伪指令,放在汇编语言源程序的最后text.text段起点包含可执行程序代码data.data段起点包含初始化数据int.intvalue1,valuen设置16位无符号整型量word.wordvalue1,
9、valuen设置16位带符号整型量bss.bss符号,字数为未初始化的变量保留存储空间sect.sect“段名”,段起点建立包含代码和数据的自定义段usect符号.usect“段名”,字数为未初始化的变量保留存储空间的自定义段def.def变量1,变量n在当前模块中定义,并可在别的模块中使用ref.ref变量1,变量n在当前模块中使用,但在别的模块中定义global.global变量1,变量n可替代.def和.ref伪指令mmregs.mmregs定义存储器映像寄存器的替代符号1段定义伪指令段定义伪指令有以下五个:.bss(未初始化段).data(已初始化段).sect(已初始化段).text
10、(已初始化段).usect(未初始化段)1)未初始化段.bss和.usect命令建立未初始化段。.bss伪指令为未初始化变量在.bss段中预留空间;.usect伪指令在一个未初始化的自定义段中预留空间。.usect伪指令与.bss类似,但是它可以把预留空间与.bss段分离。这两条命令的句法如下:.bss符号,字数符号.usect“段名”,字数2)已初始化段.text、.data和 .sect命 令 建 立 已 初 始 化 段。这三条命令的句法如下:.text段起点.data段起点.sect段名”,段起点.text后是汇编语言程序的正文。经汇编后,.text后的是可执行程序代码,一般存放于程序存
11、储器区域中。.data后是已初始化数据,有int和word两种数据形式。由命令文件可以将定义的数据存放于程序或数据存储器中。.sect建立包含代码和数据的自定义段,常用于定义中断向量表。2常数初始化伪指令(1).bes和.space。汇编器对这些保留的位填0,将位数乘以16来实现保留字。当标号与.space连用时,标号指向保留位的第一个字;当标号与.bes连用时,标号指向保留位的最后一个字。(2).field。此指令可以把多个域打包成一个字,汇编器不会增加SPC的值,直至填满一个字。(3).float和.xfloat。这两个指令将32位浮点数存放在当前段的连续字中,高位字先存。.float伪指
12、令能自动按长字(偶地址)边界排列,但.xfloat不能。(4).long和.xlong。这两个指令将32位数存放在当前段的连续字中,高位字先存。.long伪指令能自动按长字(偶地址)边界排列,但.xlong不能。(5).string和.pstring。.string类似于.byte,把8位字符放到当前段的连续字中,每8位字符占一个字。(6).int和.word。例如“table:.int1,2,3,4”,或例“table:.word8,6,4,2”。3段程序计数器定位伪指令段程序计数器定位伪指令的句法如下:.alignsizeinbits该指令使段程序计数器SPC对准1128字的边界,保证该指
13、令后面的代码从一个字或页的边界开始。不同的操作数代表了不同的含义:“1”表示让SPC对准字边界;“2”表示让SPC对准长字/偶地址边界;“128”表示让SPC对准页边界。当.align不带操作数时,其缺省值为128,即对准页边界。4条件汇编伪指令以下分两种情况介绍条件汇编伪指令。(1)第一种情况:.ifwell-definedexpression.elseifwell-definedexpression.else.endif(2)第二种情况:.loopwell-definedexpression.break well-definedexpression.endloop4.1.4TMS320C5
14、4x宏命令TMS320C54x汇编器支持宏语言。宏命令是源程序中具有独立功能的一段程序代码,它可以根据用户的需要,由用户创建自己的指令。宏命令一经定义,便可在以后的程序中多次调用,从而可以简化和缩短源程序。1宏定义宏命令可以在源程序的任何位置定义,但必须在宏调用之前先定义好。宏定义也可以嵌套。定义如下:宏命令名.macro;宏体;.endm2调用宏命令定义好之后,就可以在源程序中将宏命令名作为指令来调用这个宏了。格式如下:宏命令名3宏展开当源程序中调用宏命令时,汇编时就将宏命令展开。在宏展开时,汇编器将实际参数传递给形式参数,再用宏定义替代宏调用语句,并对其进行汇编。1*23*add34*5*
15、ADDRP=P1+P2+P3;说明宏功能说明宏功能67add3.macrop1,p2,p3,ADDRP;定义宏定义宏89LDp1,A;将参数将参数1赋给赋给A10ADDp2,A;将参数将参数2与与A相加相加11ADDp3,A;将参数将参数3与与A相加相加12STLA,ADDRP;将结果将结果A的低字存参数的低字存参数413.endm;结束宏结束宏141516.globalabc,def,ghi,adr;定义全局符号定义全局符号1718000000add3abc,def,ghi,adr;调用宏调用宏110000001000!LDabc,A;宏展开宏展开10000010000!ADDdef,A10
16、000020000!ADDghi,A10000038000!STLA,adr例例4-2宏定义、宏调用和宏展开的一个例子。宏定义、宏调用和宏展开的一个例子。4.2TMS320C54x汇编语言程序设计的汇编语言程序设计的基本方法基本方法DSP的软件开发一般有以下几种方式:(1)直接编写汇编语言源程序;(2)编写C语言程序;(3)混合编程(既有C代码,又含汇编代码)。4.2.1TMS320C54x汇编语言源程序的完整结构汇编语言源程序中,以.asm为程序的扩展名,程序员用“段”伪指令来组织程序的结构。程序一般由数据段、堆栈段和代码段组成。.data用于存放有初值的数据块;.usect用于为堆栈保留一
17、块存储空间;.text用于设置代码段。另外,.bss用于为变量保留一块存储空间;.sect常用于定义中断向量表。程序的基本结构有四种:顺序结构、分支结构、循环结构和子程序结构。4.2.2顺序结构程序顺序结构是最基本、最简单的程序结构形式,程序中的语句或结构被连续执行。【例1】试编制程序,求出下列公式中z的值。z=(x+y)8-w源程序编制如下:*ex41.asmz=(x+y)*8-w*.titleex41.asm.mmregsSTACK.usectSTACK,10H;开辟堆栈空间.bssx,1;为变量分配4个字的空间.bssy,1.bssw,1.bssz,1.defstart.datatabl
18、e:.word6,7,9.textstart:STM#0,SWWSR;零等待状态STM#STACK+10H,SP;设置堆栈指针STM#x,AR1;AR1指向xRPT#2;从程序存储器传送3个值至数据存储器MVPDtable,*AR1+LDx,AADD y,A;A=x+yLDA,3;A=(x+y)*8SUBw,A;A=(x+y)*8-wSTLA,zend:Bend.end采用顺序结构编程时应注意:合理选取算法;采用合适的寻址方式进行指令选取;存储数据及结果时注意内存空间的分配和寄存器的使用。4.2.3分支结构程序程序的分支主要是靠条件转移指令来实现的。TMS320C54x具有丰富的程序控制与转移
19、指令,利用这些指令可以执行分支转移、循环控制以及子程序操作。分支转移指令(如B、BACC、BC等)通过改写PC,以改变程序的流向。分支结构也称条件结构。【例2】试编制程序,求一个数的绝对值,并送回原处。源程序编制如下:*ex42.asmABSofpositiveornegative*.title ex42.asm.mmregsSTACK.usectSTACK,10H;开辟堆栈空间.bss x,1;为变量分配一个字的空间.def start.datatable:.word-7.textstart:STM#0,SWWSR;零等待状态STM#STACK+10H,SP;设置堆栈指针STM#x,AR1M
20、VPDtable,*AR1LD*AR1,ABCend,AGT;若A0,则转至end,否则往下执行ABS ASTLA,xend:Bend.end采用分支结构编程时应注意:正确选择条件运算符;正确选择相应指令;每个分支中要有完整的终结点;对于多分支程序,要检查每个程序正确与否。4.2.4循环结构程序循环结构程序设计主要用于某些需要重复进行的操作,它简化程序,节约内存。循环结构程序的设计可分为设置循环初始状态、循环体和循环控制条件三部分。循环初始状态主要是指设置循环次数的计数初值,以及其他为能使循环体正常工作而设置的初始状态等(比如缓冲区首地址)。循环体是循环操作(重复执行)部分,包括循环的工作部分
21、及修改部分。循环的工作部分是实现程序功能的主要程序段;循环的修改部分是指当程序循环执行时,对一些参数(如地址、变量)的有规律的修正。循环控制部分是循环程序设计的关键。每个循环程序必须选择一个控制循环程序运行和结束的条件。【例3】试编制程序,在4项乘积aixi(i=1,2,3,4)中找出最大值,并存放在累加器A中。源程序编制如下:.titleex43.asm.mmregsSTACK.usectSTACK,10H.bssa,4.bssx,4.defstart.datatable:.word 1,2,3,4.word 8,6,9,7.textstart:STM#0,SWWSRSTM#STACK+10
22、H,SPSTM#a,AR1RPT#7MVPD table,*AR1+STM#a,AR1STM#x,AR2STM#2,AR3LD*AR1+,TMPY*AR2+,A;第一个乘积在累加器A中loop1:LD*AR1+,TMPY*AR2+,B;其他乘积在累加器B中MAXA;累加器A和B比较,选大的存在A中BANZloop1,*AR3-;此循环中共进行3次乘法和比较end:Bend.end4.2.5子程序结构子程序是一个独立的程序段,具有确定的功能,可被其他程序调用,调用它的程序一般为主程序。子程序调用指令(如:CALL、CALA、CC等)将一个返回地址压入堆栈,执行返回指令(如RET、RC等)时复原。
23、子程序的定义的格式为子程序名:RET子程序名【例4】试编制程序,求。这是一个典型的乘法累加运算,在数字信号处理中用得很多。源程序编制如下:*ex44.asmy=a1*x1+a2*x2+a3*x3+a4*x4*.titleEX44.asm.mmregsSTACK.usect STACK,10H;开辟堆栈空间.bss x,4;为变量分配9个字的空间.bss a,4.bss y,1.def start.datatable:.word1*32768/10.word2*32768/10.word-3*32768/10.word4*32768/10.word8*32768/10.word6*32768/1
24、0.word-4*32768/10.word-2*32768/10.textstart:STM#0,SWWSR;零等待状态SSBXFRCTSTM#STACK+10H,SP;设置堆栈指针STM#x,AR1;AR1指向aRPT#7;从程序存储器传送8个值主数据存储器MVPDtable,*AR1+CALLSUM;调用SUM子程序end:BendSUM:STM#x,AR2;子程序实现乘累加STM#a,AR3RPTZA,#3MAC*AR2+,*AR3+,ASTHA,yRET.end【例5】编写浮点乘法程序,完成x1x2=0.3(-0.8)运算。虽然TMS320C54x是定点DSP,但它可通过以下3条指令
25、支持浮点运算:EXPASTT,EXPONENTNORMA假设定点数放在A中,这样就可以将定点数转换为浮点数了。反之,若将浮点数转换为定点数,只要将指数取反即可。浮点数由尾数与指数两部分组成,其与定点数的关系如下:定点数=尾数2(指数)指数与尾数均用补码表示。例如,本例中x1的定点数0 x3333(0.4)用浮点数表示时,尾数为0 x6666(0.8),指数为1,即0.82-1;x2的定点数0 xb334(-0.6)用浮点数表示为-0.6=-0.62-0。程序中所用的数据变量如下:x1:定点被乘数;e1:被乘数的指数;m1:被乘数的尾数;x2:定点乘数;e2:乘数的指数;m2:乘数的尾数;ep:
26、乘积的指数;mp:乘积的尾数;product:定点乘积;temp:暂存单元。首先将定点数x1、x2转换为浮点数,浮点数相乘即指数相加,尾数相乘,最后再将乘积(浮点数)转换为定点数。*ex45.asmx1*x2=0.4*(-0.6)*.title EX45.asm.mmregsSTACK.usect STACK,10H.bssx1,1.bssx2,1.bsse1,1.bssm1,1.bsse2,1.bssm2,1.bssep,1.bssmp,1.bssproduct,1.bsstemp,1.defstart.datatable:.word4*32768/10.word-6*32768/10.te
27、xtstart:STM#0,SWWSRSTM#STACK+10H,SP;设置堆栈指针MVPDtable,x1;将x1、x2传送至数据存储器MVPDtable+1,x2LDx1,16,A;先将x1加载至A(3116位),因小数在高位EXP A;提取指数STT,e1;保存x1的指数NORMA;将x1规格化为浮点数,求得尾数STH A,m1;保存x1的尾数LDx2,16,AEXP ASTT,e2;保存x2的指数NORMASTHA,m2;保存x2的尾数CALLMULT;调用浮点乘法子程序done:BdoneMULT:SSBXFRCT;小数相乘消去冗余符号位SSBXSXM;符号位扩展LD e1,A:指数
28、相加ADDe2,ASTL A,epLDm1,T;尾数相乘(有符号数),乘积左移1位MPYm2,AEXPA;对尾数乘积规格化ST T,tempNORMASTHA,mp;保存乘积尾数LD temp,A;修正乘积指数,ep+temp=epADDep,ASTL A,ep;保存乘积指数NEG A;乘积指数反号,将浮点乘积转换为定点数STL A,tempLD temp,TLD mp,16,ANORMASTHA,product;保存定点乘积RET.end程序执行结果如下:x13333Hx2B334He10001Hm16666He20000Hm2B334Hep0002Hmp8520HproductE148Ht
29、empFFFEH4.3TMS320C54x汇编语言程序的编辑、汇汇编语言程序的编辑、汇编与链接过程编与链接过程软件开发过程软件开发过程汇编语言源程序的编辑、汇编和链接过程4.4汇汇编编器器汇编器(Assembler)将汇编语言源文件汇编成机器语言COFF的目标文件。源文件中包括指令、汇编指令以及宏指令。汇编器的功能如下:将汇编语言源程序汇编成一个可重新定位的目标文件(.obj文件)。根据需要,可以生成一个列表文件(.lst文件)。根据需要,可以在列表文件后面附加一张交叉引用表。将程序代码分成若干段,为每个目标代码段设置一个SPC(段程序计数器)。定义和引用全局符号。汇编条件程序块。支持宏功能,
30、允许定义宏命令。运行汇编程序运行汇编程序 asm500inputfileobjectfilelistingfile-options汇编汇编器是名器是名为为的可的可执执行程序行程序 例如例如asm500-l-s-x源源程程序序经经汇汇编编后后将将生生成成一一个个cjy.objobj目目标标文文件件、列列表表文文件件、符符号号表表(在在目目标标文文件件中中)以以及及交交叉叉引引用用表表(在列表文件中)。(在列表文件中)。建建立立公公共共目目标标文文件件格式格式的的目目标标文件文件 汇编汇编器器和和链链接器接器功能功能的异同的异同相同点相同点不同点不同点汇汇编编器器建建立立的的是是 相相 对对 地地
31、 址址COFFCOFF文文件件,即即.obj.obj文件文件链链接接器器建建立立的的是是 绝绝 对对 地地 址址COFFCOFF文文件件,即即.out.out文件文件汇编器根据汇编命令用适当的段将各部分汇编器根据汇编命令用适当的段将各部分程序代码和数据连在一起,构成目标文件;程序代码和数据连在一起,构成目标文件;链接器的一个任务就是分配存储单元,即链接器的一个任务就是分配存储单元,即把各个段重新定位到目标存储器中。把各个段重新定位到目标存储器中。不同种类的区别不同种类的区别COFFCOFF文件种文件种类类 C54x汇汇编编器器和和C编编译译器器建建立立的的是是COFF2文文件件。C54x能能够
32、够读读/写写所所有有形形式式的的COFF文文件件,缺缺省省值值下下链链接接器器生生成成的的是是COFF2文文件件,用用链链接接器器vn选选项项可以选择不同形式的可以选择不同形式的COFF文件。文件。COFF0COFF0COFF1COFF1COFF2COFF2 标题标题格式不相同格式不相同数据部分是相同数据部分是相同段(段(sectionssections)的概念)的概念 特点特点定义定义 分分段段的的优优点点:在在目目标标文文件件中中将将放放置置程程序序、数数据据、变变量量的的代代码码分分开开,便便于于在在链链接接时时作作为为一一个个单单独独的的部部分分分分配配存存储储器器。由由于于大大多多数
33、数系系统统都都有有好好几几种种形形式式的的存存储储器器,通通过过对对各各个个段段重重新新定定位位,可可以以使使目目标存储器得到更为有效的利用。标存储器得到更为有效的利用。段段是是在在存存储储器器图图中中占占据据相相邻邻空空间间的代的代码码或数据或数据块块。一一个个目目标标文文件件中中的的每每一一个个段都是分开的和不相同的。段都是分开的和不相同的。目标文件中的段与目标存目标文件中的段与目标存储器之间的关系储器之间的关系COFFCOFF文件中的符号文件中的符号 用用于于处处理理符符号号的汇编命令的汇编命令外部符号外部符号在一个模在一个模块块中定中定义义的的定定义义,可在另一个模可在另一个模块块中引
34、用的符号。中引用的符号。.def.def:在在当当前前模模块块中中定定义义,并并可在别的模块中使用的符号。可在别的模块中使用的符号。.ref.ref:在在当当前前模模块块中中使使用用,但但在别的模块中定义的符号。在别的模块中定义的符号。.global.global:可可以以是是上上面面的的随随便便哪哪一种情况。一种情况。.defx.refy.globalz.globalqq:BB3NOP4x:MVA0,A1MVKLy,B3Bzx在在此此模模块块中中定定义义,可可被被别别的的模模块块引引用用;y在在这这里里引引用用,它它在在别别的的模模块块中中定定义义;q在在此此模模块块中中定定义义,可可被被别
35、别的的模模块引用块引用;z在这里引用,它在别的模块中定义。在这里引用,它在别的模块中定义。注注意意4.4.2汇编器对段的处理汇编器对段的处理用用于于定定义义段段的汇编命令的汇编命令.bss .bss 未初始化段未初始化段.usect.usect 未初始化自定义段未初始化自定义段.text .text 已初始化程序正文段已初始化程序正文段.data .data 已初始化程序数据段已初始化程序数据段.sect .sect 已初始化自定义段已初始化自定义段如果如果汇编语汇编语言程序中一个段命令都没言程序中一个段命令都没有用,那么有用,那么汇编汇编器把程序中的内容都器把程序中的内容都汇编汇编到到.te
36、xt.text段。段。注意注意(1 1)未初始化段)未初始化段 未初始化段由未初始化段由.bss.bss和和.usect.usect命令建立命令建立 位置位置为变量为变量保留存保留存储储器空器空间间作用作用通常将它通常将它们们定位到定位到RAMRAM区区 使用方法使用方法.bss符号符号,字数字数符符号号.usect“段段名名”,字字数数对应于保对应于保留的存储留的存储空间第一空间第一个字的变个字的变量名称量名称 程序程序员为员为自定自定义义未未初始化段起的名字初始化段起的名字 (2 2)已初始化段)已初始化段 已初始化段是由已初始化段是由.text.text、.data.data的的.sec
37、t.sect命令建立命令建立 位置位置包含有可包含有可执执行代行代码码或初始化数据或初始化数据 作用作用通常将它通常将它们们定位到定位到EPROMEPROM区区 使用方法使用方法.text .text 段起点段起点.data .data 段起点段起点.sect “.sect “段名段名”,段起点,段起点 段程序段程序计计数数器(器(SPCSPC)定)定义义的一个起的一个起始始值值。程序程序员为员为自定自定义义未未初始化段起的名字初始化段起的名字 (3)段程序计数器()段程序计数器(SPC)编址编址过程过程表示一个程序代码段或数据段内的当前地址表示一个程序代码段或数据段内的当前地址 作用作用一开
38、始,汇编器将每个一开始,汇编器将每个SPCSPC置置0 0。当汇编器。当汇编器将程序代码或数据加到一个段内时,相应将程序代码或数据加到一个段内时,相应的的SPCSPC就增加。如果再继续对某个段汇编,就增加。如果再继续对某个段汇编,则相应的则相应的SPCSPC就在先前的数值上继续增加。就在先前的数值上继续增加。链接器在链接时要对每个段进行重新定位。链接器在链接时要对每个段进行重新定位。当当汇汇编编器器遇遇到到.text,.data,.sect伪伪指指令令时时,汇汇编编器器停停止止将将随随后后的的程程序序代代码码或或数数据据编编译译进进当当前前段段,而而是顺序编译进遇到的段中。是顺序编译进遇到的段
39、中。当当汇汇编编器器遇遇到到.bss,.usect伪伪指指令令时时,汇汇编编器器暂暂时时脱脱离离当当前前段段,随随后后的的程程序序代代码码或或数数据据仍仍将将顺顺序序编编译译进当前段。进当前段。汇汇编编程程序序对对源源程程序序汇汇编编时时,如如果果采采用用-l(小小写写的的L)选选项项,则则汇汇编编后后将将生生成成一一个个列列表表文文件件。下下面面给给出出了了一一个个列列表表文文件件的的例例子子,用用来来说说明明在在汇汇编编过过程程中中段段伪伪指指令令在在不不同同的的段段之之间间来来回回交交换换,逐逐步步建建立立COFF段段的的过过程程和和SPC的修改过程。的修改过程。列表文件中每行由四个区域
40、组成,即Field1:源程序的行号。Field2:段程序计数器SPC。Field3:目标代码。Field4:源程序。【例6】段定义伪指令应用举例。2*3*Assembleaninitializedtableinto.data.*4*50000.data600000011 011H,022H,033H00010022000200337*8*Reservespacein.bssforavariable.*9*100000.bssbuffer,1011*12*Stillin.data.*13*1400030123ptr.word0123H15*16*Assemblecodeintothe.texts
41、ection.*17*180000.text190000100Fadd:LD0FH,A200001F010aloop:SUB#1,A00020001210003F842BCaloop,AGEQ0004000122*23*Anotherinitializedtableinto.data.*24*250004.data26000400aaivals.word0AAH,0BBB,0CCH000500bb000600cc27*28*Defineanothersectionformorevariables.*29*300000 var2.usectnewvars,1310001inbuf.usectne
42、wvars,732*33*Assemblemorecodeinto.text.*34*350005.text360005ll0ampy:LD0AH,B370006f166mloop:MPY#0AH,B0007000a380008f868BCmloop,BNOV0009000639*40*Defineanamedsectionforint.vectors.*41*420000.sectvectors4300000011.word011H,033H4400010033此例共生成五个段:.text:包含10个字的目标代码。.data:包含7个字的数据。vectors:由.sect伪指令产生的自定义段
43、,包含2个字的初始化数据。.bss:为变量保留10个字的存储空间。newvars:由.usect伪指令产生的自定义段,为变量保留8个字的存储空间。本例的目标代码如图4-3所示。图4-3目标代码4.5链链接接器器链接器的功能如下:将各个段配置到目标系统的存储器中。对各个符号和段进行重新定位,并给它们指定一个最终的地址。解决输入文件之间未定义的外部引用问题。根据根据链链接命令或接命令或链链接命令文件接命令文件(.cmd.cmd文件),将一个或多个文件),将一个或多个COFFCOFF目目标标文件文件链链接起来,生成存接起来,生成存储储器映器映象文件(象文件(.map.map)和可)和可执执行的行的输
44、输出文出文件(件(.out.out)()(COFFCOFF目目标标模模块块)链接器的主要功能就是对程序定位,它采用的是一种相对的程序定位方式。程序的定位方式有三种:编译时定位(MCU采用,用ORG语句确定代码块和数据块的绝对地址);链接时定位(DSP采用,按.cmd文件中的段命令进行实际的定位);加载时定位(PC机采用,由操作系统对程序进行定位)。运行链接程序运行链接程序 (1 1)键入命令)键入命令 lnk500 lnk500(2 2)键入命令)键入命令lnk500 file1.obj file2.obj olnk500 file1.obj file2.obj o(3 3)键键入命令入命令
45、lnk500 lnk500 链链接器接器是是名名为为lnk500.exe lnk500.exe 的可执行程序的可执行程序应包含如下内容:应包含如下内容:-o-o 建立一个名为(默认情建立一个名为(默认情况)的可重新定位的输况)的可重新定位的输出模块。出模块。4.5.1链接器对段的处理链接器对段的处理具有两个功能。其一,将输入段组合生成输出段,即将多个.obj文件中的同名段合并成一个输出段;也可将不同名的段合并产生一个输出段。其二,将输出段定位到实际的存储空间中。链接器提供MEMORY和SECTIONS两个命令来完成上述功能。MEMORY命令用于描述系统实际的硬件资源;SECTIONS命令用于描
46、述段如何定位到恰当的硬件资源上。链接器通过命令文件(.cmd)来获得上述信息。链接器将输入段组合成一个可执行的目标模块链接器将输入段组合成一个可执行的目标模块4.5.2链接器命令文件链接命令文件含有链接时所需要的信息。命令文件.cmd由三部分组成:输入/输出定义、MEMORY命令和SECTIONS命令。输入/输出定义这部分包括输入文件名(目标文件.obj、库文件.lib和交叉索引文件.map)、输出文件.out和链接器选项。MEMORYMEMORY命命令令用用来来定定义义目目标标系系统统中中所所包包含含的的各各种种形形式式的的存存储储器器的的存存储储器器配配置置图图,包包括括对对存存储储器器各
47、各部部分分命命名名,以以及及规规定定它它们的起始地址和长度。们的起始地址和长度。(1 1)MEMORYMEMORY命令命令 功功能能MEMORYMEMORY PAGE 0:name 1 PAGE 0:name 1(attrattr):origin=constant,length=constant:origin=constant,length=constantPAGE n:name n PAGE n:name n(attrattr):origin=constant,length=constant:origin=constant,length=constant MEMORYMEMORY命令的一般句
48、法命令的一般句法对对一一个个存存储储空空间间加加以以标标记记,每每一一个个PAGEPAGE代代表表一一个个完完全全独独立立的的地地址址空空间间。页页号号n n最最多多可可规规定定为为255255,取取决决于于目目标标存存储储器器的的配配置置。通通常常PAGE PAGE 0 0定定为为程程序序存存储储器器,PAGE PAGE 1 1定定为为数数据据存存储储器器。如如果果没没有有规规定定PAGEPAGE,则链接器就目标存储器配置在,则链接器就目标存储器配置在PAGE 0PAGE 0。MEMORYMEMORY PAGE 0:name 1 PAGE 0:name 1(attrattr):origin=
49、constant,length=constant:origin=constant,length=constantPAGE n:name n PAGE n:name n(attrattr):origin=constant,length=constant:origin=constant,length=constant MEMORYMEMORY命令的一般句法命令的一般句法名名字字可可以以包包含含8 8个个字字符符,A AZ Z、a az z、$、.、_ _均均可可。名名字字并并没没有有特特殊殊的的含含义义,用用来来标标记记存存储储器器的的区区间间而而已已;名名字字都都是是内内部部记记号号,不不需需要
50、要保保留留在在输输出出文文件件或或者者符符号号表表中中。不不同同PAGEPAGE上上的的存存储储器器区区间间可可以以取取相相同同的的名名字字,但但在在同同一一PAGEPAGE内内的的名名字字不不能能相相同同,且且不不许许重叠配置。重叠配置。MEMORYMEMORY PAGE 0:name 1 PAGE 0:name 1(attrattr):origin=constant,length=constant:origin=constant,length=constantPAGE n:name n PAGE n:name n(attrattr):origin=constant,length=const