views:

162

answers:

2
#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;    
}

Can some one tell me what this code does exactly? I mean I have an idea or the parts of this command. "1" newval is the input, "=a" is to flush out its previous value and update it. "m" is for the memory operation but I am confused about the functionality of this function. What does the "+m" sign do? Does this function do something like m=a; m = newval; return a

+2  A: 

there are constraints. They are not variables, but modes, like the "w", "r", "r+" of fopen()

some of them are described here

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

part 6. More about constraints.

And the last "cc" is clobber.

If our instruction can alter the condition code register, we have to add "cc" to clobber list.

Full format of asm is

   asm ( assembler template 
       : output operands                  /* optional */
       : input operands                   /* optional */
       : list of clobbered registers      /* optional */
       );
osgx
+5  A: 

= and + are constraint modifiers.

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

`=' Means that this operand is write-only for this instruction: the previous value is discarded and replaced by output data.

`+' Means that this operand is both read and written by the instruction.

Basic constrains are here

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

m A memory operand is allowed, with any kind of address that the machine supports in general.

..1.. An operand that matches the specified operand number is allowed. If a digit is used together with letters within the same alternative, the digit should come last.

'a' is i386 specific

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

a The a (eax) register.

osgx