GNU/Linux xterm-256color zsh 130 views

.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