C/C++中内联汇编

来源:互联网 发布:午夜视频聊天软件 编辑:程序博客网 时间:2024/06/05 03:25

最近在做一个课程设计,做的很是纠结和恼火,进展缓慢,不过还是有收获的。我想先抱怨一下,在中文环境中找点有用的资料真的是很困难,各种论坛里的回答也都根本对解决问题没有帮助,很多人完全没有考虑到新手的知识限制(或许),就我这次寻找C中内联汇编的经历来看,像我一样的菜鸟很难很快的找到入门的指导,所以我决定写一下自己的一些关于内联汇编的新学到的东西。

我们以两个数的加法为例来说,首先声明一下,内联汇编与使用的编译器以及机器有关,我用的编译器是MinGW(IDE是CFREE),也就是windows下的gcc,机器是intel的奔4

#include <stdio.h>int main(){int a = 1,b = 1,c;__asm__("add %1,%0\n\t"//这里说明下,目的操作数是后面的%0 "mov %0,%2\n\t"//同上,目的操作数是后面的%2 :"=r"(a)                    //这一行是将汇编中的代码对应到C代码中,同样按照顺序对应%2,%3等 :"r"(b),"r"(a)  //这一行是将C代码中的数据输入到汇编的代码中,按照先后顺序依次对应%0(b),%1(a)等 ); printf("%d\n",a);}

程序运行截图:



(即1+1=2)

为了进一步说明汇编代码中的最后两行(当初我最困惑的部分),下面对上面的程序稍加扩展:

#include <stdio.h>int main(){int a = 1,b = 1,c=-1;__asm__("add %1,%0\n\t""mov %0,%2\n\t""sub $1,%1\n\t" //这里将a(此时为2)减一 "mov %1,%3"     //然后将a赋给c(此时为1) :"=r"(a),"=r"(c) //这一行是将汇编中的代码对应到C代码中,同样按照顺序对应%2(a),%3(c)等 :"r"(b),"r"(a)  //这一行是将C代码中的数据输入到汇编的代码中,按照先后顺序依次对应%0(b),%1(a)等 ); printf("a=%d\nc=%d\n",a,c);}


参考资料:http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#s4


原创粉丝点击