Bien, este es un ensamblador en línea gcc muy poderoso pero difícil de entender.
Primero, el% carbonero es un char especial. Le permite definir los marcadores de posición de registro y número (más adelante, mor). Desafortunadamente, el% también se utiliza como parte de un nombre de registro (como% EAX), por lo que en el ensamblador en línea de gcc debe usar dos por ciento de caracteres si desea nombrar un registro.
% 0,% 1 y% 2 (ect ..) son operandos de entrada y salida de marcador de posición. Estos se definen en la lista seguida de la cadena del ensamblador. En su ejemplo% 0 se convierte en un marcador de posición para y, y% 1 se convierte en un marcador de posición para x. El compilador se asegurará de que las variables estén en los registros para los operandos de entrada antes de que se ejecute el código asm, y se asegurará de que el operando de salida se escriba en la variable especificada en la lista de operandos de salida.
Ahora debe hacerse una idea de lo que es r (y): es un operando de entrada que reserva un registro para la variable y y lo asigna al marcador de posición% 1 (porque es el segundo operando enumerado después del ensamblador en línea cuerda). Hay muchos otros tipos de marcadores de posición. m le permite especificar una ubicación de memoria, y si no me equivoco, puedo usarla para constantes numéricas. Los encontrará todos listados en la documentación de gcc.
Luego está la lista de clobber. ¡Esta lista es importante! Enumera todos los registros, indicadores, etc. de las ubicaciones de memoria que se modifican en su código de ensamblador (como el EAX en su ejemplo). Si obtiene esto mal, el optimizador no sabe qué se ha modificado y es muy probable que termine con un código que no funciona.
Su ejemplo es, por cierto, casi inútil. Simplemente carga el valor X en un registro y asigna este registro a EAX. Luego EAX se almacena en otro registro que luego se convertirá en su variable y.Entonces todo lo que hace es una simple asignación:
y = x;
Una última cosa: si ha trabajado antes con el ensamblador tipo Intel: debe leer los argumentos al revés. Para todas las instrucciones, el operando fuente es el que sigue la instrucción en sí, y el operando objetivo es el que se encuentra a la derecha de la coma. En comparación con la sintaxis de Intel, esto es exactamente al revés.
Además, ¿no obtuve what = r (y) yr (x)? también, ¿qué es un registro destrozado? – brett
Dos porciento doble: http://stackoverflow.com/questions/14745631/what-does-a-double-percent-sign-do-in-gcc-inline-assembly –
Tenga cuidado con el asm básico frente al extendido: http: // stackoverflow.com/a/31711138/895245 –