汇编源程序的组织结构

来源:互联网 发布:淘宝付款系统异常 编辑:程序博客网 时间:2024/05/16 10:34
一般情况下,一个汇编源程序需要定义3个段:
.text
.data
.bss
这个源自UNIX的传统(和a.out的结构有关)。
不过在现在的LINUX里,这三个部分不叫“段”(segment),而叫作“区”(section)。

这可能和Linux使用ELF(Execution and Linking Format)有关吧:
一个ELF格式的可执行程序通常划分为如下几个部分:
.text、.data 和 .bss,其中
.text 是只读的代码区,
.data 是可读可写的数据区,
.bss 则是可读可写且没有初始化的数据区。

代码区和数据区在ELF中统称为section,根据实际需要你可以使用其它标准的section,也可以添加自定义section,但一个 ELF 可执行程序至少应该有一个.text 部分。

汇编(器)指示:
源程序里的这些以“.”英文句点开头的.text,.data,.bss等是用来向汇编程序传递信息的,叫做“汇编(器)指示”。
.text告诉汇编器,其后的内容属于代码区,只读属性。
.data告诉汇编器,其后的内容属于具有初值的数据区,可读可写。
.bss告诉汇编器,其后的内容属于不具有初值的数据区,可读可写。


当汇编器遇到一个新的声明某个区的汇编指示时,老的区就结束了,同时开始一个新的区。
.text,.data,.bss等汇编指示是可以多次反复出现的。

此外还有其他一些特定的区:
.rdata
存放只读数据(常量),英文叫做read-only data。

MIPS还有专门的缺省使用$gp寻址的区:
.sdata
具有初值的小数据区,可读可写。英文叫做small data。
.sbss
不具有初值的数据区,可读可写。英文叫做small common objects.
.lit8
存放64位浮点数(implicit-constant)。
.lit4
存放32位浮点数(implicit-constant)。

.sdata,.sbss,.lit8,.lit4都缺省使用$gp寻址。

相同类型的区最后都会被连接程序按类型合并到一起,在可执行文件里组成单一的.text区,.data区和.bss区。