GNU/Linux xterm-256color bash 145 views

/*
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