Este código ARM64 en Raspbian OS es una excelente práctica de manejo de arreglos, entrada de datos, inversión de arrays y estructuras de control. Vamos a desglosarlo paso a paso en español claro y didáctico, ideal si vienes de C o C#.
🧠 ¿Qué hace este programa?
-
Pide al usuario que ingrese varios números (uno por uno).
-
Guarda esos números en un arreglo (array).
-
Si el usuario ingresa
0, se termina la entrada.
-
Invierte el arreglo en memoria (el primero con el último, etc).
-
Muestra el arreglo ya invertido.
-
Si no se ingresó ningún número, muestra un mensaje de error.
🗃️ Sección .data: mensajes y variables
msg_ingreso: "Ingrese los números... (0 para terminar)"
msg_pedir_numero: "Ingrese un número: "
msg_array_vacio: "El arreglo está vacío."
msg_resultado: "Arreglo invertido: "
msg_numero: "%d "
msg_newline: "\n"
formato_int: "%d"
array: .zero 400 ; 100 enteros (4 bytes c/u)
tam_array: .word 0 ; Tamaño del arreglo (cuántos números se ingresaron)
🔁 Lógica principal (main)
stp x29, x30, [sp, -16]!
mov x29, sp
Guarda el estado del frame.
🧮 Ingreso de números
adr x20, array ; puntero base del arreglo
adr x21, tam_array ; puntero al contador de elementos
mov w22, #0 ; índice del arreglo
ingresar_numeros: ciclo de lectura
-
Muestra “Ingrese un número:”
-
Usa
scanf para leer un entero al stack: sub sp, sp, #16
mov x1, sp
bl scanf
ldr w23, [sp] ; carga el número leído
add sp, sp, #16
-
Si es
0, termina el ciclo: cbz w23, fin_ingreso
-
Si no, lo guarda en el arreglo:
str w23, [x20, w22, SXTW #2]
add w22, w22, #1
🧾 Fin del ingreso
Guarda el total de números ingresados:
str w22, [tam_array]
Si no se ingresó nada (w22 == 0), salta a:
array_vacio:
printf "El arreglo está vacío"
🔄 Invertir el arreglo en memoria
mov w24, #0 ; índice inicial
sub w25, w22, #1 ; índice final
invertir_loop: intercambia de ambos extremos hacia el centro
ldr w26, [x20, w24, SXTW #2] ; número izquierdo
ldr w27, [x20, w25, SXTW #2] ; número derecho
str w27, [x20, w24, SXTW #2] ; poner el derecho a la izquierda
str w26, [x20, w25, SXTW #2] ; poner el izquierdo a la derecha
add w24, w24, #1
sub w25, w25, #1
Se repite hasta que los índices se crucen (w24 >= w25).
🖨️ Mostrar arreglo invertido
adr x0, msg_resultado
bl printf
Usa un ciclo mostrar_loop: que recorre el arreglo desde 0 hasta tam_array - 1, imprimiendo uno por uno:
ldr w1, [x20, w24, SXTW #2]
adr x0, msg_numero
bl printf