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