以下代码的含义是什么?

时间:2014-09-10 15:30:20

标签: 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" (*mem), "0" (oldval));
    return (int) ret;
}

我知道应该有五个参数映射到%0,%1,%2,%3,%4,因为输入/输出字段中有五个参数

我也知道"=a"表示使用eax注册,"=m"表示使用内存地址,"r"表示使用任何寄存器

但我不明白" 0"装置

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

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

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

1 个答案:

答案 0 :(得分:2)

%2newval%1*mem

"0" (oldval),第一个寄存器为"=a",表示oldval存储在eax

所以cmpxchgl %2, %1"表示cmpxchgl newval, *mem"oldval中的eax),它会检查eax(oldval的值)是否等于*mem,如果相等,请将*mem的值更改为newval