GNU/Linux xterm bash 136 views

Este código ARM64 es una práctica súper útil para entender cómo recorrer arreglos, comparar elementos, y realizar lógica condicional compleja (como encontrar el segundo número más grande). Lo explicaremos paso a paso en español amigable y claro. 🌟


🧠 ¿Qué hace este programa?

Este programa trabaja con un arreglo fijo de 10 enteros, y te da tres opciones:

  1. Encontrar el segundo número más grande (distinto del mayor si hay duplicados).
  2. Mostrar todo el arreglo actual.
  3. Salir del programa.

Ejemplo de arreglo:
{12, 35, 1, 10, 34, 1, 35, 8, 23, 19}


🗃️ .data – Variables y cadenas

msg_menu:       Menú con opciones
msg_array:      "Arreglo actual: "
msg_max:        "El elemento más grande es: %d\n"
msg_second:     "El segundo elemento más grande es: %d\n"
msg_error:      "No existe segundo máximo (todos iguales)"
formato_int:    "%d"

array:          10 números enteros ya definidos
array_size:     10
opcion:         almacena opción del menú
max_num:        mayor número encontrado
second_max:     segundo mayor número encontrado

🔁 main y menu_loop

  1. Muestra el menú
  2. Lee la opción
  3. Salta a:
    • encontrar_segundo si opción 1
    • mostrar_arreglo si opción 2
    • fin_programa si opción 3

🧮 encontrar_segundo: lógica principal

🔹 Inicializa

adr x20, array        ; dirección del arreglo
ldr w21, [array_size] ; tamaño
ldr w22, [x20]        ; max_num = array[0]
mov w23, w22          ; second_max = array[0]
mov w24, #1           ; empezamos en índice 1

🔁 encontrar_max_loop: recorre arreglo

ldr w25, [x20, w24, SXTW #2]  ; carga el elemento actual

Ahora comparamos:

Si el elemento actual es mayor al máximo:

cmp w25, w22
b.le no_es_max        ; si no lo es, saltamos
mov w23, w22          ; el actual máximo se convierte en segundo
mov w22, w25          ; actualizamos máximo

Si no es mayor al máximo, pero es mayor al segundo mayor (y diferente al máximo):

cmp w25, w23
b.le continuar_max
cmp w25, w22
b.eq continuar_max
mov w23, w25          ; actualizar second_max

✅ Resultado final

Una vez recorrido el arreglo completo, verificamos si max == second_max, lo cual significa que todos los números eran iguales o no había un segundo distinto:

cmp w22, w23
b.eq no_segundo_max

Si todo bien:

printf("El más grande es: %d", w22)
printf("El segundo más grande es: %d", w23)

📦 mostrar_arreglo

Este bloque simplemente recorre el arreglo e imprime sus valores uno a uno:

ldr w1, [x20, w22, SXTW #2]   ; carga cada valor
bl printf                     ; imprime con "%d "

🛑 fin_programa

Termina con:

ldp x29, x30, [sp], 16
ret