2014-01-08 64 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用作源操作數,但""意味着GCC不應該試圖把它放在指令。

至於"=q",它指的是可以訪問最低字節的任何寄存器(32位模式下的al/bl/cl/dl或64位模式下的任何寄存器)。

「+ q」(x)通常用於像這樣更新的操作數。

+0

謝謝。但是,我不明白爲什麼「海灣合作委員會不應該試圖把它放在教學中」? – lxgeek

+0

由於'x'既用作目的地*也用於*源(因爲'xchg'交換了兩個值),所以有必要確保在覆蓋前使用原始值。該值只在該指令中指定一次,但其行爲就像指定了兩次一樣。再次,這是一個優化黑客。 –