主要包括三个常用的段:
data 数据段 声明带有初始值的元素
bss 数据段 声明使用0或者null初始化的元素
text 代码段 包含的指令, 每个汇编程序都必须包含此段
使用.section 指令定义段, 如:
.section .data
.section .bss
.section .text
起始点:
gnu汇编器使用
_start
标签表示默认的起始点。
此外如果想要汇编内部的标签能够被外部程序访问,需要使用.globl 指令。如:
.globl _start
数据段( .data)
使用.data声明数据段, 这个段中声明的任何数据元素都保留在内存中并可以被汇编程序的指令读取。
此外还可以使用.rodata声明只读的数据段, 在声明一个数据元素时, 需要使用标号和指令。
标号:
用做引用数据元素所使用的标记,它和c语言的变量很相似。它对于处理器是没有意义的, 它只是用做汇编器试图访问内存位置时用做引用指针的一个位置。
指令:
指示汇编器为通过标号引用的数据元素保留特定数量的内存, 声明命令之后必须给出一个或多个默认值。
声明指令:
.ascii 文本字符串
.asciz 以空字符结尾的字符串
.byte 字节值
.double 双精度浮点值
.float 单精度浮点值
.int 32位整数
.long 32位整数, 和int相同
.octa 16字节整数
.quad 8字节整数
.short 16位整数
.single 单精度浮点数(和float相同)
例子:
output:
.ascii "hello world."
pi:
.float 2.14
声明可以在一行中定义多个值, 如:
ages:
.int 20, 10, 30, 40
bss段
和data段不同, 无需声明特定的数据类型, 只需声明为所需目的保留的原始内存部分即可。
GNU汇编器使用以下两个命令声明内存区域:
.comm 声明为未初始化的通用内存区域
.lcomm 声明为未初始化的本地内存区域