.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