gcc內(nèi)嵌匯編簡介收藏

gcc內(nèi)嵌匯編簡介收藏

ID:13451570

大?。?0.71 KB

頁數(shù):5頁

時(shí)間:2018-07-22

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

《gcc內(nèi)嵌匯編簡介收藏》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。

1、gcc內(nèi)嵌匯編簡介收藏在內(nèi)嵌匯編中,可以將C語言表達(dá)式指定為匯編指令的操作數(shù),而且不用去管如何將C語言表達(dá)式的值讀入哪個(gè)寄存器,以及如何將計(jì)算結(jié)果寫回C變量,你只要告訴程序中C語言表達(dá)式與匯編指令操作數(shù)之間的對應(yīng)關(guān)系即可,GCC會(huì)自動(dòng)插入代碼完成必要的操作。??1、簡單的內(nèi)嵌匯編??例:??__asm____volatile__("hlt");"__asm__"表示后面的代碼為內(nèi)嵌匯編,"asm"是"__asm__"的別名。"__volatile__"表示編譯器不要優(yōu)化代碼,后面的指令保留原樣,"volatile"是它的別名。括號里面是匯

2、編指令。??2、內(nèi)嵌匯編舉例??使用內(nèi)嵌匯編,要先編寫匯編指令模板,然后將C語言表達(dá)式與指令的操作數(shù)相關(guān)聯(lián),并告訴GCC對這些操作有哪些限制條件。例如在下面的匯編語句:??__asm____violate__("movl%1,%0":"=r"(result):"m"(input));??"movl%1,%0"是指令模板;"%0"和"%1"代表指令的操作數(shù),稱為占位符,內(nèi)嵌匯編靠它們將C語言表達(dá)式與指令操作數(shù)相對應(yīng)。指令模板后面用小括號括起來的是C語言表達(dá)式,本例中只有兩個(gè):"result"和"input",他們按照出現(xiàn)的順序分別與指令操作

3、數(shù)"%0","%1"對應(yīng);注意對應(yīng)順序:第一個(gè)C表達(dá)式對應(yīng)"%0";第二個(gè)表達(dá)式對應(yīng)"%1",依次類推,操作數(shù)至多有10個(gè),分別用"%0","%1"...."%9"表示。在每個(gè)操作數(shù)前面有一個(gè)用引號括起來的字符串,字符串的內(nèi)容是對該操作數(shù)的限制或者說要求。"result"前面的限制字符串是"=r",其中"="表示"result"是輸出操作數(shù),"r"表示需要將"result"與某個(gè)通用寄存器相關(guān)聯(lián),先將操作數(shù)的值讀入寄存器,然后在指令中使用相應(yīng)寄存器,而不是"result"本身,當(dāng)然指令執(zhí)行完后需要將寄存器中的值存入變量"result",從

4、表面上看好像是指令直接對"result"進(jìn)行操作,實(shí)際上GCC做了隱式處理,這樣我們可以少寫一些指令。"input"前面的"r"表示該表達(dá)式需要先放入某個(gè)寄存器,然后在指令中使用該寄存器參加運(yùn)算。??C表達(dá)式或者變量與寄存器的關(guān)系由GCC自動(dòng)處理,我們只需使用限制字符串指導(dǎo)GCC如何處理即可。限制字符必須與指令對操作數(shù)的要求相匹配,否則產(chǎn)生的匯編代碼將會(huì)有錯(cuò),讀者可以將上例中的兩個(gè)"r",都改為"m"(m表示操作數(shù)放在內(nèi)存,而不是寄存器中),編譯后得到的結(jié)果是:??movlinput,result??很明顯這是一條非法指令,因此限制字符串

5、必須與指令對操作數(shù)的要求匹配。例如指令movl允許寄存器到寄存器,立即數(shù)到寄存器等,但是不允許內(nèi)存到內(nèi)存的操作,因此兩個(gè)操作數(shù)不能同時(shí)使用"m"作為限定字符。??內(nèi)嵌匯編語法如下:??__asm__(匯編語句模板:輸出部分:輸入部分:破壞描述部分)??共四個(gè)部分:匯編語句模板,輸出部分,輸入部分,破壞描述部分,各部分使用":"格開,匯編語句模板必不可少,其他三部分可選,如果使用了后面的部分,而前面部分為空,也需要用":"格開,相應(yīng)部分內(nèi)容為空。例如:??__asm____volatile__("cli":::"memory")??1、匯編

6、語句模板??匯編語句模板由匯編語句序列組成,語句之間使用";"、""或"t"分開。指令中的操作數(shù)可以使用占位符引用C語言變量,操作數(shù)占位符最多10個(gè),名稱如下:%0,%1,...,%9。指令中使用占位符表示的操作數(shù),總被視為long型(4個(gè)字節(jié)),但對其施加的操作根據(jù)指令可以是字或者字節(jié),當(dāng)把操作數(shù)當(dāng)作字或者字節(jié)使用時(shí),默認(rèn)為低字或者低字節(jié)。對字節(jié)操作可以顯式的指明是低字節(jié)還是次字節(jié)。方法是在%和序號之間插入一個(gè)字母,"b"代表低字節(jié),"h"代表高字節(jié),例如:%h1。??2、輸出部分??輸出部分描述輸出操作數(shù),不同的操作數(shù)描述符

7、之間用逗號格開,每個(gè)操作數(shù)描述符由限定字符串和C語言變量組成。每個(gè)輸出操作數(shù)的限定字符串必須包含"="表示他是一個(gè)輸出操作數(shù)。??例:??__asm____volatile__("pushfl;popl%0;cli":"=g"(x))??描述符字符串表示對該變量的限制條件,這樣GCC就可以根據(jù)這些條件決定如何分配寄存器,如何產(chǎn)生必要的代碼處理指令操作數(shù)與C表達(dá)式或C變量之間的聯(lián)系。??3、輸入部分??輸入部分描述輸入操作數(shù),不同的操作數(shù)描述符之間使用逗號格開,每個(gè)操作數(shù)描述符由限定字符串和C語言表達(dá)式或者C語言變量組成。??例1:??__

8、asm____volatile__("lidt%0"::"m"(real_mode_idt));??例二(bitops.h):??Static__inline__void__set_bit(i

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

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

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