汇编程序指令(Assembler Directive)


.section 就是汇编程序指令的一种, GNU 汇编程序提供了很多这样的指令(directive),这种指令都是以句点“.”为开头,后跟指令名(小写字母),在此,我们只介绍在内核源代码中出现的几个指令。

.ascii

语法: .ascii "string"...

.ascii 表示零个或多个(用逗号隔开)字符串,并把每个字符串(结尾不自动加“\0”字符)中的字符放在连续的地址单元。

还有一个与.ascii 类似的.asciz,z 代表“\0”,即每个字符串结尾自动加一个“\0”字符

.fill

语法: .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

语法: .globl symbol

.globl 使得连接程序(ld)能够看到 symbol。如果你的局部程序中定义了 symbol,那么,与这个局部程序连接的其他局部程序也能存取 symbol,例如:

某个.S 文件的源程序中某一段为如下

……………..
.data
.globl number
.set number 10
…………..

而与该文件属于同一个文件夹的另一.S 文件的某一段代码为

……………….
.text
movl $number %eax
………………..

可以看到在前一个文件中定义的 globl 变量 number 在后一个文件中可以被引用。

.rept .endr

语法:.rept count

…….

.endr

把.rept 指令与.endr 指令之间的行重复 count 次,例如:

.rept 3
.long 0
.endr

相当于:

.long 0
.long 0
.long 0

在这里, .rept 指令比较容易和.fill 指令混淆,它们的区别是.rept 是将.rept 与.endr 之间的指令重复 3 次,而.fill 则是单纯的重复填充数据。

.space

语法:.space size , fill

这个指令保留 size 个字节的空间,每个字节的值为 fill。 size 和 fill 都是常量表达式。

如果逗号和 fill 被省略,则假定 fill 为 0。例如:

Label: .space 10, 1

.byte

语法: .byte expressions

预留 1 个字节,并将这个字节的内容赋值为 expression,如果是用逗号隔开的多个expression,则为预留多个这样的字节,并将它们的内容依次赋值。例如:

Mark: .byte 100

.word

语法: .word expressions

预留 2 个字节,并将该 2 个字节的内容赋值为 expression,如果是用逗号隔开的多个expression,则为预留多个这样的 2 字节,并将它们的内容依次赋值。例如:

num: .word 0x100

.long

这与.word 类似,只是这里是给双字(4 个字节)赋值。例如:

number: .long 0x100

.set

设定常数,就好像 C 程序中的#define 的作用一样。例如:

.set mark, 0x10

这样在接下来的程序中就可以用诸如 movl $mark, eax 这样的指令来引用 mark。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM