2010-03-22 9 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;  
} 

Qualcuno può dirmi cosa fa esattamente questo codice? Voglio dire, ho un'idea o parti di questo comando. "1" newval è l'input, "= a" è per eliminare il suo valore precedente e aggiornarlo. "m" è per l'operazione di memoria, ma sono confuso circa la funzionalità di questa funzione. Che cosa fa il segno "+ m"? Questa funzione fa qualcosa come m = a; m = newval; return aChiamare l'assemblaggio in GCC?

risposta

2

ci sono constraints. Essi non sono variabili, ma i modi, come la "w", "R", "R +" di fopen()

alcuni di essi sono descritti qui

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

parte 6. Di più su vincoli.

E l'ultimo "cc" è il clobber.

Se le nostre istruzioni possono modificare il registro del codice di condizione, è necessario aggiungere "cc" all'elenco di clobber.

formato completo di ASM è

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

= e + sono modificatori di vincolo.

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

`=' significa che questo operando è sola scrittura per questa istruzione: il valore precedente viene scartato e sostituito da dati di uscita.

`+ 'Significa che questo operando è sia letto e scritto dall'istruzione.

vincoli di base sono qui

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

m Un operando di memoria è consentito, con qualsiasi tipo di indirizzo che la macchina supporta in generale.

.. 1 .. È consentito un operando che corrisponde al numero di operando specificato . Se una cifra viene utilizzata insieme alle lettere all'interno della stessa alternativa, , la cifra dovrebbe venire per ultima.

'a' è i386 specifico

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

a Il un (EAX) registrarsi.

+0

anche qui http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#s6 – osgx