GNU內(nèi)聯(lián)匯編

內(nèi)聯(lián)匯編即在C中直接使用匯編語句進行編程,使程序可以在C程序中實現(xiàn)C語言不能完成的一些工作,例如,在下面幾種情況中必須使用內(nèi)聯(lián)匯編或嵌入型匯編

  1. 程序中使用飽和算術(shù)運算(Saturating Arithmetic)
  2. 程序需要對協(xié)處理器進行操作
  3. 在C程序中完成對程序狀態(tài)寄存器的操作
__asm__ __volatile__("asm code":output:input:changed registers);

Note:

  1. 使用__asm__和__volatile__表示編譯器將不檢查后面的內(nèi)容,而是直接交給匯編器。
  2. 如果希望變壓器你優(yōu)化,__volatile__可以不加
  3. 沒有asm code也不能省略""
  4. 沒有前面的和中間的部分,不可以相應的省略:
  5. 沒有changed 部分,必須相應的省略:
  6. 最后的;不能省略,對于C語言來說這是一條語句
  7. 匯編代碼必須放在一個字符串內(nèi),且字符串中間不能直接按回車換行,可以寫成多個字符串,注意中間不能有任何符號,這樣就會將兩個字符串合并為一個
  8. 指令之間必須要換行,還可以使用\t使指令在匯編中保持整齊

asm code

"mov r0, r0\n\t" "mov r1,r1\n\t" "mov r2,r2"

output(asm->C)

:"constraint" (variable)

"constraint"用于定義variable的存放位置:
r表示使用任何可用的寄存器
m表示使用變量的內(nèi)存地址
+可讀可寫
=只寫
&表示該輸出操作數(shù)不能使用輸入部分使用過的寄存器,只能用"+&"或"=&"的方式使用

input(C->asm)

:"constraint" (variable/immediate)

"constraint"用于定義variable的存放位置:
r表示使用任何可用的寄存器(立即數(shù)和變量都可以)
m表示使用變量的內(nèi)存地址
i表示使用立即數(shù)

例子

int a=100,b=200; int result;
__asm__ __volatile_
        		

網(wǎng)友評論