天天看點

GCC 内嵌彙編之基本行内彙編

Linux 作業系統核心代碼絕大部分使用 C 語言編寫,隻有一小部分使用彙編語言編寫,例如與特定體系結構相關的代碼和對性能影響很大的代碼。 GCC 提供了内嵌彙編的功能,可以在 C 代碼中直接内嵌彙編語言語句,大大友善了程式設計。

基本行内彙編

基本行内彙編很容易了解,一般是按照下面的格式:

asm(“statements”);      

同時“asm”也可以由“__asm__”來代替,“asm”是“__asm__”的别名。在“asm”後面有時也會加上“__volatile__”表示編譯器不要優化代碼,後面的指令保留原樣,“volatile”是它的别名,再後面括号裡面的便是彙編指令。

例如:

__asm__ __volatile__("hlt");      

如果有很多行彙編,則每一行後要加上“\n\t”

asm( "pushl %eax\n\t"
"movl $0,%eax\n\t"
"popl %eax");      

實際上 gcc 在處理彙編時,是要把 asm(…)的内容“列印”到彙編檔案中,是以格式控

制字元是必要的。

再例如:

asm("movl %eax,%ebx");
asm("xorl %ebx,%edx");
asm("movl $0,_booga);      

在上面的例子中,由于我們在行内彙編中改變了 edx 和 ebx 的值,但是由于 gcc 的特殊

的處理方法,即先形成彙編檔案,再交給 GAS 去彙編,是以 GAS 并不知道我們已經改變了edx 和 ebx 的值,如果程式的上下文需要 edx 或 ebx 作暫存,這樣就會引起嚴重的後果。對于變量_booga 也存在一樣的問題。為了解決這個問題,就要用到擴充的行内彙編文法。

繼續閱讀