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