GNU/Linux xterm bash 139 views

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?

  1. Pide al usuario que ingrese varios números (uno por uno).
  2. Guarda esos números en un arreglo (array).
  3. Si el usuario ingresa 0, se termina la entrada.
  4. Invierte el arreglo en memoria (el primero con el último, etc).
  5. Muestra el arreglo ya invertido.
  6. 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

  1. Muestra “Ingrese un número:”
  2. 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
  3. Si es 0, termina el ciclo:
    cbz w23, fin_ingreso
  4. 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