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

来源:互联网 发布:360度全景照片 知乎 编辑:程序博客网 时间:2024/04/28 18:18

《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的确也是个输入)