內嵌匯編 %0,%1 是什么


使用內嵌匯編,要先編寫匯編指令模板,然后將C語言表達式與指令的操作數相關聯,並告訴GCC對這些操作有哪些限制條件。例如在下面的匯編語句:  

__asm__ __violate__  
("movl %1,%0" : "=r" (result) : "m" (input));  

 

“movl %1,%0”是指令模板;“%0”和“%1”代表指令的操作數,稱為占位符,內嵌匯編靠它們將C語言表達式與指令操作數相對應。

指令模板后面用小括號括起來的是C語言表達式,本例中只有兩個:“result”和“input”,他們按照出現的順序分別與指令操作數“%0”,“%1,”對應;注意對應順序:第一個C表達式對應“%0”;第二個表達式對應“%1”,依次類推,操作數至多有10個,分別用“%0”,“%1”….“%9,”表示。

在每個操作數前面有一個用引號括起來的字符串,字符串的內容是對該操作數的限制或者說要求。

 

“result”前面的限制字符串是“=r”,其中“=”表示“result”是輸出操作數,“r”表示需要將“result”與某個通用寄存器相關聯,先將操作數的值讀入寄存器,然后在指令中使用相應寄存器,而不是“result”本身,當然指令執行完后需要將寄存器中的值存入變量“result”,從表面上看好像是指令直接對“result”進行操作,實際上GCC做了隱式處理,這樣我們可以少寫一些指令。

 

“input”前面的“r”表示該表達式需要先放入某個寄存器,然后在指令中使用該寄存器參加運算。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM