TMS320C55x汇编语言编程精简课件_第1页
TMS320C55x汇编语言编程精简课件_第2页
TMS320C55x汇编语言编程精简课件_第3页
TMS320C55x汇编语言编程精简课件_第4页
TMS320C55x汇编语言编程精简课件_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、TMS320C55x软件开发流程TMS320C55x目标文件格式TMS320C55x汇编器TMS320C55x汇编伪指令TMS320C55x汇编语言源文件的书写格式TMS320C55x链接器第4章 TMS320C55x汇编语言编程第1页,共59页。4.1 TMS320C55x软件开发流程软件开发流程软件开发工具第2页,共59页。编程语言汇编语言 编程过程复杂,但程序执行效率高C/C+语言 编程容易,但程序执行效率不如汇编语言软件开发环境集成开发环境CCS(Code Composer Studio)非集成开发环境4.1.1 软件开发流程第3页,共59页。图4-1 非集成开发环境下C55x软件开发

2、的流程图 第4页,共59页。用户采用C/C+语言或汇编语言编写源文件(.c或.asm),经C/C+编译器、汇编器生成COFF格式的目标文件(.obj),再用链接器进行链接,生成在C55x上可执行的目标代码(.out),然后利用调试工具(软件仿真器simulator或硬件仿真器emulator)对可执行的目标代码进行仿真和调试。当调试完成后,通过Hex代码转换工具,将调试后的可执行目标代码(.out)转换成EPROM编程器能接受的代码(.hex),并将该代码固化到EPROM中或加载到用户的应用系统中,以便DSP目标系统脱离计算机单独运行。 非集成开发环境下软件开发的流程图 第5页,共59页。4.

3、1.2 软件开发工具 代码生成工具源代码编辑器 采用汇编语言或C/C+语言编写的源程序均为文本文件,可以在任何一种文本编辑器中进行。如WORD、EDIT、TC、Windows操作系统自带的笔记本等C/C+编译器 用来将C/C+语言源程序(.C或.CPP)自动编译为C55x的汇编语言源程序(.asm)第6页,共59页。汇编器 用来将汇编语言源文件(.asm)汇编成机器语言COFF目标文件(.obj)链接器 将汇编生成的、可重新定位的COFF目标模块(.obj)组合成一个可执行的COFF目标模块(.out)文档管理器 允许用户将一组文件(源文件或目标文件)集中为一个文档文件库 第7页,共59页。建

4、库实用程序 用来建立用户自己使用的、并用C/C+语言编写的支持运行的库函数十六进制转换程序 可以很方便地将COFF目标文件(.out)转换成TI、Intel、Motorola等公司的目标文件格式(.hex)绝对制表程序 将链接后的目标文件作为输入,生成.abs输出文件 交叉引用制表程序 利用目标文件生成一个交叉引用清单,列出链接的源文件中的符号以及它们的定义和引用情况第8页,共59页。代码调试工具 软件仿真器(Simulator) 是一种模拟DSP芯片各种功能并在非实时条件下进行软件调试的调试工具,它不需目标硬件支持,只需在计算机上运行硬件仿真器(Emulator:XDS510、560) 可用

5、来进行系统级的集成调试,是进行DSP芯片软硬件开发的最佳工具第9页,共59页。4.2 TMS320C55x目标文件格式COFF文件的基本单元段汇编器对段的处理链接器对段的处理链接器对程序的重新定位COFF文件中的符号第10页,共59页。通用目标文件格式 COFF,common object file format段(section)是COFF文件的基本单元。一个段是一个占据存储器里连续地址的代码或者数据块,COFF目标文件的每个段都是分开和不同的COFF目标文件通常包括3个默认段,即.text段,通常包含可执行代码.data段,通常包含初始化数据.bss段,通常为未初始化变量保留存储空间4.2

6、.1 COFF文件的基本单元段第11页,共59页。一些汇编伪指令可将代码和数据的各个部分与相应的段相联系图4-2目标文件中的段与目标存储器的关系第12页,共59页。4.2.2 汇编器对段的处理汇编器通过段伪指令自动识别各个段,并将段名相同的语句汇编在一起汇编器有5条伪指令可以识别汇编语言程序的各个不同段.text、.data、.sect创建初始化段.bss和.usect创建未初始化段.sect与.usect创建自定义段和子段第13页,共59页。1.未初始化段未初始化段占用处理器存储空间,常常分配到RAM未初始化段在目标文件里没有实际内容,仅仅用于保留存储空间,当程序在运行时用这些空间来创建和存

7、储变量汇编命令.bss和.usect用来创建未初始化数据区域 .bss symbol,size,blocking flag,alignment flag .usect symbol”section name”,size,blocking flag,alignment flagsize:为对应段开辟的存储空间大小,单位为字blocking flag:可选参数。如果赋予一个非零值给该参数,汇编器会连续分配字节空间,这些区域不会超出一页边界,除非该段大于一页(在这种情况下,目标文件会在页边界开始)alignment flag: 可选参数。如果赋予一个非零值给该参数,该段会在一个长字边界开始symbo

8、l:指向.bss或者.usect指令创建的段的第一个字,对应该存储空间的变量名。可被其他段引用,被声明为一个全局符号section name:段名第14页,共59页。每次使用.bss指令,汇编器就在对应的段开辟更多的存储空间每次使用.usect指令,汇编器就在指定的自定义段开辟更多的存储空间.bss和.usect指令不结束当前段的汇编去开始一个新的段,它们仅仅让汇编器暂时退出当前段的编辑.bss和.usect指令可以出现在一个初始化段的任何地方而不会影响该段的内容第15页,共59页。2.初始化段初始化段包含可执行代码或者初始化数据;当程序被装载时,它们就被放到处理器存储空间里每个初始化段独立分

9、配空间,可以引用在其他段定义的标识(symbol),链接器自动处理这些段间引用定义初始化段的指令:.text value.data value .sect ”section name”,valuevalue表示段指针(SPC)的开始值,只可以指定一次,必须在段第一次出现时指定。默认SPC从0开始。第16页,共59页。3.自定义段.usect 创建像.bss段那样的段,这些段为变量在RAM开辟存储空间。.sect创建像.text和.data段那样包含代码和数据的段,可以创建可重分配地址的自定义段。用户可以创建多达32767个自定义段,段名可以多至200个字符。每次使用这两个指令可以用不同的sec

10、tion name来创建不同的段,如果用一个已经使用的section name,那么汇编器将代码和数据都汇编到同一个段。第17页,共59页。4.子段 子段是更大的段中的较小的段,链接器可以像段一样操作它 子段让用户可以更好的控制存储器映射 可以使用.sect或者.usect指令来创建子段,格式为: section name:subsection name 同一个段中的子段可以独自分配地址,也可以一起分配存储空间例,在段.text中创建一个_func子段如下: .sect “text:_func” 用户可以为其单独分配地址,也可以和.text段的其他部分一起分配地址第18页,共59页。5.段指针

11、汇编器为每个段分配一个程序指针,这些程序指针称为段指针(SPCs)一个SPC指向一个段的当前地址初始时,汇编器设置每个SPC为0当汇编器在段中填充代码和数据时,SPC跟着增加如果重新开始汇编一个段,汇编器会记得该段SPC的原来值,并继续增加SPC第19页,共59页。例4-1,段伪指令的使用。 这是一个汇编语言程序经汇编后生成的.lst文件,每行包含4个区域:Field 1: 源代码行号Field 2: 段指针Field 3: 目标代码Field 4: 初始源代码第20页,共59页。第21页,共59页。第22页,共59页。第23页,共59页。这个例子创建了5个段:.text段:包含17字节目标代

12、码.data 段:包含7字的目标代码vectors段:.sect指令创建的自定义段,包含两个字的初始化数据.bss段:在存储器占用10个字newvars段:.usect指令创建的自定义段,在存储器中占用8个字图4-3 例4-1产生的目标代码第24页,共59页。4.2.3 链接器对段的处理链接器对段的处理:将一个或多个COFF目标文件(.obj)中的各种段作为链接器的输入段,经链接后在一个可执行的COFF模块(.out)中建立各个输出段为各个输出段选定存储器地址链接器有2条伪指令支持上述任务(通常放在链接器命令文件(.cmd)中执行,是命令文件的主要内容) :MEMORYSECTIONS 如果在

