Linux 如何理解内联汇编程序在"__xchg";?

Linux 如何理解内联汇编程序在"__xchg";?,linux,gcc,assembly,kernel,Linux,Gcc,Assembly,Kernel,代码为: static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int size) { switch (size) { case 1: __asm__ __volatile__("xchgb %b0,%1" :"=q" (x)

代码为:

 static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int size)
 {
         switch (size) {
                 case 1:
                         __asm__ __volatile__("xchgb %b0,%1"
                                 :"=q" (x)
                                 :"m" (*__xg(ptr)), "" (x)
                                 :"memory");
                         break;
                 case 2:
                         __asm__ __volatile__("xchgw %w0,%1"
                                 :"=r" (x)
                                 :"m" (*__xg(ptr)), "" (x)
                                 :"memory");
                         break;
                 case 4:
                         __asm__ __volatile__("xchgl %0,%1"
                                 :"=r" (x)
                                 :"m" (*__xg(ptr)), "" (x)
                                 :"memory");
                         break;
         }
         return x;
 }
“=q”
的含义是什么?
以及如何理解
”(x)
的语义?
谢谢。

”(x)
更像是一种优化——它向GCC发出信号,表示
x
被用作源操作数,但
意味着GCC不应该尝试将其放入指令中

至于
“=q”
,它指的是其最低字节可以访问的任何寄存器(
al/bl/cl/dl
在32位模式下,或任何寄存器在64位模式下)


“+q”(x)通常用于像这样更新的操作数。

谢谢。但是,我不明白为什么“GCC不应该尝试将其放在指令中”?因为
x
同时用作目标和源(因为
xchg
交换两个值),所以有必要确保在覆盖之前使用原始值。该值在指令中只指定了一次,但其作用就像指定了两次一样。同样,这是一个有点优化黑客。