Este código ARM64 para Raspberry Pi OS o Ubuntu ARM64 implementa el cálculo del Máximo Común Divisor (MCD) usando el famoso algoritmo de Euclides. Vamos paso por paso, con explicaciones al estilo de un profe que quiere que le entiendas de verdad.
🧠 ¿Qué hace este programa?
-
Muestra un menú:
-
Si el usuario elige 1, pide dos números enteros
-
Calcula el MCD usando el algoritmo de Euclides
-
Muestra el resultado
-
Vuelve al menú
📦 .data – Variables y textos
msg_menu: "1. Calcular MCD\n2. Salir\nSeleccione una opción: "
msg_num1: "Ingrese el primer número: "
msg_num2: "Ingrese el segundo número: "
msg_mcd: "El MCD es: %d\n"
formato_int: "%d"
opcion: variable para guardar la opción del usuario
numero1: primer número ingresado
numero2: segundo número ingresado
🧭 Sección .text – Lógica principal
🎬 main – Preparación
stp x29, x30, [sp, -16]!
mov x29, sp
Guarda el estado del stack frame.
🔁 menu_loop – Ciclo del menú
-
Imprime menú
-
Lee la opción
-
Si es
2, termina el programa
-
Si es
1, pide dos números y entra a la función de cálculo
🧮 Lectura de los dos números
printf "Ingrese número 1"
scanf → guarda en `numero1`
printf "Ingrese número 2"
scanf → guarda en `numero2`
Luego los carga en registros para procesarlos:
ldr w19, [numero1]
ldr w20, [numero2]
🧩 calcular_mcd – Algoritmo de Euclides
Este bloque usa el algoritmo clásico de Euclides, que es:
while (b != 0) {
r = a % b;
a = b;
b = r;
}
return a;
En ensamblador:
cmp w20, #0
b.eq mostrar_mcd ; si el divisor (b) es 0, terminamos
División y residuo manual:
sdiv w23, w19, w20 ; w23 = cociente (a / b)
msub w23, w23, w20, w19 ; residuo = a - (cociente * b)
🔧 msub d, n, m, a = d = a - (n * m)
Luego actualiza:
mov w19, w20 ; a = b
mov w20, w23 ; b = residuo
Y vuelve al bucle mcd_loop.
✅ mostrar_mcd
El resultado final queda en w19, se imprime así:
mov w1, w19
adr x0, msg_mcd
bl printf
🛑 fin_programa
Sale limpiamente:
ldp x29, x30, [sp], 16
ret