C指针原理(6)-C内嵌汇编
內聯(lián)匯編的重要性體現在它能夠靈活操作,而且可以使其輸出通過 C 變量顯示出來。因為它具有這種能力,所以 “asm” 可以用作匯編指令和包含它的 C 程序之間的接口。簡單得說,內聯(lián)匯編,就是可以讓程序員在C語言中直接嵌入匯編代碼,并與匯編代碼交互C程序中的C表達式,享受匯編的高運行效率。
內聯(lián)匯編的格式是直接在C代碼中插入以下格式:
asm(
…
…
)
其中的"…“為匯編代碼,比如下面例子中,在 result=a*b和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”
內聯(lián)匯編部分如果不需要編譯器優(yōu)化( 優(yōu)化可能破壞匯編代碼的內部結構,因為匯編代碼直接操作寄存器,而寄存器使用優(yōu)化是編譯器提供的功能), 可以在 “asm” 后使用關鍵字 “volatile”。
asm volatile(
…
…
)
如果程序必須與 ANSI C 兼容,則應該使用 asm 和 volatile。
總結
以上是生活随笔為你收集整理的C指针原理(6)-C内嵌汇编的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C指针原理(5)-ATT汇编
- 下一篇: C指针原理(7)-C内嵌汇编