匯編程序指令(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