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
交换两个值),所以有必要确保在覆盖之前使用原始值。该值在指令中只指定了一次,但其作用就像指定了两次一样。同样,这是一个有点优化黑客。