GNU內(nèi)聯(lián)匯編
內(nèi)聯(lián)匯編即在C中直接使用匯編語(yǔ)句進(jìn)行編程,使程序可以在C程序中實(shí)現(xiàn)C語(yǔ)言不能完成的一些工作,例如,在下面幾種情況中必須使用內(nèi)聯(lián)匯編或嵌入型匯編
- 程序中使用飽和算術(shù)運(yùn)算(Saturating Arithmetic)
- 程序需要對(duì)協(xié)處理器進(jìn)行操作
- 在C程序中完成對(duì)程序狀態(tài)寄存器的操作
__asm__ __volatile__("asm code":output:input:changed registers);
Note:
- 使用__asm__和__volatile__表示編譯器將不檢查后面的內(nèi)容,而是直接交給匯編器。
- 如果希望變壓器你優(yōu)化,__volatile__可以不加
- 沒(méi)有asm code也不能省略""
- 沒(méi)有前面的和中間的部分,不可以相應(yīng)的省略:
- 沒(méi)有changed 部分,必須相應(yīng)的省略:
- 最后的;不能省略,對(duì)于C語(yǔ)言來(lái)說(shuō)這是一條語(yǔ)句
- 匯編代碼必須放在一個(gè)字符串內(nèi),且字符串中間不能直接按回車(chē)換行,可以寫(xiě)成多個(gè)字符串,注意中間不能有任何符號(hào),這樣就會(huì)將兩個(gè)字符串合并為一個(gè)
- 指令之間必須要換行,還可以使用\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)存地址
+可讀可寫(xiě)
=只寫(xiě)
&表示該輸出操作數(shù)不能使用輸入部分使用過(guò)的寄存器,只能用"+&"或"=&"的方式使用
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)友評(píng)論