tectijuana / interfaz

Lenguajes de Interfaz para ISC
GNU General Public License v3.0
29 stars 46 forks source link

2.1.5 Programación trabajando con variables C y ARM32 #27

Open IoTeacher opened 3 months ago

IoTeacher commented 3 months ago

Image

Sea un problema básico que les permita comparar C y ensamblador, incluyendo sus compiladores, podemos plantearles el siguiente ejercicio que implica la suma de dos números. Este ejercicio se presenta primero en C y luego en ensamblador ARM32 para una Raspberry Pi, lo que permitirá a los estudiantes ver la diferencia en términos de sintaxis, nivel de abstracción y eficiencia entre ambos lenguajes.

Ejercicio: Suma de dos números

En C:

#include <stdio.h>

int main() {
    int a = 5;
    int b = 10;
    int suma = a + b;
    printf("La suma es: %d\n", suma);
    return 0;
}

NOTA: Obviamente es un ejemplo extendido para asimilar los pasos de ensamblador..

En Ensamblador ARM32 para Raspberry Pi:

Para el ensamblador, asumiendo que los estudiantes están trabajando en una Raspberry Pi y utilizando el editor nano en la terminal o similar, el código podría ser:

.section .data
a: .word 5
b: .word 10
resultMessage: .asciz "La suma es: "
digit: .asciz "0"

.section .text
.global main

main:
    LDR R0, =a
    LDR R1, [R0]
    LDR R0, =b
    LDR R2, [R0]
    ADD R3, R1, R2   @ R3 tiene el resultado de la suma

    @ Convertir el resultado a ASCII (solo funciona para números de 1 dígito)
    ADD R3, R3, #48   @ Convertir el dígito a ASCII sumando 48

    @ Preparar para imprimir el mensaje
    LDR R0, =resultMessage
    LDR R1, =digit
    STRB R3, [R1]  @ Guardar el dígito convertido a ASCII en 'digit'

    @ Imprimir mensaje
    MOV R0, #1    @ stdout
    LDR R1, =resultMessage
    MOV R2, #13   @ longitud del mensaje "La suma es: "
    MOV R7, #4    @ syscall para write
    SWI 0

    @ Imprimir dígito
    MOV R0, #1    @ stdout
    MOV R2, #1    @ longitud del dígito
    SWI 0

    @ Salir
    MOV R7, #1    @ syscall para exit
    SWI 0

Compiación en C: Este comando le dice a GCC que compile suma.c y genere un archivo ejecutable llamado programa (el flag -o se usa para especificar el nombre del archivo de salida).

gcc sumac.c -o sumac
./sumac

Compilación en Arm32

as -o sumae.o suma.s
ld -o sumae sumae.o
./sumae

Debugger del ASM

gef sumae
.... start
...(stepi) ver siguiente linea

Explicación y comparación:

Este ejercicio muestra diferencias entre escribir código en C y ensamblador, pero también les introduce al proceso de compilación y ejecución en ambos lenguajes, ofreciendo una comprensión más profunda de cómo el código de alto nivel es traducido a instrucciones que el procesador puede entender.

Image

IoTeacher commented 3 months ago

ejecutar C# un programa consola (hola mundo, etc) y compilarlo en RISC ARM 32/64 bits

Instalar http://termius.com/education en su smartphone

Image