2010-03-22 35 views
8
#include <stdlib.h> 

static inline uint 
xchg(volatile unsigned int *addr, unsigned int newval) 
{ 
    uint result; 
    asm volatile("lock; xchgl %0, %1" : "+m" (*addr), "=a" (result) : "1" (newval) : "cc"); 

return result;  
} 

有人能告訴我這段代碼究竟做了什麼嗎?我的意思是我有一個想法或這個命令的一部分。 「1」newval是輸入,「= a」是清除其先前的值並更新它。 「m」用於內存操作,但我對這個函數的功能感到困惑。 「+ m」牌做什麼?這個函數做類似m = a的事情嗎? m = newval;退貨在GCC中調用程序集?

回答

2

還有constraints。他們不是變量,但模式,如在 「W」, 「R」, 「+ R」 的fopen()

其中一些是在這裏

http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html

部分6.更多的限制說明。

最後的「cc」是clobber。

如果我們的指令可以改變條件碼寄存器,我們必須添加"cc"到clobber列表。 ASM的

全格式

asm (assembler template 
     : output operands     /* optional */ 
     : input operands     /* optional */ 
     : list of clobbered registers  /* optional */ 
     ); 
6

=+是約束脩飾符。

http://gcc.gnu.org/onlinedocs/gcc/Modifiers.html#Modifiers

'=」意味着該操作數是 只寫此指令:所述 先前的值被丟棄並替換爲輸出數據 。

`+'表示該操作數是 讀取和寫入的指令。

基本約束在這裏

http://gcc.gnu.org/onlinedocs/gcc/Simple-Constraints.html#Simple-Constraints

m內存操作數將被允許, 任何地址的機器 支持一般。

.. 1 ..允許與指定操作數編號相匹配的操作數。 如果一個數字與 字母一起使用, 這個數字應該在最後。

'a' 爲i386的特定

http://gcc.gnu.org/onlinedocs/gcc/Machine-Constraints.html#Machine-Constraints

一個的一個(EAX)寄存器。

+0

也在這裏http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#s6 – osgx 2012-06-29 09:05:03