⇤ ← Versión 1 con fecha 2019-09-06 13:47:47
Tamaño: 2943
Comentario:
|
Tamaño: 3441
Comentario:
|
Los textos eliminados se marcan así. | Los textos añadidos se marcan así. |
Línea 3: | Línea 3: |
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()'''. |
Se muestra un ejemplo de proyecto que incluye archivos fuentes en lenguaje C y en ensamblador.<<BR>> 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. |
Línea 6: | Línea 8: |
* Archivo '''.c''': ''"declara"''' 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 (por no encontrar la implementación de la función). * Archivo '''.s''': ''"define"'' la función '''suma''' |
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. |
Línea 40: | Línea 44: |
== Construcción para simulación == | == Construcción del proyector == |
Línea 48: | Línea 52: |
* 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` |
* 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''' |
Línea 53: | Línea 57: |
* `-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. |
* '''-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. |
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
Código en lenguaje ensamblador
Construcción del proyector
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
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