Este código ARM64 para Raspberry Pi OS es una práctica excelente para aprender cómo trabajar con:
-
Arreglos en memoria
-
Entrada de números desde consola
-
Estructuras de control
-
Sumatoria de datos
-
Validación de condiciones
Vamos a explicarlo paso a paso en español claro, como si estuvieras en clase. 🌟
🧠 ¿Qué hace este programa?
-
Muestra un mensaje y permite al usuario ingresar números.
-
Guarda esos números en un arreglo de 100 elementos como máximo.
-
El ingreso termina cuando el usuario escribe 0.
-
Si el arreglo no está vacío, suma todos los elementos.
-
Muestra el resultado.
-
Si no se ingresó ningún número, muestra un mensaje de que el arreglo está vacío.
📦 .data – Variables y textos
msg_ingreso: "Ingrese los números... (0 para terminar)"
msg_pedir_numero: "Ingrese un número: "
msg_array_vacio: "El arreglo está vacío.\n"
msg_resultado: "Resultado de la suma: %d\n"
formato_int: "%d"
array: .zero 400 ; 100 enteros × 4 bytes = 400 bytes
tam_array: .word 0 ; Guarda el tamaño real del arreglo
🔁 main – Ciclo principal
stp x29, x30, [sp, -16]! ; Guardamos frame pointer y link register
mov x29, sp
Luego muestra el mensaje de inicio:
adr x0, msg_ingreso
bl printf
📥 Ingreso de números
adr x20, array ; puntero base del arreglo
adr x21, tam_array ; dirección del contador de elementos
mov w22, #0 ; índice actual del arreglo
🔁 ingresar_numeros: loop
-
Muestra “Ingrese un número:”
-
Usa scanf para leer un entero:
sub sp, sp, #16
mov x1, sp
bl scanf
ldr w23, [sp]
add sp, sp, #16
-
Si el usuario ingresó 0, salta a fin_ingreso:
cbz w23, fin_ingreso
-
Si no, lo guarda en el arreglo:
str w23, [x20, w22, SXTW #2]
add w22, w22, #1
Vuelve a pedir otro número.
🧮 fin_ingreso
-
Guarda el tamaño del arreglo:
str w22, [tam_array]
-
Si no se ingresó ningún número:
cbz w22, array_vacio
🔢 suma_loop: sumar los elementos
mov w24, #0 ; acumulador de suma
mov w25, #0 ; índice del arreglo
Loop de suma:
ldr w26, [x20, w25, SXTW #2] ; carga el número
add w24, w24, w26 ; suma al acumulador
add w25, w25, #1 ; siguiente índice
cmp w25, w22
b.lt suma_loop ; repetir si no termina
🖨️ Mostrar resultado
adr x0, msg_resultado
mov w1, w24
bl printf
❌ array_vacio
Si no se ingresó nada:
adr x0, msg_array_vacio
bl printf
🛑 fin_programa
Termina el programa limpiamente:
ldp x29, x30, [sp], 16
ret