UntitledWiki: WebHome/TrabajosPracticos/EjemploC

Ejemplo de proyecto en lenguale C y ensamblador

Se muestra un ejemplo de proyecto que incluye archivos fuentes en lenguaje C y en ensablador. El programa realiza la suma de dos valores enteros inicializados en el código fuente que es devuelto por la función main().

Código en lenguaje C

   1 #include <stdio.h>
   2 
   3 extern int suma(int a, int b);
   4 
   5 int main(void)
   6 {
   7   int a = 71;
   8   int b = 29;
   9   int c;
  10 
  11   c = suma(a,b);
  12 
  13   return c;
  14 } 

Código en lenguaje ensamblador

   1 .text
   2 .arm
   3 .global suma
   4 
   5 suma:
   6   add   r2, r0, r1
   7   mov   r0, r2                    
   8   mov   pc, lr  

Construcción para simulación

   1 arm-none-eabi-gcc -Wall -mcpu=arm7tdmi -g -c main.c -o main.o
   2 arm-none-eabi-as -mcpu=arm7tdmi -g suma.s -o suma.o
   3 arm-none-eabi-gcc -Ttext=0 -nostartfiles -g main.o suma.o -o suma.elf
   4 
  • 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 indiar 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

   1 CC = arm-none-eabi-gcc
   2 AS = arm-none-eabi-as
   3 LD = arm-none-eabi-ld
   4 
   5 OBJECTS = main.o suma.o
   6 
   7 CFLAGS = -Wall -mcpu=arm7tdmi -g  -c
   8 ASFLAGS = -mcpu=arm7tdmi -g 
   9 LDFLAGS = -Ttext=0 -nostartfiles -g 
  10 
  11 suma.elf: $(OBJECTS)
  12         $(CC) $(LDFLAGS) $(OBJECTS) -o suma.elf
  13 
  14 suma.o: suma.s 
  15         $(AS) $(ASFLAGS) suma.s -o suma.o
  16 
  17 main.o: main.c
  18         $(CC) $(CFLAGS) main.c
  19 
  20 clean:
  21         rm *.o *.elf 

Archivo Makefile para la compilación sobre la RPi

   1 CC = gcc
   2 AS = as
   3 LD = ld
   4 
   5 OBJECTS = main.o suma.o
   6 
   7 CFLAGS = -Wall -g  -c
   8 ASFLAGS = -g 
   9 LDFLAGS = -g 
  10 
  11 suma.elf: $(OBJECTS)
  12         $(CC) $(LDFLAGS) $(OBJECTS) -o suma.elf
  13 
  14 suma.o: suma.s 
  15         $(AS) $(ASFLAGS) suma.s -o suma.o
  16 
  17 main.o: main.c
  18         $(CC) $(CFLAGS) main.c
  19 
  20 clean:
  21         rm *.o *.elf 

UntitledWiki: WebHome/TrabajosPracticos/EjemploC (última edición 2019-09-06 13:47:47 efectuada por GuillermoSteiner)