GNU/Linux xterm-256color zsh 140 views

.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