天天看点

汇编程序指令(Assembler Directive)

.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。