1. 程式人生 > 其它 >C語言內嵌彙編程式碼

C語言內嵌彙編程式碼

C程式碼中嵌入彙編語句,常見格式如下:

asm volatile( /* volatile : 可選,禁止編譯器對彙編程式碼進行優化 */
  "彙編語句模板"   /* 彙編指令間使用'\n'分隔 */
  :"=限制符"(輸出引數)
  :"限制符"(輸入引數)
  :損壞部分
)

其中:

1、asm表示後面的程式碼為內嵌彙編;

2、volatile表示編譯器不要優化程式碼,後面的指令保留原樣;

3、編寫彙編指令模板,然後將C語言表示式與指令的運算元相關聯,並告訴GCC對這些操作有哪些限制條件。

內嵌彙編格式為——彙編語句模板:輸出部分:輸入部分:損壞部分

注意:
1、內嵌彙編的四個部分(彙編語句模板,輸出部分,輸入部分,破壞描述部分)使用":"格開;彙編語句模板必不可少,其他三部分可選,如果某一部分為空,也需要用":"格開,相應部分內容為空
2、彙編語句模板由彙編語句序列組成,語句之間使用";"、"\n"或"\n\t"分開。指令中的運算元可以使用佔位符引用C語言變數,運算元佔位符最多10個,名稱如下:%0,%1,...,%9。指令中使用佔位符表示的運算元,總被視為long型(4個位元組),但對其施加的操作根據指令可以是字或者位元組,當把運算元當作字或者位元組使用時,預設為低字或者低位元組。對位元組操作可以顯式的指明是低位元組還是次位元組。方法是在%和序號之間插入一個字母,"b"代表低位元組,"h"代表高位元組,例如:%h1。
3、輸出部分描述輸出運算元,不同的運算元描述符之間用逗號格開,每個運算元描述符由限定字串和C 語言變數組成。每個輸出運算元的限定字串必須包含"="表示他是一個輸出運算元。

例:__asm__ __volatile__("pushfl ; popl %0 ; cli":"=g" (x) )
描述符字串表示對該變數的限制條件,這樣GCC 就可以根據這些條件決定如何分配暫存器,如何產生必要的程式碼處理指令運算元與C表示式或C變數之間的聯絡。

4、輸入部分描述輸入運算元,不同的運算元描述符之間使用逗號格開,每個運算元描述符由限定字串和C語言表示式或者C語言變數組成。

例如:__asm__("btsl %1,%0":"=m" (ADDR):"Ir" (nr));

第一個佔位符%0與C 語言變數ADDR對應,第二個佔位符%1與C語言變數nr對應。因此上面的彙編語句程式碼與下面的虛擬碼等價:btsl nr, ADDR,將(*addr)的第nr位設為1。