.section 就是汇编程序指令的一种, GNU 汇编程序提供了很多这样的指令(directive),这种指令都是以句点“.”为开头,后跟指令名(小写字母),在此,我们只介绍在内核源代码中出现的几个指令。
语法: .ascii "string"...
.ascii 表示零个或多个(用逗号隔开)字符串,并把每个字符串(结尾不自动加“\0”字符)中的字符放在连续的地址单元。
还有一个与.ascii 类似的.asciz,z 代表“\0”,即每个字符串结尾自动加一个“\0”字符
语法: .fill repeat , size , value
其中, repeat, size 和 value 都是常量表达式。 .fill 的含义是反复拷贝 size 个字节,重复repeat 次。 repeat 可以大于或者等于 0。 size 也可以大于等于 0,但不能超过 8,如果超过 8,也只取 8。 size 个字节的内容将被填充为 value 的值,如果 size 的大小大于 value 的存储所需要的容量,则将高位用 0 来填充。例如, size 为 8,则最高 4 个字节内容为 0,最低 4 字节内容置为 value。
size 和 value 为可选项。如果第二个逗号和 value 值不存在,则假定 value 为 0。如果第一个逗号和 size 不存在,则假定 size 为 1。例如:.fill 30, 8 , 0 即表示反复 30 次,每次向 8 个字节中拷贝 0 值。
语法: .globl symbol
.globl 使得连接程序(ld)能够看到 symbol。如果你的局部程序中定义了 symbol,那么,与这个局部程序连接的其他局部程序也能存取 symbol,例如:
某个.S 文件的源程序中某一段为如下
而与该文件属于同一个文件夹的另一.S 文件的某一段代码为
可以看到在前一个文件中定义的 globl 变量 number 在后一个文件中可以被引用。
语法:.rept count
…….
.endr
把.rept 指令与.endr 指令之间的行重复 count 次,例如:
相当于:
在这里, .rept 指令比较容易和.fill 指令混淆,它们的区别是.rept 是将.rept 与.endr 之间的指令重复 3 次,而.fill 则是单纯的重复填充数据。
语法:.space size , fill
这个指令保留 size 个字节的空间,每个字节的值为 fill。 size 和 fill 都是常量表达式。
如果逗号和 fill 被省略,则假定 fill 为 0。例如:
语法: .byte expressions
预留 1 个字节,并将这个字节的内容赋值为 expression,如果是用逗号隔开的多个expression,则为预留多个这样的字节,并将它们的内容依次赋值。例如:
语法: .word expressions
预留 2 个字节,并将该 2 个字节的内容赋值为 expression,如果是用逗号隔开的多个expression,则为预留多个这样的 2 字节,并将它们的内容依次赋值。例如:
这与.word 类似,只是这里是给双字(4 个字节)赋值。例如:
设定常数,就好像 C 程序中的#define 的作用一样。例如:
这样在接下来的程序中就可以用诸如 movl $mark, eax 这样的指令来引用 mark。