天天看點

彙程式設計式指令(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。