= Ejemplo de proyecto en lenguale C y ensamblador = Se muestra un ejemplo de proyecto que incluye archivos fuentes en lenguaje C y en ensamblador.<
> El proyecto consiste en: * Una función '''suma''' escrita en ensamblador que recibe como parámetros 2 enteros, los suma y retorna su resultado. * Una función principal '''main()''' escrita en C, que utiliza la función '''suma''' para sumar dos enteros inicializados con una constante. Para poder realizar el llamado de una función escrita en ensamblador desde C, se debe realizar lo siguiente: * En el archivo en C se debe declarar la función '''suma''' como externa, esto define el prototipo de la función (recibe dos enteros y devuelve un entero) y al declararlo como externo, el compilador no devuelve error al no encontrar la implementación de la función. * El archivo ensamblador no tiene cambios importantes, si es necesario respetar las reglas de pase de parámetros ('''R0..R3''') para parámetros, y devolver en '''R0''', además de salvar los registros preservados. Código en lenguaje C {{{#!highlight c #include extern int suma(int a, int b); int main(void) { int a = 71; int b = 29; int c; c = suma(a,b); return c; } }}} Código en lenguaje ensamblador {{{#!highlight nasm .text .arm .global suma suma: add r2, r0, r1 mov r0, r2 mov pc, lr }}} == Construcción del proyector == {{{#!highlight console arm-none-eabi-gcc -Wall -mcpu=arm7tdmi -g -c main.c -o main.o arm-none-eabi-as -mcpu=arm7tdmi -g suma.s -o suma.o arm-none-eabi-gcc -Ttext=0 -nostartfiles -g main.o suma.o -o suma.elf }}} * La primer línea compila el código fuente del archivo '''main.c''' y genera el archivo objeto '''main.o''' * La segunda línea ensambla el archivo fuente '''suma.s''' y genera el archivo '''suma.o''' * La última línea enlaza los dos archivos objetos ('''main.o''' y '''suma.o''') y genera el archivo '''suma.elf''' Las diferentes opciones utilizadas son: * '''-c ''' para detener la construcción luego de la etapa de compilación y tiene como salida el archivo objeto ('''.o'''). * '''-o ''' para indicar el nombre del archivo de salida. * '''-Wall ''' para habilitar todos las advertencias (warnings) del compilador. * '''-mcpu=arm7tdmi ''' para indicar la arquitectura del procesador. * '''-g ''' para incluir información de depuración en los archivos de salida. === Simulación en PC con gdb === A COMPLETAR === Construcción utilizando `make` === Archivo `Makefile` para la compilación cruzada {{{#!highlight make CC = arm-none-eabi-gcc AS = arm-none-eabi-as LD = arm-none-eabi-ld OBJECTS = main.o suma.o CFLAGS = -Wall -mcpu=arm7tdmi -g -c ASFLAGS = -mcpu=arm7tdmi -g LDFLAGS = -Ttext=0 -nostartfiles -g suma.elf: $(OBJECTS) $(CC) $(LDFLAGS) $(OBJECTS) -o suma.elf suma.o: suma.s $(AS) $(ASFLAGS) suma.s -o suma.o main.o: main.c $(CC) $(CFLAGS) main.c clean: rm *.o *.elf }}} Archivo `Makefile` para la compilación sobre la RPi {{{#!highlight make CC = gcc AS = as LD = ld OBJECTS = main.o suma.o CFLAGS = -Wall -g -c ASFLAGS = -g LDFLAGS = -g suma.elf: $(OBJECTS) $(CC) $(LDFLAGS) $(OBJECTS) -o suma.elf suma.o: suma.s $(AS) $(ASFLAGS) suma.s -o suma.o main.o: main.c $(CC) $(CFLAGS) main.c clean: rm *.o *.elf }}}