13、链接时不使用MEMORY和SECTIONS指令,则链接器使用目的处理器的默认分配算法; 有时用户不想使用默认设置,要自己进行存储器映射,就要使用MEMORY和SECTIONS等链接指令。第25页,共59页。图4-4 两个文件的链接过程第26页,共59页。4.2.4 链接器对程序的重新定位1. 地址重新定位汇编器对每个段汇编时都是从0地址开始,所有需要重新定位的符号(标号)在段内都是相对于0地址的事实上所有段都不可能从存储器中0地址单元开始,因此链接器必须对各个段进行重新定位 重新定位的方法:将各个段配置到存储器中,使每个段都有一个合适的起始地址将符号变量调整到相对于新的段地址的位置 将引用调整

14、到重新定位后的符号,这些符号反映了调整后的新符号值 第27页,共59页。2.运行时间重新定位在实际运行中,有时需要将代码装入存储器的一个地方,而在另一个地方运行。如:一些关键的执行代码必须装在系统的ROM中,但运行时希望在较快的RAM中进行。利用SECTIONS伪指令选项可让链接器对其定位2次,方法如下:使用load关键字设置装入地址使用run关键字设置它的运行地址第28页,共59页。4.2.5 COFF文件中的符号COFF文件中有一个符号表,主要用来存储程序中有关符号的信息 链接器在执行程序定位时,要使用符号表提供的信息,而调试工具也要使用该表来提供符号调试 第29页,共59页。1. 外部符

15、号在一个模块中定义、而在另一个模块中引用的符号可以用伪指令.def、.ref或.global来定义或引用 .def :定义符号。用来定义在当前模块中定义、可在别的模块中引用的符号.ref :引用符号。在当前模块中引用在别的模块中定义的符号.global:定义全局符号。可以是上面的任何一种情况第30页,共59页。例4-3,外部符号的使用。.def x ; 定义内部符号x.ref y ; 引用外部符号,y在其它文件中已定义x: ADD #86,AC0,AC1 ; 定义x B y ; 引用y第31页,共59页。2. 符号表每当遇到一个外部符号,无论是定义的还是引用的,汇编器都将在符号表中产生一个条目

16、汇编器还产生一个指到每段的专门符号,链接器使用这些符号将其他引用符号重新定位 第32页,共59页。4.5 TMS320C55x汇编语言源文件的书写格式汇编语言源文件格式汇编语言中的常数与字符串汇编源程序中的符号汇编源程序中的表达式内建数学函数 TMS320C55x汇编语言源程序由源语句组成。这些语句可以包含汇编语言指令、汇编伪指令和注释。 程序的编写必须符合一定的格式,以便汇编器将源文件转换成机器语言的目标文件。第33页,共59页。4.5.1 汇编语言源文件格式汇编语言程序以.asm为扩展名一条语句占源程序的一行总长度可以是源文件编辑器格式允许的长度语句的执行部分必须限制在200个字符以内第3

17、4页,共59页。1. 源语句格式助记符指令源语句的每一行通常包含4个部分:标号区、助记符区、操作数区和注释区助记符指令语法格式: 标号 : 助记符 操作数 ; 注释例4-11,助记符指令源语句SYM1.set 2 ;SYM1 = 2Begin: MOV #SYM1,AR1;AR1=2.data.byte 016h; 初始化(016h)第35页,共59页。 语句的书写规则:所有语句必须以标号、空格、星号或分号(*或;)开始标号是可选项,若使用标号,则标号必须从第一列开始 所有包含有汇编伪指令的语句必须在一行完成指定各部分之间必须用空格分开,Tab字符与空格等效注释是可选项。如果注释在第一列开始时

18、,前面必须标上星号或分号,在其他列开始的注释前面必须以分号开头 如果源程序很长,需要书写若干行,可以在前一行用反斜杠字符()结束,余下部分接着在下一行继续书写第36页,共59页。2. 标号所有汇编指令和大多数汇编伪指令都可以选用标号,供本程序或其它程序调用标号必须从语句的第1列写起,其后的冒号“:”可任选 标号为任选项,若不使用标号,则语句的第一列必须是空格、星号或分号 标号是由字母、数字以及下划线和美元符号等组成,最多可达32个字符标号分大小写,且第一个字符不能是数字在使用标号时,标号的值是段程序计数器SPC的当前值第37页,共59页。3.助记符 助记符用来表示指令所完成的操作,可以是汇编语

