C语言生成的段和CMD文件

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C语言生成的段和CMD文件

通用目标文件格式COFF(Common Object File Format),是一种很流行的二进制可执行文件格式。二进制可执行文件包括库文件(以后缀.lib结尾)、目标文件(以后缀.obj结尾)、最终的可执行文件(以后缀.out结尾)等。

1. COFF格式

详细的COFF文件格式包括段头、可执行代码和初始化数据、可重定位信息、行号入口、符号表、字符串表等,这些属于编写操作系统和编译器人员关心的范畴。从应用的层面上讲,DSP的C语言程序员应掌握两点:通过伪指令定义段;并给段分配空间。至于二进制文件到底如何组织分配,则交由编译器完成。

把握COFF格式的概念,最关键的一点就是:二进制可执行文件是以段(section)的形式存储的。

使用段的好处是鼓励模块化编程,提供更强大而又灵活的方法来管理代码和目标系统的内存空间。这里模块化编程的意思是,程序员可以自由决定愿意把哪些代码归属到哪些段,然后加以不同的处理。

编译器处理段的过程为:每个源文件都编译成独立的目标文件(以后缀.obj 结尾),每个目标文件含有自己的段,连接器把这些目标文件中相同段名的部分连接在一起,生成最终的可执行文件(以后缀.out结尾)。

段分为两大类:已初始化的段和未初始化的段。

已初始化的段含有真实的指令和数据,存放在程序存储空间。程序存储空间在DSP片内的FLASH。调试代码时,则常常把代码在线下载到RAM中运行。

未初始化的段只是保留变量的地址空间,未初始化的段存放在数据存储空间中,数据存储空间多为RAM存储单元。在DSP上电调用_c_int0初始化库前,未初始化的段并没有真实的内容。

汇编语言中,通过六条伪指令来定义段,因此时常把伪指令和段混为一谈,比如伪指令“.bss”,也是段“.bss”。

(1)未初始化的段

1).bss:定义变量存放空间。

2).usect:用户可自行定义未初始化的段,提供给用户更多的灵活性。

(2)已初始化的段

1).text:包含可执行的汇编指令代码。.text是系统定义的默认段,如果不明确声明,代码就归属.text段。

2).data:一般包括常数数据。比如,用来对变量初始化的数据或一个正弦表格等。

3).sect:用户可自行定已初始化的段,提供给用户更多的灵活性。

4).asect:作用类似于.sect,但是多了绝对地址定位功能。由于地址定位功能常用功能更强大又灵活的命令文件来完成,这条指令在汇编编程中已经废弃不用。

2.C语言生成的段

先解释一下堆栈的概念,二者是不同的概念。

栈(stack)是由系统自动管理的一片内存,用来存放局部变量和函数压栈出栈的状态量。进入C语言函数时需要保存一些寄存器的状态,即压栈操作;退出函数时要还原那些寄存器,即出栈操作。

堆(heap)是当用户想要自己能独立灵活地控制一些内存时,可以用malloc()等函数开辟一些动态内存区,这些动态内存区称为堆。

C语言在运行时并不检查堆栈溢出与否。如果堆栈段定义在数据存储空间的最后区域,实际运行时即使堆栈发生溢出,也不会覆盖其他有用的数据,此时堆栈可用的最高限额是实际数据存储空间的最高地址。

C语言有7个定义好的段,没有了汇编语言中的.data段,以下分类叙述。

(1)已初始化的段

1).text:编译C语言中的语句时,生成的汇编指令代码存放于此。

2).cinit:存放用来对全局和静态变量初始化的常量

3).switch:存放switch语句产生的常数表格。

(2)未初始化的段

1).bss:存放全局和静态变量。

2).stack:存放C语言的栈。

3).sysmen:存放C语言的堆。

4).const:稍微有些复杂的段。简单而言,是用来存放一些特殊的常数和字符等。

#pragma是标准C中保留的预处理命令。程序员可以通过#pragma来定义自己的段,这是预处理命令#pragma的主要用法。

#pragma的语法是:

#pragma CODE_SECTION(symbol,”section name”);

#pragma DATA_SECTION(symbol,”section name”);

说明:

1)symbol是符号,可以是函数名也可以是全局变量名,section name是用户自己定义的段名。

2)CODE_SECTION用来定义代码段,DATA_SECTION用来定义数据段。

使用#pragma需要注意:

1)不能在函数体内声明#pragma.

2)必须在符号被定义和使用前使用#pragma。

如果没有用到某些段,比如很多人都没有用到.sysmen段,就可以不用在CMD文件中为其分配空间。当然保险起见,也可以不论用到与否,都全分配空间,没有用到段的空间大小当然是零。

在CMD文件中,page0代表程序空间,page1代表数据空间,下表列出这些段应该分配的存储空间。

3.连接命令文件(CMD文件)

连接命令文件(Linker Command Files),以后缀.cmd结尾,简称为CMD文件。

CMD文件的两大主要功能是指示存储空间和分配段到存储空间,以下分别叙述。

〈1〉通过MEMORY伪指令来指示存储空间

MEMORY伪指令语法如下:

MEMORY

{

PAGE 0:name 0[(attr)]:origin=constant,length=constant

PAGE 0:name n[(attr)]:origin=constant,length=constant }

相关文档
最新文档