GCC內嵌彙編

2021-07-10 18:03:41 字數 1388 閱讀 8979

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 先...