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:
Nivel de abstracción: En C, el nivel de abstracción es alto, permitiendo al programador concentrarse más en la lógica del problema que en los detalles específicos del hardware. En ensamblador, el programador debe manejar explícitamente registros y operaciones específicas del procesador.
Sintaxis: C ofrece una sintaxis más fácil de entender y escribir para aquellos familiarizados con los lenguajes de alto nivel. En ensamblador, cada instrucción debe ser detallada y específica, lo que requiere un conocimiento más profundo del hardware.
Eficiencia: El código en ensamblador puede ser más eficiente y rápido, ya que permite un control más directo del hardware. Sin embargo, esto también significa que el programador debe optimizar manualmente el código, mientras que en C, el compilador realiza muchas optimizaciones automáticamente.
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.
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:
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: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).
Compilación en Arm32
Debugger del ASM
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.