日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C指针原理(6)-C内嵌汇编

發布時間:2025/3/12 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C指针原理(6)-C内嵌汇编 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

內聯匯編的重要性體現在它能夠靈活操作,而且可以使其輸出通過 C 變量顯示出來。因為它具有這種能力,所以 “asm” 可以用作匯編指令和包含它的 C 程序之間的接口。簡單得說,內聯匯編,就是可以讓程序員在C語言中直接嵌入匯編代碼,并與匯編代碼交互C程序中的C表達式,享受匯編的高運行效率。

內聯匯編的格式是直接在C代碼中插入以下格式:
asm(


)
其中的"…“為匯編代碼,比如下面例子中,在 result=a*b和printf(”%d\n",result)之間插入一段匯編,

下面的這段匯編什么都不做,每個nop指令占用一個指令的執行時間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中:

#include <stdio.h> int c=10; int d=20; int addresult; int main(void){int a=6;int b=2;int result;result=a*b;asm("nop\n\t""nop\n\t""nop\n\t""nop");//4個nop指令,\n\t表示換行,然后加上TAB行首空,因為每個匯編指令必須在單獨一行,需要換行,加上制表符是為了適應某些編譯器的要求。 printf("%d\n",result);asm("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; }

編譯上述代碼

$ gcc -o test test.c
$ ./test
12
30
在匯編代碼中可以直接使用變量名稱操作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__(..................) 下面的代碼和剛才代碼功能一樣,唯一的區別是不需要優化#include <stdio.h> int c=10; int d=20; int addresult; int main(void){int a=6;int b=2;int result;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指针原理(6)-C内嵌汇编的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。