gcc內嵌彙編
限制字元
限制字元有很多種,有些是與特定體系結構相關,此處僅列出常用的限定字元和i386中可能用到的一些常用的限定符。它們的作用是指示編譯器如何處理其後的c語言變數與指令運算元之間的關係,例如是將變數放在暫存器中還是放在記憶體中等,下表列出了常用的限定字母。
「b」將輸入變數放入ebx
「c」將輸入變數放入ecx
「d」將輸入變數放入edx
「s」將輸入變數放入esi
「d」將輸入變數放入edi
「q」將輸入變數放入eax,ebx ,ecx ,edx中的乙個
「r」將輸入變數放入通用暫存器,也就是eax ,ebx,ecx,edx,esi,edi中的乙個
「a」把eax和edx,合成乙個64位的暫存器(uselong longs)
「m」記憶體變數
「o」運算元為記憶體變數,但是其定址方式是偏移量型別,也即是基址定址,或者是基址加變址定址
「v」運算元為記憶體變數,但定址方式不是偏移量型別
「,」 運算元為記憶體變數,但定址方式為自動增量
「p」運算元是乙個合法的記憶體位址(指標)
暫存器或記憶體
「g」 將輸入變數放入eax,ebx,ecx ,edx中的乙個或者作為記憶體變數
「x」運算元可以是任何型別
立即數「i」 0-31 之間的立即數(用於32位移位指令)
「j」 0-63 之間的立即數(用於64 位移位指令)
「n」 0-255 ,之間的立即數(用於out 指令)
「i」 立即數
「n」 立即數,有些系統不支援除字以外的立即數,這些系統應該使用「n」而不是「i」
匹配"0"、"1" ....."9"
表示用它限制的運算元與某個指定的運算元匹配,也即該運算元就是指定的那個運算元,例如用「0 」去描述「%1」運算元,那麼「%1」引用的其實就是「%0」運算元,注意作為限定符字母的0-9 ,與指令中的「%0」-「%9」的區別,前者描述運算元,後者代表運算元。
運算元型別
「=」 運算元在指令中是只寫的(輸出運算元)
「+」 運算元在指令中是讀寫型別的(輸入輸出運算元)
浮點數「f」
浮點暫存器
「t」第乙個浮點暫存器
「u」第二個浮點暫存器
「g」標準的80387
現在繼續看上面的例子:
"=m" (addr)表示addr為記憶體變數(「m」),而且是輸出變數(「=」);"ir" (nr)表示nr,為 0-31之間的立即數(「i」)或者乙個暫存器運算元(「r」)。
匹配限制符是一位數字 "0"、"1" ....."9" , 分別表示它限制的c表示式分別與佔位符%0,%1,……%9對應的c變數匹配。例如使用「0」作為%1,的限制字元,那麼 %0和%1表示同乙個c變數。
GCC內嵌彙編語法
內嵌彙編語法如下 asm 彙編語句模板 輸出部分 輸入部分 破壞描述部分 共四個部分 彙編語句模板,輸出部分,輸入部分,破壞描述部分,各部分使用 格開,彙編語句模板必不可少,其他三部分可選,如果使用了後面的部分,而前面部分為空,也需要用 格開,相應部分內容為空。例如 asm volatile cli...
GCC內嵌彙編學習筆記
本文主要對gcc內嵌彙編一文的簡要總結,試著用自己的話把gcc彙編的關鍵點描述出來,以驗證自己是否真正理解。本文將以 linux核心完全注釋 v3 中的乙個例子進行描述,這個例子我看的時候是非常的懵逼,直到看了gcc內嵌彙編一文。gcc內嵌彙編的基本結構 asm 彙編語句列表 輸出暫存器 輸入暫存器...
有關GCC內嵌彙編的總結
在gcc中共包括兩種方法嵌入彙編,分別是 基本內聯彙編語句 basic inline asm statement 和擴充套件內聯彙編語句 extended inline asm statement 基本內聯彙編不包括運算元 operand 而擴充套件內聯彙編語句乙個或多個運算元 operands 先...