2014-01-06 7 views
5

hier eine C-Funktion, die in ihm Assembler-Code verwendet erweitern:Ich verstehe nicht, diese Baugruppe Inline-Code in C erweitern

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

Ich las this codeproject link für lernen, wie Assembler-Code in C Erweiterte zu benutzen, aber ich verwirrt bei diesem Code. Ich verstehe etwas in diesem Code nicht:
1) Wo wird (newval) als Eingabe in Assembler-Code verwendet? (%0 auf (*addr) beziehen und %1 auf (result) Recht beziehen? Dann "1" (newval) nie im Code verwendet (wir nie %2 in Code sehen). Oder irre ich mich?)
2) Was ist "1" in "1" (newval) in Eingangsoperanden?
3) was ist "+m" zeichen bedeutet in "+m" (*addr)?

+1

Sie haben meistens Recht. Lesen Sie mehr [hier] (http://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html) – egur

+0

Ich werde das lesen. Danke – mojibuntu

+1

Viel besser Tutorial [hier] (http://locklessinc.com/articles/gcc_asm/). –

Antwort