19、言指令、汇编伪指令、宏指令。助记符指令:一般用大写,不能从第一列开始 汇编伪指令:用来为程序提供数据和控制汇编进程,以句号“.”开始,且用小写宏指令:用来定义一段程序,以便宏调用来调用这段程序,以句号“.”开始,且用小写 宏调用:用来调用由宏伪指令定义的程序段第38页,共59页。4.操作数 操作数是指令中参与操作的数值或汇编伪指令定义的内容,紧跟在助记符的后面,由一个或多个空格分开操作数之间必须用逗号“,”分隔 操作数可以是常数、符号或表达式 操作数中的常数、符号或表达式可用来作为地址、立即数或间接地址第39页,共59页。作为操作数的前缀有三种情况:使用“#”号作为前缀,汇编器将操作数作为立即

20、数处理使用“*”符号作为前缀,汇编器将操作数作为间接地址,即把操作数的内容作为地址使用“” 符号作为操作数的前缀。汇编器将操作数作为直接地址,即操作数由直接地址码赋值第40页,共59页。5.注释 用来说明指令功能,便于用户阅读。注释可位于句首或句尾,位于句首时,以“*”或“;”开始,位于句尾时,以分号“;”开始注释可单独一行或数行注释是任选项 第41页,共59页。4.6 TMS320C55x链接器 链接器的运行 链接器命令文件的编写与使用 MEMORY指令 SECTIONS指令第42页,共59页。4.6.1 概述TMS320C55x链接器有两个功能强大的指令,即MEMORY和SECTIONS。

21、MEMORY指令允许用户定义一个目标系统的存储器映射,可以命名存储器的各个部分,并且指定开始地址和大小。SECTIONS指令告诉链接器合成输入段为输出段,并且告诉链接器把这些输出段放在存储器的某个位置。第43页,共59页。4.6.2 链接器的运行键入命令:lnk55 键入命令: lnk55 a.obj b.obj -o link.out键入命令:lnk55 linker.cmd 1、C55x链接器的三种运行方法:链接器会提示如下信息: Command files:(要求键入一个或多个命令文件) Object files .obj:(要求键入一个或多个需要链接的目标文件) Output File

22、s a.out:(要求键入一个链接器所生成的输出文件名)Options:(要求附加一个链接选项)在命令行中指定选项和文件名:目标文件: a.obj、b.obj 命令选项: -o输出文件: link.outlinker.cmd: 链接命令文件。 在执行上述命令之前,需将链接的目标文件、链接命令选项以及存储器配置要求等编写到链接命令文件linker.cmd中第44页,共59页。例4-18,链接器命令文件举例。 将两个目标文件a.obj和b.obj进行链接,生成一个映像文件prog.map和一个可执行的输出文件prog.out。a.obj /* 第一个输入文件 */b.obj /*第二个输入文件*/

23、o prog.out /* 产生.out文件选项 */m prog.map /*产生.map文件选项 */第45页,共59页。2.链接命令选项 选 项含 义-a生成一个绝对地址的、可执行的输出模块。如果既不用-a选项,也不用-r选项,链接器就像规定-a选项那样处理。-ar生成一个可重新定位、可执行的目标模块。这里采用了-a和-r两个选项(可以分开写成-a -r,也可以连在一起 写作-ar),与-a选项相比,-ar选项还在输出文件中保留有重新定位信息。-c使用TMS320C55x C/C+编译器的ROM自动初始化模型所定义的链接约定-cr使用TMS320C55x C/C+编译器的RAM自动初始化

24、模型所定义的链接约定-e global_symbol定义一个全局符号,该符号指定输出模块的入口地址-f fill_vale对输出模块各段之间的空单元设置一个16位数值(fill_value),如果不用-f选项,则这些空单元都置0。 -h使所有全局符号均为静态的第46页,共59页。选 项含 义-help 或?显示链接器所有命令行选项列表heap size设置存储器heap块的大小(用于C/C+程序中动态存储器分配),缺省值为2000字节-i dir更改搜索文档库算法,先到dir(目录)中搜索。此选项必须出现在-l选项之前。 -l filename命名一个文档库文件作为链接器的输入文件;filen

