.global _start
.section .bss
input: .skip 20 // Buffer para lectura del número
buffer: .skip 20 // Buffer para impresión del resultado
.section .text
_start:
// --- Leer número desde teclado ---
mov x0, #0 // STDIN
ldr x1, =input // Puntero al buffer de entrada
mov x2, #20 // Bytes a leer
mov x8, #63 // syscall read
svc 0 // Ejecutar syscall
// x0 contiene la cantidad de bytes leídos (con '\n' al final)
ldr x1, =input // x1 = puntero al buffer
mov x2, #0 // x2 = índice
mov x3, #0 // x3 = suma acumulada
sumar_digitos:
ldrb w4, [x1, x2] // Cargar byte input[x2] → w4
cmp w4, #10 // ¿Es '\n'?
beq imprimir_resultado
sub w4, w4, #'0' // Convertir ASCII a número
uxtw x4, w4 // Asegurar extensión a 64 bits
add x3, x3, x4 // Acumular suma
add x2, x2, #1 // Avanzar índice
b sumar_digitos
// -------------------------------------------
// Convertir x3 (suma) a texto e imprimirlo
// -------------------------------------------
imprimir_resultado:
ldr x5, =buffer
add x5, x5, #19 // Apuntar al final del buffer
mov x2, #0 // Longitud del string
mov x7, x3 // Valor a convertir
mov x9, #10 // Constante 10
convertir_a_texto:
udiv x6, x7, x9 // x6 = x7 / 10
mul x8, x6, x9 // x8 = (x7 / 10) * 10
sub x4, x7, x8 // x4 = x7 % 10
add x4, x4, #'0' // Convertir a ASCII
strb w4, [x5]
sub x5, x5, #1
add x2, x2, #1
mov x7, x6 // x7 = cociente
cmp x7, #0
bne convertir_a_texto
add x5, x5, #1 // x5 apunta al primer dígito
// Agregar '\n' al final
mov w3, #'\n'
strb w3, [x5, x2]
add x2, x2, #1
// syscall write(fd=1, buffer, length)
mov x0, #1 // STDOUT
mov x1, x5 // Dirección del texto
mov x8, #64 // syscall write
svc 0
// Salida limpia
mov x0, #0
mov x8, #93
svc 0