GNU/Linux xterm bash 146 views

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?

  1. Muestra un menú al usuario:
    • 1: Calcular MCM
    • 2: Salir
  2. Si se elige la opción 1, pide dos números enteros positivos.
  3. Calcula el MCD usando el algoritmo de Euclides.
  4. Usa la fórmula:
    [ \text{MCM}(a, b) = \frac{a \cdot b}{\text{MCD}(a, b)} ]
  5. 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

  1. Muestra el menú y lee la opción.
  2. Si es 2, va a fin_programa.
  3. 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, ad = 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.