我不明白这个扩展程序集内联代码在C中

moj*_*ntu 5 c assembly inline-assembly

这是一个使用扩展汇编代码的C函数:

static inline uint
xchg(volatile uint *addr, uint newval)
{
    uint result;
    asm volatile("lock; xchgl %0, %1" :
                "+m" (*addr), "=a" (result) :
                "1" (newval) :
                "cc");
    return result;
}
Run Code Online (Sandbox Code Playgroud)

我读了这个codeproject链接,了解如何在C代码中使用Extended Assembly,但我对此代码感到困惑.我不明白这段代码中的内容:
1)(newval)汇编代码中哪里用作输入?(%0是指(*addr)%1被参考(result)吧?然后"1" (newval)从来没有在代码中使用(我们从来没有看到%2在代码).或者我错了?)
2)什么是"1""1" (newval)输入操作数?
3)什么是"+m"标志意味着"+m" (*addr)什么?

Lee*_*hem 1

关于GCC的所有问题的答案都asm可以来自6.41带有C表达式操作数的汇编指令6.42 asm操作数的约束