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

¿Puede alguien decirme qué hace exactamente este código? Quiero decir que tengo una idea o las partes de este comando. "1" newval es la entrada, "= a" es eliminar su valor anterior y actualizarlo. "m" es para la operación de memoria, pero estoy confundido acerca de la funcionalidad de esta función. ¿Qué hace el signo "+ m"? ¿Esta función hace algo como m = a; m = newval; devuelva un¿Ensamblaje de llamadas en GCC?

Respuesta

2

hay constraints. Ellos no son variables, pero los modos, como la "r" "w", "r +" de fopen()

algunos de ellos se describen aquí

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

parte 6. Más sobre limitaciones.

Y el último "cc" es clobber.

Si nuestra instrucción puede alterar el registro del código de condición, tenemos que agregar "cc" a la lista de palabras clave.

Formato completo del ASM es

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

= y + son modificadores de restricción.

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

`=' significa que este operando es de sólo escritura para esta instrucción: la valor anterior se descarta y se reemplaza por datos de salida.

`+ 'Significa que este operando es ambos leído y escrito por las instrucciones.

restricciones básicas están aquí

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

m Un operando de memoria se permite, con cualquier tipo de dirección que la máquina apoya en general.

.. 1 .. Se permite un operando que coincida con el número de operando especificado . Si se usa un dígito junto con las letras dentro de la misma alternativa, , el dígito debe ser el último.

'a' es i386 específica

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

a El un (eax) registrar.

+0

también aquí http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#s6 – osgx

Cuestiones relacionadas