.section .data
buf1: .skip 16
buf2: .skip 16
buf3: .skip 16
msg1: .asciz "MCD(84, 120) = "
msg2: .asciz "MCD(12, 36) = "
msg3: .asciz "Resultado final: "
newline: .asciz "\n"
.section .text
.global _start
_start:
// Inicializar los tres números
mov w10, #84 // a
mov w11, #120 // b
mov w12, #36 // c
// ------ Paso 1: MCD(84, 120) ------
mov w0, w10 // w0 = 84
mov w1, w11 // w1 = 120
bl gcd // w0 = gcd(84, 120)
mov w13, w0 // Guardamos resultado = 12
// Imprimir mensaje: "MCD(84, 120) = "
ldr x1, =msg1
bl strlen
mov x2, x0
mov x0, #1
mov x8, #64
svc 0
// Mostrar resultado (12)
ldr x1, =buf1
mov w0, w13
bl itoa
mov x0, #1
ldr x1, =buf1
bl strlen
mov x2, x0
mov x0, #1
mov x8, #64
svc 0
// Salto de línea
ldr x1, =newline
bl strlen
mov x2, x0
mov x0, #1
mov x8, #64
svc 0
// ------ Paso 2: MCD(12, 36) ------
mov w0, w13 // resultado anterior (12)
mov w1, w12 // siguiente número (36)
bl gcd // w0 = gcd(12, 36)
mov w14, w0 // resultado final
// Imprimir mensaje: "MCD(12, 36) = "
ldr x1, =msg2
bl strlen
mov x2, x0
mov x0, #1
mov x8, #64
svc 0
// Mostrar resultado (12)
ldr x1, =buf2
mov w0, w14
bl itoa
mov x0, #1
ldr x1, =buf2
bl strlen
mov x2, x0
mov x0, #1
mov x8, #64
svc 0
// Salto de línea
ldr x1, =newline
bl strlen
mov x2, x0
mov x0, #1
mov x8, #64
svc 0
// ------ Mostrar resultado final ------
ldr x1, =msg3
bl strlen
mov x2, x0
mov x0, #1
mov x8, #64
svc 0
// Mostrar resultado final
ldr x1, =buf3
mov w0, w14
bl itoa
mov x0, #1
ldr x1, =buf3
bl strlen
mov x2, x0
mov x0, #1
mov x8, #64
svc 0
// Salto de línea final
ldr x1, =newline
bl strlen
mov x2, x0
mov x0, #1
mov x8, #64
svc 0
// Salida
mov x8, #93
mov x0, #0
svc 0
// ------ GCD Euclides: gcd(w0, w1) ------
gcd:
// w0 = a, w1 = b
.loop:
cmp w1, #0
beq .done
udiv w2, w0, w1 // q = a / b
msub w3, w2, w1, w0 // r = a - q*b = a % b
mov w0, w1
mov w1, w3
b .loop
.done:
ret
// ------ strlen ------
strlen:
mov x2, x1
.loop_strlen:
ldrb w3, [x2], #1
cmp w3, #0
b.ne .loop_strlen
sub x0, x2, x1
ret
// ------ itoa ------
itoa:
mov x2, x0
mov x3, x1
add x4, x1, #10
mov x5, #0
strb w5, [x4]
mov x6, x4
.itoa_loop:
mov x5, #10
udiv x0, x2, x5
msub x5, x0, x5, x2
add x5, x5, #'0'
sub x6, x6, #1
strb w5, [x6]
mov x2, x0
cbnz x2, .itoa_loop
.copy:
ldrb w5, [x6], #1
strb w5, [x1], #1
cmp w5, #0
b.ne .copy
ret