C/C++中内联汇编

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值