最近在做一个课程设计,做的很是纠结和恼火,进展缓慢,不过还是有收获的。我想先抱怨一下,在中文环境中找点有用的资料真的是很困难,各种论坛里的回答也都根本对解决问题没有帮助,很多人完全没有考虑到新手的知识限制(或许),就我这次寻找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