公共目标文件格式-COFF WWW_P※LCJS_COM-PLC-)技.术_网
目的:增强代码得可读性和可移植性。 WWW_PLCJS@_COM%-PLC-技.术_网
块SECTION:目标文件中最小得单元就为块,它最终在存储器影响中占据连续空间得一块代码或数据。 WW.W_PLC※JS_C,OM-PL,C-技.术_网
默认的情况下,coff文件包含三个块: WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
.text:通常包含可执行代码 W1WW_P4LCJS_COM-PLC-技.术_网
.data:通常包含已初始化的数据 WWW_PLC※JS_COM-PmLC-技.术_网
.bss:通常为未初始化的数据保留空间 WWW_P※LCJS_COM-PLC-)技.术_网
当然汇编器和链接器允许自己建立和链接自定义的块,这些块与以上的三个块类似。所有的块分为两大类 WWW_P※LCJS_CO※M-PLC-技-.术_网
已初始化块和未初始化块。已初始化的块包含程序代码和数据,.text .data .sect .asect汇编命令所 W1WW_P4LCJS_COM-PLC-技.术_网
创建的块都属于这一类。未初始化的块是为了未初始化数据在存储器映像图中保留空间,.bss .usect属于这一类。 WWcW_PLCJS_COM-PLC-技.术_网
汇编器对块的处理:确定汇编语言程序的各个部分属于那个特定的块。有六个命令来完成这种功能,即:.bss, .usect(创建未初始化的块).text, .data, .sect, .asect(创建已初始化的块). WWW.PLCJS.COM——可编程控制器技术门户
1. 未初始化的块 WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
通常主要用来在存储器中保留空间,他们通常分配到RAM中。这些块在目标文件中没有实际的内容,只是保留空间而已。程序在运行时利用这些空间来建立和存储变量。 W1WW_P4LCJS_COM-PLC-技.术_网
.bss命令在.bss块中保留空间,.usect命令在自定义的块中保留空间。如 WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
.bss 符号,字数 ——可——编——程——控-制-器-技——术——门——户
符号 ,.usect “块名”,字数 WWcW_PLCJS_COM-PLC-技.术_网
其中,符号指向有.bss或.usect命令保留的第一个字,它对应于变量保留空间的变量名,可以在其它任何块中被访问,也可以用.global命令定义为全局符号。字数表示空间的大小。 P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
2. 已初始化的块 WWW_PL※CJS_COM-PLC-技.术_网
它包含可执行代码或者已初始化数据。.text, .data, .sect, .asect(创建已初始化的块).这四个命令的用法如下: ——可——编——程——控-制-器-技——术——门——户
.text WWW.PLCJS.COM——可编程控制器技术门户
.data WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
.sect “块名” W1WW_P4LCJS_COM-PLC-技.术_网
.asect “块名”,地址 WWcW_PLCJS_COM-PLC-技.术_网
前两个建立的块名就是.text 和.data 而后边两个命令建立的块名是自定义的块,其中.asect具有绝对地址,不推荐使用。 WW.W_PLC※JS_C,OM-PL,C-技.术_网
3.两种命令的比较 WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
汇编器遇到.bss, .usect时,并不结束当前块开始一个新块,它们只是暂时的离开当前块。 WWW_P※LCJS_COM-PLC-)技.术_网
汇编器遇到.text .data .sect .asect时,它立即停止把数据或者代码汇编到当前块中,且开始将随后的代码或者数据汇编到相应的块中,直到别的.text .data .sect .asect中的一个。比如:当汇编器第一次遇到一个.data命令时,.data块时空的,.data后的语句被汇编到.data块中,直到遇到一个.text .sect .asect。如果汇编器在后边又遇到了.data命令,则将这些.data后边的语句加到已在.data块中语句的后边,这样建立的唯一的.data块可以在存储器中分配一个连续的空间。 P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
4.自定义的块 WWcW_PLCJS_COM-PLC-技.术_网
用命令.usect建立的块的用法类似于.bss块,它在RAM中为变量保留空间; WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
.sect .asect建立包含代码或者数据的块,用法类似于.text和.data块。.sect建立的块是可以重定位的,而.asect命令建立具有绝对地址的块. P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
符号 ,.usect “块名”,字数 P.L.C.技.术.网——可编程控制器技术门户
.sect “块名” WWW.PLCJS.COM——可编程控制器技术门户
.asect “块名”,地址 WW.W_PLCJS_COM-PLC-技.术_网
链接器对块的处理 WWW_PLCJS@_COM%-PLC-技.术_网
作用:将COFF目标文件中的块用来建立程序块或者数据块,它将输入块组合起来,以建立可执行的的COFF输出模块。其次,链接器为输出块选择存储器地址。它用两个命令完成上述功能:MEMORY, SECTONS。 MEMORY命令定义目标系统的存储器,程序员可以定义每一块存储器,指定起始地址和长度。SECTIONS命令告诉链接器如何组合输入块以及在存储器何处存放输出块。若不用这两个命令,则链接器使用默认的分配算法。若使用这两个命令,则在.cmd中确定。 WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
1. 链接器的默认分配算法 P.L.C.技.术.网——可编程控制器技术门户
(1)假设存储器的起始地址为0 WWW.PLCJS.COM——可编程控制器技术门户
(2)假定有2的32次方字的存储器可以用来分配目标代码 WWW_PLC※JS_COM-PmLC-技.术_网
(3)将.text分配到起始地址为0的程序存储器中 WW.W_PLCJS_COM-PLC-技.术_网
(4)将.data分配到紧接着.text的程序存储器中 WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
(5)将.bss分配到紧接着.data的数据存储器中。 ——可——编——程——控-制-器-技——术——门——户
(6)将自定义的块分配到紧接着.bss的存储器中,若自定义的块不止一个,则按照自定义块字输入文件中的先后顺序存放。 W1WW_P4LCJS_COM-PLC-技.术_网
如果,在默认分配时有多个目标文件,每个文件中都包含.text .data ,.bss和自定义的块,则链接器中首先将各个文件中具有相同名字的块组合起来,形成相应的输出块,然后再接上述算法分配存储器。 WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
2. 在存储器映像图中分配块:使用MEMORY SECTIONS定义存储器以及分配块至存储器中 WW.W_PLCJS_COM-PLC-技.术_网
MEMORY ——可——编——程——控-制-器-技——术——门——户
{ WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
PAGE 0: PROG: origin = 1a00h, length = 2580h WWW_PLCJS@_COM%-PLC-技.术_网
PAGE 1: DATA: origin = 0200h, length = 1800h WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
} WWW_PLCJS_COM-PLC-技.术_网
SECTIONS WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
{ WWW_P※LCJS_CO※M-PLC-技-.术_网
.text > PROG PAGE 0 W1WW_P4LCJS_COM-PLC-技.术_网
.cinit > PROG PAGE 0 WWW_PLC※JS_COM-PmLC-技.术_网
.switch > PROG PAGE 0 W1WW_P4LCJS_COM-PLC-技.术_网
.vect > 3f80h PAGE 0 plcjs.技.术_网
WWW_PLC※JS_COM-PmLC-技.术_网
.data > DATA PAGE 1 WWW_PLC※JS_COM-PmLC-技.术_网
.bss > DATA PAGE 1 WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
.const > DATA PAGE 1 WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
.sysmem > DATA PAGE 1 WWW_PLCJS_COM-PLC-技.术_网
.stack > DATA PAGE 1 WWW_P※LCJS_COM-PLC-)技.术_网