/*
Autor: Victor Manuel Madrid Lugo
Fecha: 08/04/2025
Descripción: Calcula la suma de los primeros 10 números naturales (1+2+3+...+10)
Demostración: [https://asciinema.org/a/ICoMZuBSEypQhS5Z6tY9xSsiE]
Equivalente en Go:
package main
import "fmt"
func main() {
suma := 0
for i := 1; i <= 10; i++ {
suma += i
}
fmt.Printf("La suma de los primeros 10 números naturales es: %d\n", suma)
}
*/
.section .data
msg_resultado: .asciz "La suma de los primeros 10 números naturales es: "
len_msg = . - msg_resultado - 1 // Calcular longitud exacta del mensaje
newline: .asciz "\n"
buffer: .skip 21
.section .text
.global _start
_start:
// Calcular suma (1+2+...+10)
mov x19, #0 // Inicializar acumulador
mov x20, #1 // Contador desde 1
suma_loop:
add x19, x19, x20 // sum += i
add x20, x20, #1 // i++
cmp x20, #10 // Comparar con 10
ble suma_loop // Continuar si i <= 10
// Convertir resultado a string
ldr x0, =buffer
mov x1, x19
bl int_to_str
mov x21, x0 // Guardar longitud del número
// Imprimir mensaje completo
mov x0, #1 // stdout
ldr x1, =msg_resultado
mov x2, #len_msg // Usar longitud calculada
mov x8, #64 // syscall write
svc #0
// Imprimir número
mov x0, #1
ldr x1, =buffer
mov x2, x21 // Longitud devuelta por int_to_str
mov x8, #64
svc #0
// Imprimir newline
mov x0, #1
ldr x1, =newline
mov x2, #1
mov x8, #64
svc #0
// Exit
mov x0, #0
mov x8, #93
svc #0
// Función int_to_str mejorada
int_to_str:
mov x2, #10
mov x3, #0 // Contador dígitos
mov x4, x0 // Guardar dirección buffer
// Manejar 0
cbz x1, handle_zero
// Convertir dígitos
convert_loop:
udiv x5, x1, x2 // x5 = x1 / 10
msub x6, x5, x2, x1 // x6 = x1 % 10
add x6, x6, #'0'
strb w6, [x4, x3]
add x3, x3, #1
mov x1, x5
cbnz x1, convert_loop
// Invertir dígitos
mov x5, #0 // inicio
sub x6, x3, #1 // fin
reverse_loop:
cmp x5, x6
b.ge done
ldrb w7, [x4, x5]
ldrb w8, [x4, x6]
strb w8, [x4, x5]
strb w7, [x4, x6]
add x5, x5, #1
sub x6, x6, #1
b reverse_loop
handle_zero:
mov w5, #'0'
strb w5, [x4]
mov x0, #1
ret
done:
mov x0, x3 // devolver longitud
ret