25、ame为文档库的某个文件名。此选项必须出现在-i选项之后。 -m filename生成一个.map映像文件,filename是映像文件的文件名。.map文件中说明存储器配置、输入、输出段布局以及外部符号重定位之后的地址等。 -o filename 对可执行输出模块命名。如果默认,则此文件名为a.out。 -r生成一个可重新定位的输出模块。当利用-r选项且不用 -a选项时,链接器生成一个不可执行的文件。 stack size设置主堆栈大小,缺省值为1000字节sysstack size设置次级堆栈大小,缺省值为1000字节第47页,共59页。在链接时,连接器通过链接命令选项控制链接操作。链接命令

26、选项可以放在命令行或命令文件中,所有选项前面必须加一短划线“-”。除-l和-i选项外,其他选项的先后顺序并不重要。选项之间可以用空格分开。最常用选项为-m和-o,分别表示输出的地址分配表映像文件名和输出可执行文件名。第48页,共59页。4.6.3 链接器命令文件的编写与使用链接命令文件用来为链接器提供链接信息,可将链接操作所需的信息放在一个文件中,这在多次使用同样的链接信息时,可以方便地调用在链接命令文件中,可使用MEMORY和SECTIONS伪指令,为实际应用指定存储器结构和地址的映射MEMORY:用来指定目标存储器结构SECTIONS:用来控制段的构成与地址分配 第49页,共59页。链接命

27、令文件为ASC文件,可包含以下内容:输入文件名,用来指定目标文件、存档库或其他命令文件链接器选项,它们在命令文件中的使用方法与在命令行中相同链接伪指令MEMORY和SECTIONS,用来指定目标存储器结构和地址分配赋值说明,用于给全局符号定义和赋值第50页,共59页。4.6.4 MEMORY指令MEMORY PAGE 0: name_1(attr):origin=constant,length=constant; PAGE n: name_n(attr):origin=constant,length=constant;PAGE: 用于识别一个存储空间,可以使用多达255个页,具体决定于配置情况

28、。 通常页0对应程序存储空间,页1对应存储器空间。每个页面表现为一个完全独立的地址空间。页0上的已配置空间和页1上的已配置空间可以交叠。Name:命名一个存储空间范围。名字可以是一到任意个字符,合法字符包括大小写26个字母、$和_。存储空间名字仅对链接器有用,在输出文件或者符号里不再保留。在不同页的存储空间范围可以有相同的名字,但在一页内不允许不同空间段有相同名字和交叠。Attr: 指定与命名的存储空间范围相联系的14个属性,使用时必须放在小括号里。 属性限制输出段在存储空间的分配。如果不使用任何属性,可以把输出段分配到任何存储空间范围合法的属性包括: R:表示该存储空间可读 W:表示该存储空

29、间可写 X:表示该存储空间可以包含可执行代码 I:表示该存储空间可以初始化Origin: 指定存储段的开始地址。 值为24位常数,可以是十进制、八进制或十六进制,单位为字节,也可以写为org或者oLength: 指定存储段的长度 值为24位常数,可以是十进制、八进制或者十六进制,单位为字节,也可以写len或者l第51页,共59页。4.6.5 SECTIONS指令SECTIONS name_1:property, property, property name_2:property, property, property name_3:property, property, property 以

30、name开始的一行定义了一个输出段。段名name后是属性列表,这些属性定义了段的内容和段如何分配到存储器。 第52页,共59页。 一个段可能的属性包括:Load allocation 定义在存储器中段被装载的位置: load=allocation 或 allocation 或 allocationRun allocation 定义在存储器中段运行的位置: run=allocation 或run allocationInput sections 定义组成输出段的输入段: 句法为 input_sectionsSection type定义特殊种类段的标志: 句法为 type=COPY 或 type=DSECT 或 type=NOLOADFill value定义用来填充未初始化空间的值: 句法为fill=value或Name:=value第53页,共59页。例4-19,链接器的使用。a.obj b.obj /*输入文件 */-o prog.out /* 用-o参数指定输出文件名 */SECTIONS .text: load =ROM, run=800h .const: load=ROM .bss : load=RAM .vectors: load=FF80h .data: al

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论