sábado, 24 de abril de 2010

Ensamblador inline en código C

Para incluir código ensamblador en un programa escrito en C la sintaxis es la siguiente.

#include <stdio.h>

int main(){
int var1 = 1;
int var2;
int var3;

__asm__(
"inc %%eax \n\t"
"movl %%eax, %%ecx \n\t"
"inc %%ecx \n\t"
:"=a" (var2), "=c" (var3)
:"a" (var1)
);

printf("Value1: %d\n", var1);
printf("Value2: %d\n", var2);
printf("Value3: %d\n", var3);


return 0;
}

Los paréntesis se escriben dobles para escapar el carácter '%' ya que en C es un modificador de cadena.

Todas las líneas acaban en '\n\t' para que el código en ensamblador quede formateado igual que el resto.

Los registros no se usan con el nombre como tal para las entrada/salida, se usan alias del tipo "a=eax, b=ebx, c=ecx...".

En el primer apartado "=a" (var2), "=c" (var3) se les está diciendo que el contenido final de eax lo lleve a var2 y el contenido de ecx lo lleve a var3.

En el segundo apartado "a" (var1) se le dice que se comience el bloque copiando el valor de var1 a eax, actuará como entrada.

El compilador da por hecho que los registros usados para entrada/salida del bloque en ensamblador no los puede reutilizar, pero si se utilizan más registros se pueden poner en un tercer apartado de forma opcional.

El bloque ensamblador escrito antes, hará lo siguiente:

1. Copia el valor de var1 a eax.
2. Incrementa el valor de eax en 1.
3. Copia el contenido de eax a ecx.
4. Aumenta el valor de ecx en 1.
5. Copia el valor de eax a var2.
6. Copia el valor de ecx a var3.

0 comentarios: