GNU/Linux xterm-256color zsh 143 views

.global _start

.section .bss
input:  .skip 128         // Buffer para entrada (hasta 10 números)
buffer: .skip 32          // Buffer para impresión

.section .text
_start:
    // Leer línea desde teclado
    mov x0, #0            // STDIN
    ldr x1, =input
    mov x2, #128
    mov x8, #63           // syscall read
    svc 0

    // x0 contiene número de bytes leídos
    ldr x1, =input        // x1 = puntero al buffer
    mov x2, #0            // índice
    mov x3, #0            // acumulador suma
    mov x4, #0            // acumulador temporal de número
    mov x9, #10           // constante base 10

parse_loop:
    ldrb w5, [x1, x2]     // Leer byte actual
    cmp w5, #10           // '\n' = fin de entrada
    beq agregar_num       // al final, guarda último número
    cmp w5, #' '          // espacio = fin de un número
    beq agregar_num

    // Convertir carácter ASCII a dígito
    sub w5, w5, #'0'
    uxtw x6, w5
    mul x4, x4, x9        // x4 = x4 * 10
    add x4, x4, x6        // x4 += dígito
    add x2, x2, #1
    b parse_loop

agregar_num:
    add x3, x3, x4        // suma += número actual
    mov x4, #0            // reiniciar número temporal
    add x2, x2, #1        // avanzar después de espacio o \n
    cmp w5, #10
    beq imprimir_resultado
    b parse_loop

// Convertir x3 (suma) a texto y mostrar
imprimir_resultado:
    mov x7, x3
    ldr x5, =buffer
    add x5, x5, #31       // apuntar al final
    mov x2, #0
    mov x9, #10

conv_loop:
    udiv x6, x7, x9
    mul x8, x6, x9
    sub x4, x7, x8
    add x4, x4, #'0'
    strb w4, [x5]
    sub x5, x5, #1
    add x2, x2, #1
    mov x7, x6
    cmp x7, #0
    bne conv_loop

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

    // syscall write(STDOUT, buffer, len)
    mov x0, #1
    mov x1, x5
    mov x8, #64
    svc 0

    // syscall exit
    mov x0, #0
    mov x8, #93
    svc 0