linux中atomic的实现理解(搞成1条汇编指令)
1 typedef struct { volatile int counter; } atomic_t; ----- volatile意思是不要对其进行优化,这里如果不优化的话就会被汇编成直接访问内存地址,而不是操作寄存器。
2 #define automic_set(v, i) (((v)->counter) = (i)) ----- 会被汇编成一条访问内存的指令。
3 Atomic_add(int i, atomic_t *v)
static __inline__ void atomic_add(int i, atomic_t *v)
{
__asm__ __volatile__(
LOCK "addl %1,%0"
:"=m" (v->counter)
:"ir" (i), "m" (v->counter));
}
分析下这个extended inline asm(gnu as == gas // AT&T)的语法:
asm ( assembler template
: output operands /* optional */
: input operands /* optional */
: list of clobbered registers /* optional */
);
这是会被汇编成一条指令,%0代表output,%1代表i,__volatile__保证这条代码不被优化,__asm__表示此处潜入汇编,output 和 input中的"m" "ir"是这种扩展潜入汇编的constraint。m代表这需要访问内存地址来取出数值,i代表这是个立即数,r代表可以放到任何的寄存器中。
具体可以去查:GCC-Assembly-Inline关键字.
其他的操作都是类似的。