GNU/Linux xterm bash 134 views

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?

  1. Muestra un mensaje y permite al usuario ingresar números.
  2. Guarda esos números en un arreglo de 100 elementos como máximo.
  3. El ingreso termina cuando el usuario escribe 0.
  4. Si el arreglo no está vacío, suma todos los elementos.
  5. Muestra el resultado.
  6. 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

  1. Muestra “Ingrese un número:”

  2. Usa scanf para leer un entero:

    sub sp, sp, #16
    mov x1, sp
    bl scanf
    ldr w23, [sp]
    add sp, sp, #16
  3. Si el usuario ingresó 0, salta a fin_ingreso:

    cbz w23, fin_ingreso
  4. 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

  1. Guarda el tamaño del arreglo:

    str w22, [tam_array]
  2. 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