**:
內聯彙編的重要性體現在它能夠靈活操作,而且可以使其輸出通過 c 變數顯示出來。因為它具有這種能力,所以 "asm" 可以用作彙編指令和包含它的 c 程式之間的介面。簡單得說,內聯彙編,就是可以讓程式設計師在c語言中直接嵌入彙編**,並與彙編**互動c程式中的c表示式,享受彙編的高執行效率。
內聯彙編的格式是直接在c**中插入以下格式:
asm(
....
....
)其中的"..."為彙編**,比如下面例子中,在 result=a*b和printf("%d\n",result)之間插入一段彙編,
下面的這段彙編什麼都不做,每個nop指令占用乙個指令的執行時間
[plain]view plain
copy
print?
result=a*b;
asm("nop\n\t"
"nop\n\t"
"nop\n\t"
"nop");//4個nop指令,\n\t表示換行,然後加上tab行首空,因為每個彙編指令必須在單獨一行,需要換行,加上製表符是為了適應某些編譯器的要求。
printf("%d\n",result);
可以很明顯地看到:
彙編**之間用「\n\t」間隔,並且每條彙編**單獨占用一行,共有4個nop指令,每個指令後的「\n\t」表示換行,然後加上tab行首空,因為每個彙編指令必須在單獨一行,需要換行,加上製表符是為了適應某些編譯器的要求。
下面是乙個完整的例子,內嵌的彙編完成對2個c程式定義的全域性變數c和d的相加,並將相加結果存入全域性變數addresult中:
[plain]view plain
copy
print?
#include
int c=10;
int d=20;
int addresult;
int main(void)
編譯上述**
$ gcc -o test test.c
$ ./test
1230
在彙編**中可以直接使用變數名稱操作c程式定義的全域性變數,比如c、d和addresult就是全域性變數:
"movl c,%eax\n\t"
"movl d,%ebx\n\t"
"movl %eax, addresult\n\t"
內聯彙編部分如果不需要編譯器優化( 優化可能破壞彙編**的內部結構,因為彙編**直接操作暫存器,而暫存器使用優化是編譯器提供的功能), 可以在 "asm" 後使用關鍵字 "volatile"。
asm volatile(
....
....
)如果程式必須與 ansi c 相容,則應該使用 __asm__ 和 __volatile__。
__asm__ __volatile__(
.........
.........
)下面的**和剛才**功能一樣,唯一的區別是不需要優化
[cpp]view plain
copy
print?
#include
intc=10;
intd=20;
intaddresult;
intmain(
void
){
inta=6;
intb=2;
intresult;
result=a*b;
//ansi c標準的asm有其它用,所以用__asm__,__volatile__表示內聯彙編部分不用優化(可以用volatile,但是ansi c不行),以防優化破壞內聯**組織結構
__asm__ __volatile__("nop\n\t"
"nop\n\t"
"nop\n\t"
"nop"
);//4個nop指令,\n\t表示換行,然後加上tab行首空,因為每個彙編指令必須在單獨一行,需要換行,加上製表符是為了適應某些編譯器的要求。
printf("%d\n"
,result);
__asm__ __volatile__("pusha\n\t"
"movl c,%eax\n\t"
"movl d,%ebx\n\t"
"add %ebx,%eax\n\t"
"movl %eax, addresult\n\t"
"popa"
);//使用全域性c變數c和d
printf("%d\n"
,addresult);
return
0;
C指標原理 5
plain view plain copy print?section data myvalue byte 67,68,69,70,0 mygs asciz c n section text globl main main 基位址 偏移位址 必須為暫存器 資料元素變址,資料元素長度 必須為暫存器 基...
C指標原理 12
2 擴充計算器 加入對括號和注釋的支援,首先修改flex 檔案,在第二部分加入更多的詞法規則 對於注釋直接忽略 忽略注釋 然後,修改bison term number abs term leftbracket exp rightbracket 我們的注釋以 表示 測試結果 myhaspl myhas...
C指標原理(18) C指標基礎
5 指標陣列 指標陣列就是陣列裡存放的是指標。include int main void for i 0 i 10 i return 1 上面定義了乙個指標陣列,陣列的每個元素都是指標,每個指標指向x陣列的相應元素。其中,p x為指標陣列,通過for迴圈中的p x i x i完成指標陣列每個元素的賦...