版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、GCC 內嵌匯編.txt24 生活如海,寬容作舟,泛舟于海,方知海之寬闊;生活如山,寬容為徑,循徑登山,方知山之高大;生活如歌,寬容是曲,和曲而歌,方知歌之動聽。 內核代碼絕大部分使用 C 語言編寫,只有一小部分使用匯編語言編寫,例如與特定體系結構相關的代碼和對性能影響很大的代碼。GCC 提供了內嵌匯編的功能,可以在 C 代碼中直接內嵌匯編語言語句,大大方便了程序設計。一、基本內嵌匯編GCC 提供了很好的內嵌匯編支持,最基本的格式是:
2、__asm__ __volatile__(匯編語句模板);1、__asm____asm__是 GCC 關鍵字 asm 的宏定義:#define __asm__ asm__asm__或 asm 用來聲明一個內嵌匯編表達式,所以任何一個內嵌匯編表達式都是以它開頭的,是必不可少的。2、匯編語句模板“匯編語句模板”是一組插入到 C 程序中的匯編指令(可以是單個指令,也可以是一組指令)。每條指令都應該由雙引號括起,或者整組指令應該由雙引號括起。每
3、條指令還應該用一個定界符結尾。 有效的定界符為換行符(\n)和分號(;)。 \n 后可以跟一個制表符(\t)作為格式化符號,增加 GCC 在匯編文件中生成的指令的可讀性。上述原則可以歸結為:①任意兩個指令間要么被分號(;)分開,要么被放在兩行;②放在兩行的方法既可以通過\n 的方法來實現(xiàn),也可以真正的放在兩行;③可以使用一對或多對雙引號,每對雙引號里可以放任意多條指令,所有的指令都必須放到雙引號中。在基本內嵌匯編中,“匯編語句模板”的書
4、寫的格式和你直接在匯編文件中使用匯編語言編程沒有什么不同,你可以在其中定義標號 (Label),定義對齊(.align n),定義段(.section name)。例如:__asm__(“.align 2\n\t“ “movl %eax, %ebx\n\t“ “test %ebx, %ecx\n\t“ “jne error\n\t“ “sti\n\t“ “error: popl %edi\n\t“ “subl %ecx, %ebx“);
5、建議大家都使用這種格式來寫內嵌匯編代碼。3、__volatile____volatile__是 GCC 關鍵字 volatile 的宏定義:#define __volatile__ volatile__volatile__或 volatile 是可選的。 如果不想讓 GCC 的優(yōu)化改動你的內嵌匯編代碼,你最好在前面都加上__volatile__??克鼈儗?C 語言表達式與指令操作數(shù)相對應。指令模板后面用圓括號括起來的是 C 語言表達式,
6、本例中只有兩個:“result”和“input”,他們按照在輸出部分和輸入部分出現(xiàn)的順序分別與指令操作數(shù)“%0”,“%1”對應;注意對應順序:第一個 C 語言表達式對應“%0”;第二個表達式對應“%1”,依次類推。在每個操作數(shù)前面有一個用雙引號括起來的字符串,字符串的內容是對該操作數(shù)的約束或者說要求?!皉esult”前面的約束字符串是“=r”,其中“=”表示“result”在指令中是只寫的(輸出操作數(shù)),“r”表示需要將“result”
7、與某個通用寄存器相關聯(lián),先將操作數(shù)的值讀入寄存器,然后在指令中使用相應寄存器,而不是“result”本身,當然指令執(zhí)行完后需要將寄存器中的值存入變量“result”,從表面上看好像是指令直接對“result”進行操作,實際上 GCC 做了隱式處理,這樣我們可以少寫一些指令?!癷nput”前面的“r”表示該表達式需要先放入某個寄存器,然后在指令中使用該寄存器參加運算。由此可見,C 語言表達式或者變量與寄存器的關系由 GCC 自動處理,我們
8、只需使用約束字符串指導 GCC 如何處理即可。內聯(lián)匯編的重要性體現(xiàn)在它能夠靈活操作,而且可以使其輸出通過 C 變量顯示出來。因為它具有這種能力,所以__asm__可以用作匯編指令和包含它的 C 程序之間的接口。2、匯編語句模板◆操作數(shù)C 語言表達式可用作內嵌匯編中的匯編指令的操作數(shù)。在匯編指令通過對 C 語言表達式進行操作來執(zhí)行有意義的作業(yè)的情況下,操作數(shù)是擴展格式的內嵌匯編的主要特性。每個操作數(shù)都由操作數(shù)約束字符串指定,后面跟著用圓括
9、號括起來的 C 語言表達式,例如:“constraint“(C expression)操作數(shù)約束的主要功能是確定操作數(shù)的尋址方式?!粽嘉环跀U展格式的內嵌匯編的“匯編語句模板”中,操作數(shù)由占位符引用。如果總共有 n 個操作數(shù)(包括輸入和輸出),那么第一個輸出操作數(shù)的編號為 0,逐項遞增,總操作數(shù)的數(shù)目限制在 10 個(%0、%1、…、%9)。如果要處理很多輸入和輸出操作,數(shù)字型的占位符很快就會變得混亂。為了使條理清晰,GNU 編譯器(從
10、版本 3.1 開始)允許聲明替換的名稱作為占位符。替換的名稱在“輸入部分”和“輸出部分”中聲明。格式如下:[name] “constraint“(C expression)聲明 name 后,使用%[name]的形式替換內嵌匯編代碼中相應的數(shù)字型占位符。如下面所示:__asm__(“cmoveq %1, %2, %[result]“: [result] “=r“(result): “r“(test), “r“(new), “[resul
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- at&t匯編與gcc內嵌匯編語法
- at&t匯編語言與gcc內嵌匯編簡介
- vc++內嵌匯編
- 在vc 中使用內嵌匯編
- 基于GCC的DSP C Compiler匯編優(yōu)化初步.pdf
- visual basic內嵌匯編語言解決方案
- gcc詳解
- 基于GCC的DSP芯片匯編器的研究與開發(fā).pdf
- 糖皮質激素gcc
- ansys內嵌函數(shù)總匯
- GCC編譯器安全驗證方法研究.pdf
- 基于GCC的軟件流水技術的研究.pdf
- gcc編譯系統(tǒng)結構分析與后端移植實踐
- GCC編譯系統(tǒng)結構分析與后端移植實踐.pdf
- 基于GCC的緩沖區(qū)溢出檢測研究.pdf
- 基于GCC的中間代碼優(yōu)化技術研究.pdf
- 去除rmvb內嵌字幕的方法
- GCC區(qū)域合作影響及中國應對措施研究.pdf
- 基于GCC的ARCA3的編譯器移植.pdf
- GCC編譯器到Trimedia移植的研究和實現(xiàn).pdf
評論
0/150
提交評論