使用內嵌匯編,要先編寫匯編指令模板,然后將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”表示該表達式需要先放入某個寄存器,然后在指令中使用該寄存器參加運算。