Este código ARM64 está diseñado para calcular el Mínimo Común Múltiplo (MCM) de dos números utilizando el Máximo Común Divisor (MCD). El código es una excelente práctica para estudiantes que vienen de C o C# y quieren entender cómo se hace esto “a mano” en bajo nivel.
Vamos a desglosarlo paso a paso, en español bien claro:
🧠 ¿Qué hace este programa?
-
Muestra un menú al usuario:
-
Si se elige la opción
1, pide dos números enteros positivos.
-
Calcula el MCD usando el algoritmo de Euclides.
-
Usa la fórmula:
[
\text{MCM}(a, b) = \frac{a \cdot b}{\text{MCD}(a, b)}
]
-
Muestra el resultado y vuelve al menú.
🗃️ .data – Mensajes y variables
msg_menu: "Cálculo de MCM\n1. Calcular MCM\n2. Salir..."
msg_num1: "Ingrese el primer número: "
msg_num2: "Ingrese el segundo número: "
msg_mcm: "El MCM es: %d\n"
formato_int: "%d"
opcion: opción del menú (1 o 2)
numero1: primer número ingresado
numero2: segundo número ingresado
🧭 .text – Lógica principal
🎬 main
stp x29, x30, [sp, -16]!
mov x29, sp
Guarda el frame pointer y link register.
🔁 menu_loop
-
Muestra el menú y lee la opción.
-
Si es
2, va a fin_programa.
-
Si es
1, pide los dos números y va a calcular_mcm.
📥 Entrada de los dos números
Usa printf y scanf para cada número, luego los guarda en:
ldr w19, [numero1]
ldr w20, [numero2]
🧮 calcular_mcm – Calcula el MCD primero
Guarda los valores originales para usarlos en el cálculo final:
mov w21, w19 ; copia del número 1 (a)
mov w22, w20 ; copia del número 2 (b)
🔁 mcm_mcd_loop – Algoritmo de Euclides
Este bloque hace lo mismo que:
while (b != 0) {
r = a % b;
a = b;
b = r;
}
En ensamblador ARM64:
cmp w20, #0
b.eq calcular_mcm_final
sdiv w23, w19, w20
msub w23, w23, w20, w19
mov w19, w20
mov w20, w23
b mcm_mcd_loop
🧠 msub d, n, m, a → d = a - (n * m) → se usa para hacer el módulo (a % b).
🧮 calcular_mcm_final
Cuando el bucle termina, w19 contiene el MCD.
El MCM se calcula como:
mul w20, w21, w22 ; w20 = a * b
sdiv w20, w20, w19 ; w20 = (a * b) / MCD
🖨️ mostrar_mcm
mov w1, w20 ; resultado del MCM
adr x0, msg_mcm
bl printf
Y vuelve al menú.
🛑 fin_programa
ldp x29, x30, [sp], 16
ret
Finaliza limpiamente.