2014-01-08 2 views
1

коды является:Как понять встроенный ассемблер в функции «__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)?
спасибо.

ответ

2

"" (x) является более оптимизация, чем что-либо - это сигналы для GCC, что x используется в качестве операнда-источника, но "" означает НКУ не должны пытаться поместить его в инструкции.

Что касается "=q", то это относится к любому регистру, к которому можно получить доступ к младшему байту (al/bl/cl/dl в 32-битном режиме или в любом регистре в 64-разрядном режиме).

«+ q» (x) обычно используется для операнда, который обновляется следующим образом.

+0

спасибо. Но я не могу понять, почему «GCC не должен пытаться поместить его в инструкцию»? – lxgeek

+0

Поскольку 'x' используется как источник адресата * и * (потому что' xchg' обменивает два значения), необходимо убедиться, что исходное значение используется до перезаписывания. Значение указывается только один раз в инструкции, но действует так, как если бы он был указан дважды. Опять же, это немного оптимизация взлома. –

Смежные вопросы