коды является:Как понять встроенный ассемблер в функции «__xchg»?
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)
?
спасибо.
спасибо. Но я не могу понять, почему «GCC не должен пытаться поместить его в инструкцию»? – lxgeek
Поскольку 'x' используется как источник адресата * и * (потому что' xchg' обменивает два значения), необходимо убедиться, что исходное значение используется до перезаписывания. Значение указывается только один раз в инструкции, но действует так, как если бы он был указан дважды. Опять же, это немного оптимизация взлома. –