《数字信号处理课件:第4章 TMS320C55x汇编语言》由会员分享,可在线阅读,更多相关《数字信号处理课件:第4章 TMS320C55x汇编语言(24页珍藏版)》请在金锄头文库上搜索。
1、图图4-1 非集成开发非集成开发环境下环境下C55x软件软件开发的流程图开发的流程图 l通用目标文件格式通用目标文件格式 - COFF,common object file formatl段(段(section)是)是COFF文件的基本单元。一个段是一个占文件的基本单元。一个段是一个占据存储器里连续地址的代码或者数据块,据存储器里连续地址的代码或者数据块,COFF目标文件目标文件的每个段都是分开和不同的的每个段都是分开和不同的lCOFF目标文件通常包括目标文件通常包括3个默认段,即个默认段,即.text段,通常包含可执行代码段,通常包含可执行代码.data段,通常包含初始化数据段,通常包含初始
2、化数据.bss段,通常为未初始化变量保留存储空间段,通常为未初始化变量保留存储空间COFF文件的基本单元文件的基本单元段段l汇编器通过段伪指令自动识别各个段,并将段名相同汇编器通过段伪指令自动识别各个段,并将段名相同的语句汇编在一起的语句汇编在一起l汇编器有汇编器有5条伪指令可以识别汇编语言程序的各个不同条伪指令可以识别汇编语言程序的各个不同段段u.text、.data、.sect创建初始化段创建初始化段u.bss和和.usect创建未初始化段创建未初始化段u.sect与与.usect创建自定义段和子段创建自定义段和子段1.未初始化段未初始化段l未初始化段占用处理器存储空间,常常分配到未初始化
3、段占用处理器存储空间,常常分配到RAMl未初始化段在目标文件里没有实际内容,仅仅用于保留存未初始化段在目标文件里没有实际内容,仅仅用于保留存储空间,当程序在运行时用这些空间来创建和存储变量储空间,当程序在运行时用这些空间来创建和存储变量l汇编命令汇编命令.bss和和.usect用来创建未初始化数据区域用来创建未初始化数据区域 .bss symbol,size,blocking flag,alignment flagsymbol .usect ”section name”,size,blocking flag,alignment flagsizesize:为对应段开辟的存:为对应段开辟的存储空间
4、大小,单位为字储空间大小,单位为字blocking flagblocking flag:可选参数。如果赋予:可选参数。如果赋予一个非零值给该参数,汇编器会连续分一个非零值给该参数,汇编器会连续分配字节空间,这些区域不会超出一页边配字节空间,这些区域不会超出一页边界,除非该段大于一页(在这种情况下,界,除非该段大于一页(在这种情况下,目标文件会在页边界开始)目标文件会在页边界开始)alignment flag: alignment flag: 可选参数。如果赋予可选参数。如果赋予一个非零值给该参数,该段会在一个长一个非零值给该参数,该段会在一个长字边界开始字边界开始symbolsymbol:指向
5、:指向. .bssbss或者或者. .usectusect指令创建的段的第一指令创建的段的第一个字,对应该存储空间的变个字,对应该存储空间的变量名。可被其他段引用,被量名。可被其他段引用,被声明为一个全局符号声明为一个全局符号section name:section name:段名段名l每次使用每次使用.bss指令,汇编器就在对应的段开指令,汇编器就在对应的段开辟更多的存储空间辟更多的存储空间l每次使用每次使用.usect指令,汇编器就在指定的自指令,汇编器就在指定的自定义段开辟更多的存储空间定义段开辟更多的存储空间l.bss和和.usect指令不结束当前段的汇编去开指令不结束当前段的汇编去开
6、始一个新的段,它们仅仅让汇编器暂时退出始一个新的段,它们仅仅让汇编器暂时退出当前段的编辑当前段的编辑l.bss和和.usect指令可以出现在一个初始化段指令可以出现在一个初始化段的任何地方而不会影响该段的内容的任何地方而不会影响该段的内容2.初始化段初始化段l初始化段包含可执行代码或者初始化数据;当程序被初始化段包含可执行代码或者初始化数据;当程序被装载时,它们就被放到处理器存储空间里装载时,它们就被放到处理器存储空间里l每个初始化段独立分配空间,可以引用在其他段定义每个初始化段独立分配空间,可以引用在其他段定义的标识(的标识(symbol),链接器自动处理这些段间引用),链接器自动处理这些段
7、间引用l定义初始化段的指令定义初始化段的指令:u.text valueu.data value u.sect ”section name”,valuevaluevalue表示段指针表示段指针(SPC)(SPC)的的开始值,只可以指定一次,开始值,只可以指定一次,必须在段第一次出现时指必须在段第一次出现时指定。定。默认默认SPCSPC从从0 0开始。开始。当汇编器遇到其中一个指令就当汇编器遇到其中一个指令就停止当前段的汇编(就好像一停止当前段的汇编(就好像一个当前段结束命令),而将后个当前段结束命令),而将后面的代码汇编到另外指定的段,面的代码汇编到另外指定的段,直到遇到另一个直到遇到另一个.t
8、ext、.data或者或者.sect指令指令3.自定义段自定义段l.usect 创建像创建像.bss段那样的段,这些段为变量在段那样的段,这些段为变量在RAM开辟存储空间。开辟存储空间。l.sect创建像创建像.text和和.data段那样包含代码和数据的段,段那样包含代码和数据的段,可以创建可重分配地址的自定义段。可以创建可重分配地址的自定义段。l用户可以创建多达用户可以创建多达32767个自定义段,段名可以多至个自定义段,段名可以多至200个字符。个字符。l每次使用这两个指令可以用不同的每次使用这两个指令可以用不同的section name来创建来创建不同的段,如果用一个已经使用的不同的段
9、,如果用一个已经使用的section name,那么,那么汇编器将代码和数据都汇编到同一个段。汇编器将代码和数据都汇编到同一个段。4.子段子段l 子段是更大的段中的较小的段,链接器可以像段一样子段是更大的段中的较小的段,链接器可以像段一样操作它操作它l 子段让用户可以更好的控制存储器映射子段让用户可以更好的控制存储器映射l 可以使用可以使用.sect或者或者.usect指令来创建子段,格式为:指令来创建子段,格式为: section name:subsection namel 同一个段中的子段可以独自分配地址,也可以一起分同一个段中的子段可以独自分配地址,也可以一起分配存储空间配存储空间例,在
10、段例,在段.text中创建一个中创建一个_func子段如下:子段如下: .sect “text:_func” 用户可以为其单独分配地址,也可以和用户可以为其单独分配地址,也可以和.text段的段的其他部分一起分配地址其他部分一起分配地址5.段指针段指针l汇编器为每个段分配一个程序指针,这些程序指针称汇编器为每个段分配一个程序指针,这些程序指针称为段指针(为段指针(SPCs)l一个一个SPC指向一个段的当前地址指向一个段的当前地址u初始时,汇编器设置每个初始时,汇编器设置每个SPC为为0u当汇编器在段中填充代码和数据时,当汇编器在段中填充代码和数据时,SPC跟着增加跟着增加u如果重新开始汇编一个
11、段,汇编器会记得该段如果重新开始汇编一个段,汇编器会记得该段SPC的原来值,并继续增加的原来值,并继续增加SPC例例4-1,段伪指令的使用。,段伪指令的使用。 这是一个汇编语言程序经汇编后生成的这是一个汇编语言程序经汇编后生成的.lst文件,每文件,每行包含行包含4个区域:个区域:Field 1: 源代码行号源代码行号Field 2: 段指针段指针Field 3: 目标代码目标代码Field 4: 初始源代码初始源代码这个例子创建了这个例子创建了5个段:个段:.text段:包含段:包含17字节目标代码字节目标代码.data 段:包含段:包含7字的目标代码字的目标代码vectors段:段:.se
12、ct指令创建的自定指令创建的自定义段,包含两个字的初始化数据义段,包含两个字的初始化数据.bss段:在存储器占用段:在存储器占用10个字个字newvars段:段:.usect指令创建的指令创建的自定义段,在存储器中占用自定义段,在存储器中占用8个个字字图图4-3 4-3 例例4-14-1产生的目标代码产生的目标代码4.2.3 链接器对段的处理链接器对段的处理l链接器对段的处理:链接器对段的处理:u将一个或多个将一个或多个COFF目标文件(目标文件(.obj)中的各种段作为)中的各种段作为链接器的输入段,经链接后在一个可执行的链接器的输入段,经链接后在一个可执行的COFF模块模块(.out)中建
13、立各个输出段)中建立各个输出段u为各个输出段选定存储器地址为各个输出段选定存储器地址l链接器有链接器有2条伪指令支持上述任务(通常放在链接器命令条伪指令支持上述任务(通常放在链接器命令文件(文件(.cmd)中执行,是命令文件的主要内容)中执行,是命令文件的主要内容) :uMEMORYuSECTIONS 如果在链接时不使用如果在链接时不使用MEMORYMEMORY和和SECTIONSSECTIONS指令,则链接器使用目的指令,则链接器使用目的处理器的默认分配算法处理器的默认分配算法; ; 有时用户不想使用默认设置,有时用户不想使用默认设置,要自己进行存储器映射,就要使用要自己进行存储器映射,就要
14、使用MEMORYMEMORY和和SECTIONSSECTIONS等链接指令。等链接指令。图图4-4 两个文件的链接过程两个文件的链接过程lTMS320C55x链接器有两个功能强大的指令,即链接器有两个功能强大的指令,即MEMORY和和SECTIONS。lMEMORY指令允许用户定义一个目标系统的存指令允许用户定义一个目标系统的存储器映射,可以命名存储器的各个部分,并且指储器映射,可以命名存储器的各个部分,并且指定开始地址和大小。定开始地址和大小。lSECTIONS指令告诉链接器合成输入段为输出指令告诉链接器合成输入段为输出段,并且告诉链接器把这些输出段放在存储器的段,并且告诉链接器把这些输出段
15、放在存储器的某个位置。某个位置。l链接命令文件用来为链接器提供链接信息,可将链接链接命令文件用来为链接器提供链接信息,可将链接操作所需的信息放在一个文件中,这在多次使用同样操作所需的信息放在一个文件中,这在多次使用同样的链接信息时,可以方便地调用的链接信息时,可以方便地调用l在链接命令文件中,可使用在链接命令文件中,可使用MEMORY和和SECTIONS伪伪指令,为实际应用指定存储器结构和地址的映射指令,为实际应用指定存储器结构和地址的映射uMEMORY:用来指定目标存储器结构:用来指定目标存储器结构uSECTIONS:用来控制段的构成与地址分配:用来控制段的构成与地址分配 l链接命令文件为链
16、接命令文件为ASC文件,可包含以下内容:文件,可包含以下内容:u输入文件名,用来指定目标文件、存档库或其他命输入文件名,用来指定目标文件、存档库或其他命令文件令文件u链接器选项,它们在命令文件中的使用方法与在命链接器选项,它们在命令文件中的使用方法与在命令行中相同令行中相同u链接伪指令链接伪指令MEMORY和和SECTIONS,用来指定目,用来指定目标存储器结构和地址分配标存储器结构和地址分配u赋值说明,用于给全局符号定义和赋值赋值说明,用于给全局符号定义和赋值MEMORY指令指令MEMORY PAGE 0: name_1(attr):origin=constant,length=consta
17、nt; PAGE n: name_n(attr):origin=constant,length=constant;PAGE:u 用于识别一个存储空间,可以使用于识别一个存储空间,可以使用多达用多达255个页,具体决定于配置个页,具体决定于配置情况。情况。u 通常页通常页0对应程序存储空间,页对应程序存储空间,页1对应存储器空间。对应存储器空间。u每个页面表现为一个完全独立的每个页面表现为一个完全独立的地址空间。地址空间。u页页0上的已配置空间和页上的已配置空间和页1上的已上的已配置空间可以交叠。配置空间可以交叠。Name:u命名一个存储空间范围。命名一个存储空间范围。u名字可以是一到任意个字符
18、,合名字可以是一到任意个字符,合法字符包括大小写法字符包括大小写26个字母、个字母、$和和_。u存储空间名字仅对链接器有用,存储空间名字仅对链接器有用,在输出文件或者符号里不再保留。在输出文件或者符号里不再保留。u在不同页的存储空间范围可以有在不同页的存储空间范围可以有相同的名字,但在一页内不允许不相同的名字,但在一页内不允许不同空间段有相同名字和交叠。同空间段有相同名字和交叠。Attr:u 指定与命名的存储空间范围相指定与命名的存储空间范围相联系的联系的14个属性,使用时必须个属性,使用时必须放在小括号里。放在小括号里。u 属性限制输出段在存储空间的属性限制输出段在存储空间的分配。如果不使用
19、任何属性,可分配。如果不使用任何属性,可以把输出段分配到任何存储空间以把输出段分配到任何存储空间范围范围u合法的属性包括:合法的属性包括: R:表示该存储空间可:表示该存储空间可读读 W:表示该存储空间可:表示该存储空间可写写 X:表示该存储空间可:表示该存储空间可以包含可执行代码以包含可执行代码 I:表示该存储空间可以:表示该存储空间可以初始化初始化Origin:u 指定存储段的开始地址。指定存储段的开始地址。u 值为值为24位常数,可以是十进位常数,可以是十进制、八进制或十六进制,单位制、八进制或十六进制,单位为字节,也可以写为为字节,也可以写为org或者或者oLengthLength:u
20、 指定存储段的长度指定存储段的长度u 值为值为2424位常数,可以是十进位常数,可以是十进制、八进制或者十六进制,单制、八进制或者十六进制,单位为字节,也可以写位为字节,也可以写lenlen或者或者l lFillFill:u 指定存储段的填充字符,为可选参数。指定存储段的填充字符,为可选参数。u 值为值为2 2字节整型数,可以是十进制、八字节整型数,可以是十进制、八进制或十六进制。进制或十六进制。u 填充值用来填充没有分配程序段的存储填充值用来填充没有分配程序段的存储空间,也可以写为空间,也可以写为f f。SECTIONS指令指令SECTIONS name_1:property, proper
21、ty, property name_2:property, property, property name_3:property, property, property 以以name开始的一行定义了一个输出段。段名开始的一行定义了一个输出段。段名name后是属性列表,这些属性定义了段的内容后是属性列表,这些属性定义了段的内容和段如何分配到存储器。和段如何分配到存储器。 l 一个段可能的属性包括:一个段可能的属性包括:uLoad allocation 定义在存储器中段被装载的位置: load=allocation 或 allocation 或 allocationuRun allocation
22、定义在存储器中段运行的位置: run=allocation 或run allocationuInput sections 定义组成输出段的输入段: 句法为 input_sectionsuSection type定义特殊种类段的标志: 句法为 type=COPY 或 type=DSECT 或 type=NOLOADuFill value定义用来填充未初始化空间的值: 句法为fill=value或Name:=value链接器的使用。链接器的使用。a.obj b.obj /*输入文件 */-o prog.out /* 用-o参数指定输出文件名 */SECTIONS .text: load =ROM, run=800h .const: load=ROM .bss : load=RAM .vectors: load=FF80h .data: align = 16图图4-5 段在存储器里的分配段在存储器里的分配