C指针原理(6)-C内嵌汇编
来源:互联网 发布:股票基本面软件 编辑:程序博客网 时间:2024/06/05 09:37
内联汇编的重要性体现在它能够灵活操作,而且可以使其输出通过 C 变量显示出来。因为它具有这种能力,所以 "asm" 可以用作汇编指令和包含它的 C 程序之间的接口。简单得说,内联汇编,就是可以让程序员在C语言中直接嵌入汇编代码,并与汇编代码交互C程序中的C表达式,享受汇编的高运行效率。
内联汇编的格式是直接在C代码中插入以下格式:
asm(
....
....
)
其中的"..."为汇编代码,比如下面例子中,在 result=a*b和printf("%d\n",result)之间插入一段汇编,
内联汇编的格式是直接在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);
本博客所有内容是原创,如果转载请注明来源
http://blog.csdn.net/myhaspl/
可以很明显地看到:
汇编代码之间用“\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内嵌汇编
- C指针原理(7)-C内嵌汇编
- C指针原理(8)-C内嵌汇编
- C指针原理(9)-C内嵌汇编
- c内嵌汇编
- C指针原理(1)-AT&T汇编
- C指针原理(2)-AT&T汇编
- C指针原理(3)-AT&T汇编
- C指针原理(4)-AT&T汇编
- C指针原理(5)-AT&T汇编
- C指针原理(28)-AT&T汇编
- C指针原理(29)-AT&T汇编
- C指针原理(94)-汇编基础(1)
- C指针原理(95)-汇编基础(2)
- C指针原理(27)-汇编分析C指针机制
- /*************** C内嵌汇编示例 ***************/
- C内嵌汇编简介
- C内嵌汇编简介
- 知识管理系统
- C指针原理(5)-AT&T汇编
- Mybatis代码自动生成插件使用
- javaI/O零碎
- 内部排序算法实现(C) [李园7舍_404]
- C指针原理(6)-C内嵌汇编
- Qt中 int ,float ,double转换为QString
- linux查找文件命令
- IOS系列——UItableview的基础使用
- MyReport报表引擎2.7.6.0与MyReport.TD套打引擎1.0.5.0
- 谈谈linux的一些好处
- 动态规划-最大子串 HDOJ1003
- ClassLoader and 插件化设计
- 指针数组、数组指针、指向函数的指针