C指標原理 6

2021-06-19 15:10:48 字數 2337 閱讀 1444

**:

內聯彙編的重要性體現在它能夠靈活操作,而且可以使其輸出通過 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完成指標陣列每個元素的賦...