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

Kann mir jemand sagen, was genau dieser Code tut? Ich meine, ich habe eine Idee oder die Teile dieses Befehls. "1" newval ist die Eingabe, "= a" ist, den vorherigen Wert auszuspülen und zu aktualisieren. "m" ist für die Speicheroperation, aber ich bin verwirrt über die Funktionalität dieser Funktion. Was macht das "+ m" -Zeichen? Funktioniert diese Funktion etwa wie m = a; m = Neuwert; return aAufruf der Baugruppe in GCC?

Antwort

2

gibt es constraints. Sie sind keine Variablen, sondern Modi, wie die "w", "r", "r +" von fopen()

einige von ihnen werden hier beschrieben

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

Teil 6. Mehr über Einschränkungen.

Und das letzte "cc" ist Clobber.

Wenn unsere Anweisung das Condition-Code-Register ändern kann, müssen wir "cc" zur Clobber-Liste hinzufügen.

Vollformat von asm ist

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

= und + Constraint-Modifikatoren sind.

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

`=‘ bedeutet, dass dieser Operand Nur Schreiben für diesen Befehl ist: der vorherige Wert wird verworfen und durch Ausgangsdaten ersetzt.

`+ 'Bedeutet, dass dieser Operand von der Anweisung gelesen und geschrieben wird.

Grund Constraints ist hier

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

m Ein Speicheroperand wird erlaubt, mit jede Art der Adresse, die die Maschine im allgemeinen unterstützt.

.. 1 .. Ein Operand, der mit der angegebenen Operandennummer übereinstimmt, ist zulässig. Wenn eine Ziffer zusammen mit Buchstaben innerhalb derselben Alternative verwendet wird, sollte die Ziffer zuletzt kommen.

'a' ist i386 spezifischen

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

a Die a (EAX) registrieren.

+0

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