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

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

ID:1954507

大?。?0.71 KB

頁數(shù):5頁

時間:2017-11-13

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

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

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

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

3、例中只有兩個:"result"和"input",他們按照出現(xiàn)的順序分別與指令操作數(shù)"%0","%1"對應;注意對應順序:第一個C表達式對應"%0";第二個表達式對應"%1",依次類推,操作數(shù)至多有10個,分別用"%0","%1"...."%9"表示。在每個操作數(shù)前面有一個用引號括起來的字符串,字符串的內(nèi)容是對該操作數(shù)的限制或者說要求。"result"前面的限制字符串是"=r",其中"="表示"result"是輸出操作數(shù),"r"表示需要將"result"與某個通用寄存器相關(guān)聯(lián),先將操作數(shù)的值讀入寄存器

4、,然后在指令中使用相應寄存器,而不是"result"本身,當然指令執(zhí)行完后需要將寄存器中的值存入變量"result",從表面上看好像是指令直接對"result"進行操作,實際上GCC做了隱式處理,這樣我們可以少寫一些指令。"input"前面的"r"表示該表達式需要先放入某個寄存器,然后在指令中使用該寄存器參加運算。??C表達式或者變量與寄存器的關(guān)系由GCC自動處理,我們只需使用限制字符串指導GCC如何處理即可。限制字符必須與指令對操作數(shù)的要求相匹配,否則產(chǎn)生的匯編代碼將會有錯,讀者可以將上例中的兩個

5、"r",都改為"m"(m表示操作數(shù)放在內(nèi)存,而不是寄存器中),編譯后得到的結(jié)果是:??movlinput,result??很明顯這是一條非法指令,因此限制字符串必須與指令對操作數(shù)的要求匹配。例如指令movl允許寄存器到寄存器,立即數(shù)到寄存器等,但是不允許內(nèi)存到內(nèi)存的操作,因此兩個操作數(shù)不能同時使用"m"作為限定字符。??內(nèi)嵌匯編語法如下:??__asm__(匯編語句模板:輸出部分:輸入部分:破壞描述部分)??共四個部分:匯編語句模板,輸出部分,輸入部分,破壞描述部分,各部分使用":"格開,匯編語句模

6、板必不可少,其他三部分可選,如果使用了后面的部分,而前面部分為空,也需要用":"格開,相應部分內(nèi)容為空。例如:??__asm____volatile__("cli":::"memory")??1、匯編語句模板??匯編語句模板由匯編語句序列組成,語句之間使用";"、""或"t"分開。指令中的操作數(shù)可以使用占位符引用C語言變量,操作數(shù)占位符最多10個,名稱如下:%0,%1,...,%9。指令中使用占位符表示的操作數(shù),總被視為long型(4個字節(jié)),但對其施加的操作根據(jù)指令可以是字或者字節(jié),當把

7、操作數(shù)當作字或者字節(jié)使用時,默認為低字或者低字節(jié)。對字節(jié)操作可以顯式的指明是低字節(jié)還是次字節(jié)。方法是在%和序號之間插入一個字母,"b"代表低字節(jié),"h"代表高字節(jié),例如:%h1。??2、輸出部分??輸出部分描述輸出操作數(shù),不同的操作數(shù)描述符之間用逗號格開,每個操作數(shù)描述符由限定字符串和C語言變量組成。每個輸出操作數(shù)的限定字符串必須包含"="表示他是一個輸出操作數(shù)。??例:??__asm____volatile__("pushfl;popl%0;cli":"=g"(x))??描述符字符串表示對該變量的

8、限制條件,這樣GCC就可以根據(jù)這些條件決定如何分配寄存器,如何產(chǎn)生必要的代碼處理指令操作數(shù)與C表達式或C變量之間的聯(lián)系。??3、輸入部分??輸入部分描述輸入操作數(shù),不同的操作數(shù)描述符之間使用逗號格開,每個操作數(shù)描述符由限定字符串和C語言表達式或者C語言變量組成。??例1:??__asm____volatile__("lidt%0"::"m"(real_mode_idt));??例二(bitops.h):??Static__inline__void__set_bit(i

當前文檔最多預覽五頁,下載文檔查看全文

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

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