如何理解“__xchg”功能的内联汇编程序?

时间:2014-01-08 10:17:25

标签: 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)
                                 :"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)的语义?
谢谢。

1 个答案:

答案 0 :(得分:2)

"" (x)更多的是优化而不是任何东西 - 它向GCC发出信号,x被用作源操作数,但""表示GCC不应该尝试将其置于指令。

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

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