内联汇编学习

内联汇编:嵌入c语言程序的汇编程序

示例:

int  add(int a,int b)
{
	int sum;
	__asm__ volatile(
		"add %0,%1,%2"
		:"=r"(sum)
		:"r"(a),"r"(b)
		:"cc"
	);
	return sum;
}

说明:

__asm__ 为内联汇编的声明
"add %0,%1,%2"
%0 代表第0个操作数
%1 代表第1个操作数
%2 代表第2个操作数
即把第一个操作数加上第二个操作数的和放入第零个操作数
:"=r"(sum) 
其中的 : 表示输出,"r"(sum)称为输出操作数	是第0个操作数
=r表示寄存器会被写入某一个值
:"r"(a),"r"(b) 
其中的 : 表示输入,"r"(a),"r"(b) 称为输出操作数 。r代表的是寄存器,a放入某个寄存器
"r"(a)是第1个操作数,"r"(b)是第2个操作数
:"cc" 表示汇编代码修改的内容,影响到了flag寄存器

值得注意的是在gcc编译器中常常会进行优化
例如:
“add %0,%1,%2”
这会优化成

add r0,r1

减少使用的内存,但是容易造成bug
所以我们需要将这一句汇编指令中加&

:"=&r"(sum) 

可以是汇编指令变为:

ADD R0,R1,R2

即R0=R1+R2

意思就是让一个萝卜占一个坑,不让编译器使重复使用萝卜坑,防止错误。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
09-20 399

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值