欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    MS320C54x的软件开发.ppt

    • 资源ID:5440778       资源大小:427KB        全文页数:110页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    MS320C54x的软件开发.ppt

    第4章 TMS320C54x的软件开发,4.1 TMS320C54x软件开发过程 4.2 汇编语言程序的编写方法4.3 汇编伪指令和宏指令4.4 公共目标文件格式COFF4.5 汇编源程序的编辑、汇编和链接过4.6 汇编语言程序设计,4.1 TMS320C54x软件开发过程C编译器(C compiler)汇编源程序汇编器(assembler)COFF目标文件 源文件中包括汇编语言指令、汇编伪指令以及宏指令。链接器(linker)可执行的COFF目标模块 调整对符号的引用,并解决外部引用的问题。它也可以接收来自文档管理器中的目标文件,以及链接以前运行时所生成的输出模块。调试工具 C54x 通过软件仿真程序或硬件在线仿真器的调试,最后将程序加载到用户的应用系统。,图中非阴影部分为任选:归档器(archiver)将一组文件(源文件或目标文件)集中为一个文档文件库。助记符指令到代数式指令翻译器(mnemonic to algebraic translator utility)建库工具(library-build utility)用来建立用户自己用C语言编写的支持运行库函数。十六进制转换工具(hex conversion utility)绝对地址列表器(absolute lister)交叉引用列表器(cross-reference lister),4.2 汇编语言程序的编写方法,4.2.1 汇编语言源程序举例包含标号区、指令区、操作数区和注释区4部分(参看3.1)指令区可以写助记符指令、汇编伪指令或宏指令。助记符指令一般用大写;汇编伪指令和宏指令,以“.”号开始,且为小写。【例4.1】汇编语言程序编写方法举例,.title“example.asm”;用双引号括起的源程序名.mmregs;定义存储器映射寄存器的替代符号 STACK.usect“STACK”,10H;在数据存储器中留出16个单元作为;堆栈区,名为STACK.bss a,4.bss x,4;在数据存储器中空出4个存储单元存放;变量x1,x2,x3和x4.bss y,1.def start;在此模块中定义,可为别的模块引用.data;紧跟其后的是已初始化数据 table:.word 1,2,3,4;在程序存储器标号为table开始的8个单.word 8,6,4,2;元存放初始化数据,.text;紧跟其后的是汇编语言程序正文 start:STM#0,SWWSR;adds no wait statesSTM#STACK+10H,SP;set stack pointer STM#a,AR1;AR1 point to aRPT#7;move 8 valuesMVPD table,*AR1+;from program memory into;data memoryCALL SUM;call SUM subroutineend:B end,SUM:STM#a,AR3;The subroutine implementSTM#x,AR4;multiply accumulateRPTZ A,#3MAC*AR3+,*AR4+,ASTL A,yRET.end;结束汇编,汇编器将忽略;此后的任何源 语句,4.2.2 汇编语言常量 C54x汇编器支持7种类型的常量:二进制整数:最多由16个二进制数字组成,其后缀为B(或b).八进制整数:最多由6个八进制数字组成,其后缀为Q(或q)。十进制整数:由十进制数字串组成 范围从3276832767或065535 十六进制整数:最多由4个十六进制数字组成,包括09和字符AF及af;必须由十进制值09开始;其后缀为H(或h),也可以由前缀(0 x)标明。如:78h、0Fh、37Ach、0 x37AC,5.浮点数常量:由整数、小数点、小数部分和指数部分组成+(-)nnn.nnnE(e)+(-)nnn 整数 小数 指数 有效的浮点数常量:3.0、3.14、-0.314e13、+314.59e-26.字符常量:由单引号括住的一个或两个字符组成。它在机器内部由8位ASCII码来表示一个字符。有效的字符常量:a(内部表示为61h),为D(内部表示为2744h)7.汇编时常量:用.set伪指令给一个符号赋值。例如:shift.set 3;将常数值3赋给符号shift LD#shift,A;再将3赋给A累加器 汇编器在内部把常量作为32位量。常量不能进行符号扩展。,4.2.3 汇编源程序中的字符串 字符串(character strings)是包括在双引号内的一串字符。字符串的最大长度是变化的,由要求字符串的伪指令所规定。每个字符在内部用8位ASCII码表示。以下是字符串的例子:“sample program”定义了一个长度为14的字符串:sample progran;“PLAN“C”定义了一个长度为7的字符串:PLAN“C”。,4.2.4 汇编源程序中的符号 符号可用于标号、常量和替代其他字符。符号名最多可为32位字符数字串(AZ、az、09、_和$),第一位不能是数字,字符间不能有空格;符号对大小写敏感,如汇编器将ABC、Abc、abc认作不同的符号,用-c选项可以使汇编器不区分大小写;符号只有在汇编程序中定义后才有效,除非使用.global伪指令声明才是一个外部符号。DSP内部的寄存器名和$等都是汇编器已预先定义的全局符号。,4.2.5 汇编源程序中的表达式 表达式是由运算符隔开的常量、符号或常量和符号序列。表达式值的有效范围从3276832767。表达式运算符及优先级:表4-12.表达式溢出 当算术运算在汇编中被执行时,汇编器将检查溢出状态。但在作乘法时,不检查溢出状态。3.表达式的合法性 由于符号的属性不同(定义不同)使表达式存在合法性问题。符号的属性分为3种:外部的、可重定位的和绝对的。含有乘、除法的表达式中只能使用绝对符号。,4.3 汇编伪指令和宏指令4.3.1 汇编伪指令(又称为汇编命令)作用:给程序提供数据并且控制汇编过程。表示:指令区以“.”号开始且为小写的为汇编伪指令。指令数目:C54x汇编器共有64条汇编伪指令。汇编伪指令用以形成常数和变量,当用它控制汇编和链接过程时,可以不占存储空间。,汇编伪指令分成8类(根据功能):对各种段进行定义的伪指令;对常数(数据和存储器)进行初始化的伪指令;调整SPC(段寄存器)的指令;输出列表文件格式伪指令;引用其他文件的伪指令;控制条件汇编的伪指令;在汇编时定义符号的伪指令;执行其他功能的伪指令。,1.段定义伪指令(5条)作用:把汇编语言程序的各个部分划分在适当的段中。.bss 为未初始化的变量保留空间;.data 通常包含了初始化的数据;.sect 定义已初始化的带命名段,其后的数据存入该段;.text 该段包含了可执行的代码;.usect 在一个未初始化的有命名的段中为变量保留空间。段是通过叠加方式来建立的。例如在汇编器第一次遇到.data伪指令时,data指令后面的语句都被汇编在.data段中(直到汇编器遇到.text和.sect伪指令为止)。如果后来又在其他的段中遇到.data指令,其后的语句继续加到.data段中。这样虽然程序中是多个.data段分散在各处,但汇编器只创建一个.data段,它可以连续地被分配到内存中。,2.常数初始化伪指令(共有24条).int和.word 把一个或多个16位数存放到当前段的连续字中。.int为无符号整型量,.word为带符号整型量。.byte 把一个或多个8位的值放入当前段的连续字中。该指令类似于.word,不同之处在于.word中的每个值的宽度限制为16位。.float和.xfloat 计算以IEEE格式表示的单精度(32位)浮点数,并存放在当前段的连续字中,高位先存。.float能自动按域的边界排列,.xfloat不能。.long和.xlong 把32位数存放到当前段连续的两个字中,高位字先存。.long能自动按长字的边界排列,.xlong 却不能。.string和.pstring 把8位的字符从一个或多个字符串中传送到当前段中。,【例4.2】1000000aa.byte 0AAh,0BBh 000100bb 200020ccc.word 0CCCh 300030eee.xlong 0EEEEFFFh 0004efff 40006eeee.long 0EEEEFFFFh 0007ffff 50008dddd.int 0DDDDh 600093fff.xfloat 1.99999 1000a ffac 7000c 3fff.float 1.99999 1000d ffac 8000e 0068.string“help”1000f 0065 10010 006c 100110070,3.段程序计数器(SPC)定位指令.align 使SPC对准1字(16位)128字的边界,这保证了紧接着该指令的代码从一个整字或页的边界开始。如果SPC已经定位于选定的边界,它就不会增加了。.align伪指令的操作数必须等于20215之间的一个2的幂值(尽管超过27的值没有意义)。不同的操作数代表了不同的边界定位要求。操作数为1是让SPC对准字边界;操作数为2是让SPC对准长字(偶地址)边界;操作数为128是让SPC对准页边界;不带操作数时,其默认值为128,即对准页边界。,4.输出列表格式伪指令.title 为汇编器提供一个打印在每一页顶部的标题。.list/.nolist 打开/关闭列表文件。使用.nolist可禁止汇编器列出列表文件中选定的源语句,使用.list则允许列表。.mlist/.mnolist 源代码中包含着宏扩展和循环块的列表。这两条指令用来打开/关闭列表。使用.mlist把所有的宏扩展和循环块打印到列表中,用.mnolist则禁止列入列表。.sslist/.ssnolist 分别允许/禁止替换符号扩展到列表,在调试替换符号的扩展时很有用。.page 在输出列表中产生新的一页。.option 控制列表文件中的某些特性。,5.引用其他文件的伪指令.def 确认一个在当前模块中定义的且能被其他模块使用的符号,汇编器把这个符号存入符号表中。.ref 确认一个在当前模块中使用但在其他段中定义的符号。汇编器把这个符号标注成一个未定义的外部符号,且把它装入目标符号表中,以便链接器能还原它的定义。.global 表明一个外部符号,使其他模块在连接时可以使用。如果在当前段定义了该符号,那么该符号就可以被其他模块使用,与.def功能相同;如果在当前段没有定义该符号,则使用了其他模块定义的符号,与.ref功能相同。一个未定义的全局符号只有当它在程序中使用的时候,链接器才对其进行处理。,.copy/.include 伪指令告诉汇编器开始从其他文件中读源语句。当汇编读完以后,继续从当前文件中读源语句。从.copy文件中读的语句会打印在列表中,而从.include文件中读的语句不会打印在列表中。.mlib 向汇编器提供一个包含了宏定义的文档库的名称。当汇编器见到一个在当前库中没有定义的宏,就在.mlib确认的宏库中查找。,6.控制条件汇编的伪指令.if/.elseif/.else/.endif 这些指令告诉汇编器,根据表达式的值条件汇编一块代码。.if 表示一个条件块的开始,如果条件为真就汇编紧接着的代码;.elseif是表示如果.if的条件为假,而.elseif的条件为真,就汇编紧接着的代码;.endif结束该条件块。.loop/.break/.endloop 告诉汇编器按照表达式的值循环汇编一块代码。.loop标注一块循环代码的开始;.break告诉汇编器当表达式为假时,继续循环汇编,当表达式为真时,立刻转到.endloop后的代码去执行;.endloop标注一个可循环块的末尾。,7.在汇编时定义符号的伪指令作用:汇编时的定义符号指令是使有意义的符号名与常数值或字符串相等同。.asg 规定一个字符串与一个替代符号相等,并将其存放在替代符号表中。当汇编器遇到一个替代符号,就用对应的字符串来代替这个符号。替代符号可以重新定义。.eval 计算一个表达式的值并把结果传送到与一个替代符号等同的字符串中。该指令在处理计数器时非常有用。.label 定义一个专门的符号以表示当前段内装入时的地址,而不是运行时的地址。.set/.equ 把一个常数值等效成一个符号,存放在符号表中,且不能被清除。,8.其他方面的汇编伪指令.end 结束汇编。它是一个程序的最后一个源语句。.mmregs 定义存储器映射寄存器的替代符号。对于所有的存储器映射寄存器,使用该指令和执行一个.set是一样的。.algebraic 告诉编译器程序包含了算术汇编源代码。如果没有使用-mg编译器选项,该指令必须出现在文件的第一行。.netblock 使局部标号复位。局部标号是$n或name?形式的符号。当它们出现在标号域中时,就对它们进行定义。局部标号是可以用来作为jump指令操作数的临时标号。.netblock在局部标号使用后对其复位,从而限制它的范围。.version 决定指令所运行的处理器。每一种C54x芯片都有自己的值。,4.3.2 宏及宏的使用 作用:程序中的子程序往往要多次使用,此时,可将该子程序定义为一个宏。在程序反复执行该子程序时就调用这个宏,从而避免多次重复使用该子程序的源语句。宏语言的功能包括:定义自己的宏和重新定义已存在的宏;简化较长的或复杂的汇编代码;访问归档器创建的宏库;处理一个宏中的字符串;控制宏扩展列表。如果想多次调用一个宏,而每次使用的是不同的参数,可以在宏里指定参数。宏的使用可分为3个过程:定义宏、调用宏和展开宏。,1.定义宏:有两种方法(1)宏可以在源文件起始处或者在.include/.copy文件中定义。格式 宏名.macro参数1,参数n 汇编语句或宏指令.mexit.endm宏名定义的宏名如果与某条指令或已有的宏定义重名,就将代替它们;汇编语句每次调用宏时执行的汇编语言指令或汇编伪指令;宏指令用来控制展开宏;.mexit功能类似于goto.endm语句,该项为可选项;.endm结束宏定义;注释注释前加一感叹号“!”,表示该注释包括在宏定义中,而又不出现在 宏展开中;若注释前加星号或分号,表示让注释出现在宏展开中。,(2)在宏库中定义宏 宏库由归档器创建,是采用归档格式的文件集合。归档文件(宏库)里的每一个文件都包含着一个与文件名相对应的宏定义;宏名与文件名必须相同;宏库中的文件必须是未被汇编过的源文件,其扩展名是.asm。可以使用.mlib指令访问宏库。其语法为.mlib 宏库文件名,2.调用宏 在源程序中通过把宏名作为操作数来调用宏。其格式为 宏名 参数1,参数n3.展开宏 当源程序调用宏时,编译器会将宏展开。在展开期间,编译器把自变量传递给宏参数,用宏定义来代替宏调用语句并对源代码进行编译。在默认状态下,宏展开会在指令列表文件中列出,可以使用.mnolist指令关掉宏指令列表。,【例4.3】宏定义、宏调用和宏展开举例(部分程序)。DAT0.set 60h;把一个常数值等效成一个符号DAT1.set 61h;表示地址DAT2.set 62hDAT3.set 63h.textADD3.macro P1,P2,P3,ADDRP;宏定义:三数相加;ADDRP=P1+P2+P3LD P1,AADD P2,AADD P3,ASTL A,ADDRP.endm,ST#0034h,DAT0;参数赋值ST#0243h,DAT1ST#1230h,DAT2ADD3 DAT0,DAT1,DAT2,DAT3;宏调用:DAT3=;DAT0+DAT1+DAT2NOP.end,4.4 公共目标文件格式COFF COFF(Common Object File Format,COFF):汇编器和链接器所创建的目标文件。COFF的核心概念:使用代码块(段)和数据块(段)编程,而不是指令或数据简单的顺序编写。采用段形式的优缺点:更利于模块化编程,管理代码段和目标系统存储器更灵活 不必为程序代码或变量指定目标地址,这为程序编写和程序移植提供了极大的方便;能与系统存储单元充分配合;编译系统复杂;对编程人员要求高(系统存储器结构;存储器映射方式),4.4.1 COFF文件中的段 段(Sections)是COFF文件中最重要的概念。段就是在编写汇编语言源程序时,采用的代码块或数据块,它占据存储器的某个连续空间。在编写汇编语言源程序时,程序是按段组织的;每行汇编语句从属一个段,由伪指令标明该段的属性;一个目标文件中的每个段都是分开的和各不相同的。,所有的COFF目标文件都包含以下3种形式的段:.text段(此段通常包含可执行代码);.data段(此段通常包含初始化数据);.bss段(此段通常为未初始化变量保留存储空间)。此外,汇编器和链接器可以建立、命名和链接自定义段。自定义段是程序员自己定义的段;使用起来与.data、.text以及.bss段类似;它的好处是在目标文件中与.data、.text以及.bss分开汇编,链接时作为一个单独的部分分配到存储器。有2种形式:.sect 建立的自定义段是已初始化段;.usect 建立的自定义段是未初始化段。,汇编器根据伪指令用适当的段将各部分程序代码和数据连在一起,构成目标文件;链接器分配存储单元,即把各个段重新定位到目标存储器中。,图4.2 目标文件中的段与目标存储器之间的关系,4.4.2 汇编器对段的处理 汇编器对段的处理是通过段定义伪指令区分出各个段,且将段名相同的语句汇编在一起。汇编器有5个段定义伪指令支持该功能,这5个伪指令是:.bss,.usect,.text,.data,.sect 如果汇编语言程序中一个段伪指令都没有用,汇编器会把程序中的内容都汇编到.text段。汇编器对不同类型段的处理不同。,1.未初始化段 未初始化段(Uninitialized sections)由.bss和.usect伪指令建立。未初始化段就是在目标存储器中的保留空间,以供程序运行过程中的变量作为临时存储空间使用。在目标文件中,这些段中没有确切的内容,通常它们定位到RAM区。未初始化段分为默认的和命名的2种,其句法如下.bss符号,字数 符号.usect“段名”,字数每调用.bss伪指令一次,汇编器在相应段保留预留字数的空间;每调用.usect伪指令一次,汇编器在指定的命名段保留预留字数的空间。,2.初始化段 初始化段(Initialized sections)由.text、.data和.sect伪指令建立,包含可执行代码或初始化数据。这些段中的内容都在目标文件夹中,当加载程序时再放到存储器中。每个初始化段都是可以重新定位的,并且可以引用其他段中所定义的符号。链接器在连接时自动处理段间的相互引用。3种初始化伪指令的句法如下:.text 段起点.data 段起点.sect“段名”,段起点,二者的不同:当汇编器遇到.text或.data或.sect伪指令时,将停止对当前段的汇编(相当于一条结束当前段汇编的伪指令),然后将紧跟着的程序代码或数据汇编到指定的段中,直到再遇到另一条.text或.data或.sect伪指令为止。而当汇编器遇到.bss和.usect伪指令时,并不结束当前段的汇编,只是暂时从当前段脱离出来,并开始对新的段进行汇编。.bss和.usect伪指令可以出现在一个已初始化段的任何位置上,而不会对它的内容发生影响。,3.自定义段.usect和.sect可以创建自定义的段。自定义段是用户自己创建的,可以同默认的.test、.data、.bss段一样使用,但它们之间是单独汇编的。可为那些未初始化的、不在.bss段的变量保留空间。.usect创建同.bss段一样使用的自定义段,它在RAM中为变量保留空间。也可以汇编已初始化的、不在.data段中的数据,.sect创建像默认的.text和.data一样的段,可包含代码和数据,而且有可重定位的地址。,4.段程序计数器(SPC)汇编器为每个段都安排一个单独的段程序计数器(SPC)。SPC表示一个程序代码段或数据段内的当前地址。一开始,汇编器将每个SPC置0。当汇编器将程序代码段或数据加到一个段内时,相应的SPC就增加。如果继续对某个段汇编,则相应的SPC就在先前的数值上继续增加。链接器在链接时要对每个段进行重新定位。,【例4.4】段伪指令应用举例。1 0000.data;汇编至.data段2 0000 0011 coeff.word 011h,022h,033h 0001 0022 0002 00333 0000.bss buffer,10;在.bss段为buffer变量;保留10个字的空间4 0003 0123 ptr.word 0123h;继续汇编至.data段5 0000.text;汇编至.text 段6 0000 100f add:LD 0Fh,A7 0001 f010 aloop:SUB#1,A 0002 00018 0003 f842 BC aloop,AGEQ 0004 0001,9 0004.data10 0004 00aaivals.word 0AAh,0BBh,0CCh;继续汇编至.data段 0005 00bb 0006 00cc11 0000 var2.usect“newvars”,1;自定义数据段,保留8;个字的空间12 0001 inbuf.usect“newvars”,713 0005.text;继续汇编至.text 段14 0005 110a mpy:LD 0Ah,B15 0006 f166 mloop:MPY#0Ah,B 0007 000a16 0008 f868BC mloop,BNOV 0009 0006,17 0000.sect“vectors”;自定义数据段,包含;2个初始化字18 0000 0011.word 011h,033h19 0001 0033 field1 field2 field3 field4行号 SPC 代码 源程序,共建立了5个段。目标代码图,4.4.3 链接器对段的处理 链接器在处理段的时候,有如下2个主要任务:将由汇编器产生的COFF格式的一个或多个.obj文件链接成一个可执行的.out文件;重新定位,将输出的段分配到相应的存储器空间。链接器有2条命令支持上述任务:(1)MEMORY命令。定义目标系统的存储器配置图,包括对存储器各部分命名,以及规定它们的起始地址和长度;(2)SECTIONS命令。告诉链接器如何将输入段组合成输出段,以及将输出段放在存储器中的什么位置。,1.MEMORY命令 作用:定义系统中所包含的各种形式的存储器,以及它们占据的地址范围。句法:MEMORYPAGE0:name 1(attr):orign=constant,length=constant;PAGEl:name nattr:orign=constant,length=constant;PAGE对一个存储空间加以标记。PAGE 0程序存储器,PAGE l定为数据存储器。Name对一个存储区间取名。Origin存储区的起始地址。键入Origin、Org或O都可 Length规定存储区的长度。键入Length、Len或L都可以Attr这是一个任选项,为命名区规定14个属性。,【例4.5】MEMORY命令的使用。MEMORYPAGE 0:ROM:origin=0c00h,length=1000h;PAGE 1:SCRATCH:origin=60h,length=20h;ONCHIP:origin=80h,length=200h;上述MEMORY命令所定义的系统的存储器配置如下:PAGE 0为程序存储器,名ROM,起始地址0C00H,长度4K字。PAGE l为数据存储器,名SCRATCH,起始地址60H,长32字。PAGEl为数据存储器,名ONCHIP,起始地址80H,长度512字。,2.SECTIONS命令作用:说明如何将输入段组合成输出段;规定输出段在存储器中的存放位置;并允许重新命名输出段。句法:SECTIONSname:property,property,property,name:property,property,property,name:property,property,property,Name段名,每一个输出段的说明都从段名开始。Property性能参数,段名后面是一行说明段的内容和如何给 段分配存储单元的性能参数。,一个段主要的性能参数有:装入存储器分配(Load allocation)。定义段装入时的存储器地址,语法为 Load=allocation(这里allocation指地址)或allocation 或allocation(2)运行存储器分配(Run allocation)。定义段运行时的存储器地址,语法为 Run=allocation runallocation 链接器为每个输出段在目标存储器中分配两个地址:一个是加载的地址,另一个是执行程序的地址。通常,这两个地址是相同的。有时要先将程序加载到ROM,然后在RAM中以较快的速度运行,只要用SECTIONS命令让链接器对这个段定位两次就行了。如.fir:loadROM,run=RAM,【例4.6】SECTIONS命令的使用。file1.obj file2.objSECTIONS.text:load=ROM,run=800h.bss:load=RAM.vectors:load=FF80h.bss段结合file1.obj和file2.obj的.bss段且被装入RAM空间。.text段结合file1.obj和file2.obj的.text段,链接器将所有命名为.text 的段都结合进该段,在程序运行时该段必须重新定位在地址 0800h。.vectors段定位在地址FF80h。,3.MEMORY和SECTIONS命令的缺省算法 如果没有利用MEMORY和SECTIONS命令,链接器就按缺省算法来定位输出段:MEMORYPAGE 0:PROG:origin=0 x0080,length=0 xFF00PAGE 1:DATA:origin=0 x0080,length=0 xFF80SECTIONS.text:PAGE=0.data:PAGE=0.cinit:PAGE=0.bss:PAGE=1,4.5 汇编源程序的编辑、汇编和链接过程,4.5.1 编辑:利用诸如Word、Edit、记事本等文本编辑器,编写汇编语言源程序,后缀为.asm。4.5.2 汇编器 作用:汇编语言源文件(.asm)翻译成机器语言目标文件(.obj)。输入文件:汇编语言源文件,其省缺的文件扩展名是.asm。1.汇编器的功能(1)处理源语句,产生一个可重新定位的目标文件(.obj);(2)根据要求,产生源列表文件(.lst),并提供对该列表的控制;(3)根据要求,将交叉引用列表添加到源程序列表中;(4)将代码分段;设置一个段程序记数器(SPC);(5)定义和引用全局符号;,2.汇编器的调用命令格式如下 asm500input fileobject filelisting file-options其中:input file汇编源文件名,缺省后缀为.asm;object file编译输出的目标文件名,缺省后缀为.obj;listing file产生的列表文件名,缺省后缀为.lst;options编译器使用的各种选项,每个选项前面加有短横。常用选项有:-c:编译器忽略字母的大小写。-1:(小写的L)在编译时产生列表文件,缺省后缀为.lst。-s:将所有的符号都放入符号表。-x:产生一个交叉汇编表,并把它附加到列表文件的最后。例如:asm500 example.asm-l-s-x,3.列表文件 列表文件包括源程序的行号、段程序计数器(SPC)、目标代码和源程序4个部分。【例4.7】列表文件举例(example.lst部分)10 0000040008.word8,6,4,2 0000050006 0000060004 0000070002 11 000000.text;code follows12 0000007728start:STM#0,SWWSR;adds no wait states 0000010000,4.5.3 链接器1.链接器的功能作用:将扩展名为.obj的一个或多个COFF目标文件链接起来,生 成可执行的输出文件(.out)和存储器映像文件(.map)。功能:(1)将各个段配置到目标系统的存储器中;(2)对各个符号和段进行重新定位,并给它们制定一个确定的地 址;(3)解决输入文件之间未定义的外部引用。,2.链接器的调用(2种方法)(1)在命令行中制定选项和文件名。命令格式如下 lnk500 filename1 filename n-optionsfilenames 为文件名,可是目标文件、链接命令文件或文件库。输入默认值为.obj,输出默认为.out。-options为可选项,常用的选项有:-e global_symbol:定义程序的进入点。global_symbol必须在源程 序中,用.global伪指令说明。-m filename:生成.map文件。-o filename:指定生成的.out文件名。系统缺省为a.out。例如,lnk500 file1.obj file2.obj-m prog.map-o prog.out,(2)链接命令文件(扩展名为.cmd)链接命令文件是将链接的信息放在一个文件中,这在多次使用同样的链接信息时,可以方便地调用。另外,在命令文件中可用两个十分有用的命令MEMORY和SECTIONS,指定实际应用中的存储器结构和进行地址的映射。而在命令行调用时不能使用这两个命令。命令文件为ASCII文件,可包含以下内容:输入文件名;链接器选项;MEMORY和SECTIONS链接命令;赋值说明。,【例4.8】链接命令文件(file.cmd)的编写。file1.obj file2.obj-m prog.map-o prog.out MEMORY PAGE 0:EPROM:org=0E00h,len=100h PAGE 1:SPRAM:org=0060h,len=0020h DARAM:org=0080h,len=100hSECTIONS.text:EPROMPAGE 0.data:EPROMPAGE 0.bss:SPRAMPAGE 1 STACK:DARAMPAGE 1,3.多个文件的链接(重点,分为以下5步进行)(1)编写复位向量文件vectors.asm。【例4.9】复位向量vectors.asm。*Reset vectors for example.asm*.title“vectors.asm”.ref start.sect“.vectors”rst:B start.end vectors.asm文件中引用了example.asm中的标号“start”,这是在两个文件之间通过.ref和.def伪指令实现的。,(2)编写example.asm,.def start是用来定义语句标号start的汇编伪指令,start是源程序.text段开头的标号,供其他文件引用。(3)分别对两个源文件进行汇编,example.asm和vectors.asm example.obj和vectors.obj.(4)编写链接命令文件example.cmd。链接example.obj和vectors.obj 输出文件example.out,映像文件example.map假设目标存储器的配置如下:程序存储器 EPROM E000hFFFFh(片内)数据存储器 SPRAM 0060h007Fh(片内)DARAM 0080h017Fh(片内),【例4.10】链接命令文件example.cmd.vectors.obj example.obj-o example.out-m example.map-e startMEMORYPAGE0:EPROM:org=0E000h,len=2000h VECS:org=0FF80h,len=04hPAGE1:SPRAM org=0060h,len=20h DARAM org=0080h,len=100hSECTIONS.text:EPROM PAGE 0.data:EPROM PAGE 0.bss:SPRAM PAGE 1 STACK:DARAM PAGE 1.vectors:VECS PAGE 0,(5)链接。生成输出文件example.out和映像文件example.map。将example.out装入目标系统就可运行了。系统复位后,PC首先指向0FF80h,这是复位向量地址。在这个地址上,有一条B start指令,程序马上跳转到start语句标号,从程序起始地址0e000h开始执行主程序。以上所述5步是一个常用的简单引导文件范例。,4.6 汇编语言程序设计 基本程序设计分为3大类:(1)程序的控制与转移。(2)数据块传送程序。(3)算术运算类程序。,4.6.1 程序的控制与转移包括:分支转移 子程序操作(调用与返回程序)循环控制(重复操作)这些指令都将影响程序计数器(PC),会造成把一个不是顺序增加的地址加载到PC。表43条件:有一些指令只有当一个条件或多个条件得到满足时才能执行。如条件分支转移或条件调用、条件返回指令。表4-4。多重条件:BC pmad,cond,cond,cond,当这条指令的所有条件得到满足时,程序才能转移到pmad。不是所有条件都能构成多重条件,某些条件的组合如表4-5所示。,1.分支程序 根据条件判断改写PC值,使程序发生分支转移。两种形式:有条件分支转移和无条件转移。常用指令:BD、BACCD;BCD、BANZD 合理地设计延迟转移指令,可以提高程序的效率。应当注意,紧跟在延迟指令后面的两个字,不能是造成PC不连续的指令(如分支转移、调用、返回或软件中断指令)。,【例4.11】条件分支转移指令BC举例。BC new,AGT,AOV;若累加器A0且溢出,则转至new,否则往下执行 单条指令中的多个条件是“与”的关系。如果需要两个条件相“或”,只能写成两条指令。如上一条指令改为“若累加器A大于0或溢出,则转移至new”,可以写成如下两条指令BC new,AGTBC new,AOV,【例4.12】计算.bss x,5;为变量分配6个字的存储空间.bss y,1 STM#x,AR1;AR1指向x STM#4,AR2;设AR2初值为4 LD#0,Aloop:ADD*AR1+,A BANZ loop,*AR2-;当AR2不为0时转移,AR2-1AR2 STL A,y 本例中用AR2作为循环计数器,设初值为4,共执行5次加法。也就是说,应当用迭代次数减1后加载循环计数器。,2.调用与返回程序 当调用子程序或函数时,DSP就会中断原先的程序,转移到程序存储器的其他地址继续运行。调用时,下条指令的地址被压入堆栈,以便返回时将这个地址弹出至PC,使中断的程序继续执行。两种形式:无条件调用与返回,有条件调用与返回。常用指令:CALLD、CALAD、RETD、CCD、RCD例如(堆栈设置后)CALL pmad;(SP)-1SP,(PC)+2TOS,pmadPC RET;(TOS)PC,(SP)+1SP,堆栈:16位堆栈指针(SP)寻址的软件堆栈。堆栈是一个特殊的存储区域,遵循先进后出的原则,当向堆栈中压入数据时,堆栈从高地址向低地址增长,堆栈指针SP始终指向栈顶。堆栈用法:压入操作:SP先减1,然后再将数据压入栈顶。弹出操作:数据弹出后,再将SP加1。堆栈设置:size.set100stack.usect“STK”,size;自定义一个名为STK的保留空间,共100个单元 STM#stack+size,SP;将这个保留空间的高地址(#stack+size)赋给SP,作为栈底,,3.重复操作(3条指令)RPT(重复下条指令)、RPTZ(累加器清0并重复下条指令)RPTB(块重复指令)。(1)重复执行单条指令含义:RPT或RPTZ允许重复执行紧随其后的那一条指令。重复

    注意事项

    本文(MS320C54x的软件开发.ppt)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开