GNU/Linux xterm-256color zsh 176 views

.global _start

.section .data
primos:  .quad 2, 3, 5, 7, 11, 13, 17, 19, 23, 29

.section .bss
buffer:  .skip 32         // buffer para imprimir el resultado

.section .text
_start:
    mov x0, #1            // x0 = producto = 1
    ldr x1, =primos       // x1 = dirección del arreglo
    mov x2, #0            // índice

loop:
    cmp x2, #10
    beq fin_calculo
    ldr x3, [x1, x2, lsl #3]  // x3 = primos[x2], escala por 8 bytes
    mul x0, x0, x3        // producto *= primo
    add x2, x2, #1
    b loop

fin_calculo:
    // x0 contiene el producto, vamos a imprimirlo
    mov x7, x0            // guardar valor a imprimir en x7
    bl imprimir_numero

    // salir
    mov x0, #0
    mov x8, #93
    svc 0

// ------------------------------
// imprimir_numero (x7)
// Convierte x7 a cadena decimal y la imprime usando syscall write
// ------------------------------
imprimir_numero:
    ldr x5, =buffer
    add x5, x5, #31       // apuntar al final del buffer
    mov x2, #0            // longitud
    mov x10, x7           // copia del número
    mov x9, #10

print_loop:
    udiv x7, x10, x9
    mul x8, x7, x9
    sub x4, x10, x8       // x4 = dígito
    add x4, x4, #'0'
    strb w4, [x5]
    sub x5, x5, #1
    add x2, x2, #1
    mov x10, x7
    cmp x10, #0
    bne print_loop

    add x5, x5, #1
    mov w3, #'\n'
    strb w3, [x5, x2]
    add x2, x2, #1

    // syscall write(fd=1, buf, len)
    mov x0, #1
    mov x1, x5
    mov x8, #64
    svc 0
    ret