gcc內(nèi)嵌匯編46667

gcc內(nèi)嵌匯編46667

ID:19516333

大?。?4.00 KB

頁數(shù):16頁

時間:2018-10-03

gcc內(nèi)嵌匯編46667_第1頁
gcc內(nèi)嵌匯編46667_第2頁
gcc內(nèi)嵌匯編46667_第3頁
gcc內(nèi)嵌匯編46667_第4頁
gcc內(nèi)嵌匯編46667_第5頁
資源描述:

《gcc內(nèi)嵌匯編46667》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。

1、GCC內(nèi)嵌匯編46667GCC內(nèi)嵌匯編.txt24生活如海,寬容作舟,泛舟于海,方知海之寬闊;生活如山,寬容為徑,循徑登山,方知山之高大;生活如歌,寬容是曲,和曲而歌,方知歌之動聽。內(nèi)核代碼絕大部分使用C語言編寫,只有一小部分使用匯編語言編寫,例如與特定體系結(jié)構(gòu)相關(guān)的代碼和對性能影響很大的代碼。GCC提供了內(nèi)嵌匯編的功能,可以在C代碼中直接內(nèi)嵌匯編語言語句,大大方便了程序設(shè)計(jì)。一、基本內(nèi)嵌匯編GCC提供了很好的內(nèi)嵌匯編支持,最基本的格式是:__asm____volatile__(匯編語句模板);1、__asm____asm__

2、是GCC關(guān)鍵字asm的宏定義:#define__asm__asm__asm__或asm用來聲明一個內(nèi)嵌匯編表達(dá)式,所以任何一個內(nèi)嵌匯編表達(dá)式都是以它開頭的,是必不可少的。2、匯編語句模板“匯編語句模板”是一組插入到C程序中的匯編指令(可以是單個指令,也可以是一組指令)。每條指令都應(yīng)該由雙引號括起,或者整組指令應(yīng)該由雙引號括起。每條指令還應(yīng)該用一個定界符結(jié)尾。有效的定界符為換行符()和分號(;)。后可以跟一個制表符(t)作為格式化符號,增加GCC在匯編文件中生成的指令的可讀性。上述原則可以歸結(jié)為:①任意兩個指令間要么被

3、分號(;)分開,要么被放在兩行;②放在兩行的方法既可以通過的方法來實(shí)現(xiàn),也可以真正的放在兩行;③可以使用一對或多對雙引號,每對雙引號里可以放任意多條指令,所有的指令都必須放到雙引號中。在基本內(nèi)嵌匯編中,“匯編語句模板”的書寫的格式和你直接在匯編文件中使用匯編語言編程沒有什么不同,你可以在其中定義標(biāo)號(Label),定義對齊(.alignn),定義段(.sectionname)。例如:__asm__(".align2t""movl%eax,%ebxt""test%ebx,%ecxt""jneerror

4、t""stit""error:popl%edit""subl%ecx,%ebx");建議大家都使用這種格式來寫內(nèi)嵌匯編代碼。3、__volatile____volatile__是GCC關(guān)鍵字volatile的宏定義:#define__volatile__volatile__volatile__或volatile是可選的。如果不想讓GCC的優(yōu)化改動你的內(nèi)嵌匯編代碼,你最好在前面都加上__volatile__。二、帶C語言表達(dá)式的內(nèi)嵌匯編在內(nèi)嵌匯編中,可以將C語言表達(dá)式指定為匯編指令的操作數(shù),而且不用去管如何將C語言表

5、達(dá)式的值讀入哪個寄存器,以及如何將計(jì)算結(jié)果寫回C變量,你只要告訴程序中C語言表達(dá)式與匯編指令操作數(shù)之間的對應(yīng)關(guān)系即可,GCC會自動插入代碼完成必要的操作。通常嵌入到C代碼中的匯編語句很難做到與其它部分沒有任何關(guān)系,因此更多時候需要用到擴(kuò)展的內(nèi)嵌匯編格式:__asm____volatile__(匯編語句模板:輸出部分:輸入部分:破壞描述部分);內(nèi)嵌匯編表達(dá)式包含4個部分,各部分由“:”分隔。這4個部分都不是必須的,任何一個部分都可以為空,其規(guī)則為:①如果“破壞描述部分”為空,則其前面的“:”必須省略。比如:__asm__("mo

6、v%%eax,%%ebx"::);。②如果“匯編語句模板”為空,則“輸出部分”,“輸入部分”以及“破壞描述部分”可以不為空,也可以為空。比如:__asm__("":::"memory");。③如果“輸出部分”,“輸入部分”以及“破壞描述部分”都為空,“輸出部分”和“輸入部分”之前的“:”既可以省略,也可以不省略。如果都省略,則此匯編退化為一個基本內(nèi)嵌匯編,否則,仍然是一個帶有C語言表達(dá)式的內(nèi)嵌匯編。④如果“輸入部分”和“破壞描述部分”為空,但“輸出部分”不為空,“輸入部分”前的“:”既可以省略,也可以不省略。⑤如果后面的部分不

7、為空,而前面的部分為空,則前面的“:”都必須保留,否則無法說明不為空的部分究竟是第幾部分。⑥如果“破壞描述部分”不為空,而“輸出部分”和“輸入部分”都為空,則“輸出部分”和“輸入部分”前的“:”都必須保留。從上面的規(guī)則可以看到另外一個事實(shí),區(qū)分一個內(nèi)嵌匯編是基本格式的還是擴(kuò)展格式的,其規(guī)則在于在“匯編語句模板”后面是否有“:”的存在,如果沒有則是基本格式的,否則,就是擴(kuò)展格式的。這兩種格式對寄存器語法的要求不同:基本格式要求寄存器前只能使用一個%,這一點(diǎn)和原生匯編相同;而擴(kuò)展格式則要求寄存器前必須使用兩個%%。比如:__asm

8、__("mov%%eax,%%ebx":)和__asm__("mov%eax,%ebx")都是正確的寫法,而__asm__("mov%eax,%ebx":)和__asm__("mov%%eax,%%ebx")都是錯誤的寫法。任何只帶一個“%”的標(biāo)識符都看成是操作數(shù),而不是寄存

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動畫的文件,查看預(yù)覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時聯(lián)系客服。
3. 下載前請仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡(luò)波動等原因無法下載或下載錯誤,付費(fèi)完成后未能成功下載的用戶請聯(lián)系客服處理。