GNU/Linux xterm-256color bash 142 views

.section .data
buffer:     .skip 16              // buffer para almacenar el resultado como string

.section .text
.global _start

_start:
    mov x19, #1                  // i = 1
    mov x20, #0                  // suma = 0

loop:
    add x20, x20, x19            // suma += i
    add x19, x19, #1             // i++
    cmp x19, #21                 // ¿i <= 20?
    blt loop

    // Convertir suma a string
    mov x0, x20                  // número a convertir
    ldr x1, =buffer
    bl itoa

    // Escribir resultado a stdout
    mov x0, #1                   // STDOUT
    ldr x1, =buffer              // string a imprimir
    bl strlen                   // obtener longitud
    mov x2, x0
    mov x0, #1                   // STDOUT
    mov x8, #64                  // syscall write
    svc 0

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

// ---------- strlen ----------
strlen:
    // Entrada: x1 = ptr string
    // Salida: x0 = longitud
    mov x2, x1
.strlen_loop:
    ldrb w3, [x2], #1
    cmp w3, #0
    b.ne .strlen_loop
    sub x0, x2, x1
    ret

// ---------- itoa ----------
itoa:
    // Entrada: x0 = número, x1 = buffer
    // Salida: buffer con número como string (terminado en \n y \0)
    mov x2, x0
    mov x3, x1
    add x4, x1, #12             // posición final
    mov x5, #10
    strb w5, [x4]               // '\n'
    mov x5, #0
    strb w5, [x4, #1]           // '\0'
    mov x6, x4

.itoa_loop:
    mov x5, #10
    udiv x0, x2, x5
    msub x5, x0, x5, x2        // x5 = x2 - (x0*10) = x2 % 10
    add x5, x5, #'0'           // convertir a ASCII
    sub x6, x6, #1
    strb w5, [x6]
    mov x2, x0
    cbnz x2, .itoa_loop

.copy_loop:
    ldrb w5, [x6], #1
    strb w5, [x1], #1
    cmp w5, #0
    b.ne .copy_loop
    ret