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:
-
Encontrar el segundo número más grande (distinto del mayor si hay duplicados).
-
Mostrar todo el arreglo actual.
-
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
-
Muestra el menú
-
Lee la opción
-
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