C 什么';以下代码的含义是什么?

C 什么';以下代码的含义是什么?,c,gcc,assembly,inline-assembly,compare-and-swap,C,Gcc,Assembly,Inline Assembly,Compare And Swap,下面有一个CAS代码,它只能处理int类型,我知道CAS的功能,但我不知道下面显示的详细信息 inline int CAS(unsigned long *mem,unsigned long newval,unsigned long oldval) { __typeof (*mem) ret; __asm __volatile ("lock; cmpxchgl %2, %1" : "=a" (ret), "=m" (*mem) : "r" (newval), "m"

下面有一个CAS代码,它只能处理int类型,我知道CAS的功能,但我不知道下面显示的详细信息

inline int CAS(unsigned long *mem,unsigned long newval,unsigned long oldval)
{
    __typeof (*mem) ret;
    __asm __volatile ("lock; cmpxchgl %2, %1"
    : "=a" (ret), "=m" (*mem)
    : "r" (newval), "m" (*mem), "0" (oldval));
    return (int) ret;
}
我知道应该有五个参数映射到%0、%1、%2、%3、%4,因为输入/输出字段中有五个参数

我还知道,
“=a”
表示使用
eax
寄存器,
“=m”
表示使用内存地址,
“r”
表示使用任何寄存器

但我不明白“0”是什么意思

我不明白为什么“cmpxchgl”只使用两个参数%2,%1而不是三个

它应该使用三个参数作为CAS函数


在哪里可以获得有关内联c asm的所有信息?我需要一个完整的教程。

%2
newval
%1
*mem

使用
“0”(oldval)
,出现的第一个寄存器是
“=a”
,表示
oldval
存储在
eax


因此
cmpxchgl%2,%1“
表示
cmpxchgl newval,*mem”
(而
eax
中的
oldval
),它检查
eax
(oldval的值)是否等于
*mem
,如果相等,将
*mem
的值更改为
newval
,对于内联asm,请阅读gcc手册。关于
cmpxchgl
的工作原理,请阅读指令集参考。也就是说,
“0”
意味着使用与参数0相同的位置(在本例中是
eax
),并且
cmpxchgl
隐式使用
eax
,这就是为什么它只需要2个参数,这就是为什么操作数固定为
“=a”
“0”
。另外请注意,gcc有可移植的内置组件,您不应该为此使用assembly。另外,基本上每次使用“lock”前缀时,您可能都需要“memory”clobber(这段代码没有)来帮助避免非常微妙的计时错误。哦,是的,这也应该是“抄送”。使用内置的另一个原因…非常感谢@Jester和@David Wohlferd,您提供的信息对我帮助很大。