.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