编译、汇编与链接程序建立的目标文件采用共用目标文件格式(Common Obje ct File Format,COFF),便于模块化编程、管理代码段和存储器,即不必为程序代码或变量指定目标地址,这为程序编写、移植和升级提供了很大方便。
汇编器根据命令用适当的段将各部分程序代码和数据连在一起,构成目标文件。链接器分配存储单元,即把各个段重新定位到目标存储器中。
段(section,也称为块)是目标文件的最小单位,是在存储器中占据连续空间的代码和数据块,各段相互独立。
汇编器的COFF文件格式包括三个默认的段:
1).text段,即程序段,该段通常包含可执行代码即程序。
2).data段,即数据段,该段通常包含已初始化的数据。
3).bss段,即保留数据空间段,该段通常为未初始化的数据保留空间。
图4-5给出了一个包含.text、.data和.bss段的目标文件,也给出了目标文件中的段与目标存储器之间的关系。
图4-5 目标文件中的段与目标存储器之间的关系
汇编器和链接器允许用户建立和链接自定义段。所有段可以分为初始化段和未初始化段两类。初始化段包含程序代码和数据。未初始化段则为未初始化的数据保留存储空间。汇编命令.sect和.usect可以分别用来创建自定义的初始化段和未初始化段。
C编译器对C程序编译后也产生初始化段和未初始化段两类,具体的段名稍有不同,除了不使用.data段之外,还产生一些新的段。C24x的C编译器产生的两类基本段的链接分别见表4-5、表4-6。
表4-5 初始化段链接
表4-6 未初始化段链接
C24x编译器将存储器处理为程序存储器和数据存储器。程序存储器包含可执行代码、初始化数据和开关表。数据存储器则主要包含外部变量、静态变量和系统堆栈。链接器确定存储器地址映射。(www.xing528.com)
C编译器的任务是产生可重定位的代码,允许链接器将代码和数据定位到合适的存储空间。编译器对C语言编译后除了生成两个基本段,即.text、.bss外,还生成.cinit、.pin t、.const、.switch、.stack、.sysmem.段。这些段可分为初始化段和未初始化段。
初始化段包含可执行代码或常数表。C编译器产生的初始化段有.pint、.c onst、.text、.cinit、.switch。
1).text段,包含可执行代码和常量(constant)。
2).cinit段和.pint段,包含初始化变量和常量。
3).const段,包含串常量,全局变量、静态变量的声明和初始化。
4).switch段,包含switch语句表。
未初始化段用于保留存储器(通常为RAM)空间。C编译器产生的未初始化段有.bss、.stack和.sysmem段。
1).bss段,为全局和静态变量保留空间。
2).stack段,为C系统堆栈。用于保护函数的返回地址、分配局部变量、调用函数时传递参数。.stack不同于DSP汇编指令的硬件堆栈。DSP汇编程序中要将堆栈指针SP指向一块RAM,用于保存中断、调用时的返回地址。.stack定义的段大小(堆栈大小)可用链接器选项-stack size设定,链接器还产生一个全局符号_STACK_SIZE,并赋给它等于堆栈长度的值,以字为单位,默认值为1 KW。
3).sysmem段,为动态存储器分配保留空间,由malloc函数使用。
各种段在程序中的映射见表4-7。链接器从不同的模块取出段并将这些段用同一个名称联合起来产生输出段,全部的程序就是由这些输出段组成的。可以根据需要将这些输出段放置到地址空间的任何位置,以满足系统的要求。.text、.cinit和.switc h段通常链接到ROM或RAM中,且必须链接到程序存储器(Page 0)中。.const段可以链接到ROM或RAM中,但必须链接到数据存储空间(Page 1)中。.bss、.sta ck和.sysmem段必须链接到RAM中,且必须链接到数据存储器(Page 1)中。
表4-7 存储器映射表
(续)
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。