section 伪操作

用户可以通过 .section伪操作 来自定义一个段,格式如下:

.section section_name [, "flags"[, %type[,flag_specific_arguments]]]

.section 标记一个段的开始
section_name 段名
flags 段的属性标志
type 段的类型
flag_specific_arguments 指定参数内容

每一个段以段名为开始, 以下一个段名或者文件结尾为结束。

section_name 段名

汇编系统预定义的段名如下:

段名 含义
.text @代码段
.data @初始化数据段.data Read-write initialized long data.
.bss @未初始化数据段
.sdata @ .sdata Read-write initialized short data.
.sbss @

注意:源程序中.bss段应该在.text段之前。

flags 段的属性标志

这些段都有缺省的标志(flags),连接器可以识别这些标志。(与arm asm中的AREA相同)。

下面是ELF格式允许的段标志flags:

<标志> 含义
a 允许段
w 可写段
x 执行段
M 可合并
S 包含零个终止的字符串
G 段组成员
T 用于线程本地存储

type 段的类型

<标志> 含义
%progbits 段内包含数据
%nobits 段中不包含数据(即该段只占用空间)
%note 段内包含程序以外使用的数据
%init_array 段包含一个指向init函数的指针数组。(初始化)
%fini_array 段包含一个指向finish函数的指针数组。(完成)
%preinit_array 段包含一个指向pre-init函数的指针数组。(与初始化)

举例:

例:定义一个“段”

.section .softoolcn    @自定义数据段,段名为 “.softoolcn”
.align  2
strtemp:
    @对这一句的理解,我觉得应该是:将"Temp string \n\0"这个字符串存储在以标号strtemp: 为起始地址的一段内存空间里
    .ascii  "Temp string \n\0"