gcc内联汇编的一个注意点儿

本文通过分析《Linux内核情景分析》中的一段内联汇编代码,详细探讨了原子加法操作的实现原理,并尝试理解内联汇编语法中各参数的作用。

《Linux内核情景分析》举了一个内联汇编的例子:

 

这个例子的作用就是做 v->counter += i;

根据汇编指令 addl source, destination, 执行完毕后,destination = destination + source。因此我很不明白为什么上面的内联汇编的输入部分需要包含"m"(v->counter),照我来看,汇编代码addl %1, %0里并没有使用"m"(v->counter)(这个用%2来指代),因此这个"m"(v->counter)是完全不需要的。输入部分只要写"ir"(i)就够了

 

因此写了段汇编自己验证一下想法:

 

代码中只用到了%1, %0,因此输入部分里的"m"(i), "i"(3)都是不起作用的。gcc只管汇编语句中用到的%0, %1,可不管没用到的%2("m"(i)), %3("i"(3))

 

难道原始书写者的意思是用来更清晰描述哪些是输入?(从v->counter += i;语句来看v->counter = v->counter + i, v->counter的确也是个输入)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值