GNU/Linux xterm-256color bash 226 views

// ****************************************************************************
// * Lenguajes de Interfaz en TECNM Campus ITT
// * Nombre del archivo: practica.s
// * Descripción: Programa que cuenta hasta el numero que el usuario ingrese
// * Autor: [America Fernanda Nevarez de la Cruz]
// * Fecha: [2025-04-10]
// * Plataforma: Raspberry Pi OS (64 bits)
// * Demostración:  [https://asciinema.org/a/xrXu7JpCTe4cbNFa1SN3q486c]
// ****************************************************************************

// ****************************************************************************
// * Codigo equivalente en C#

// *using System;
// *
// *class ContadorNumerico
// *{
// *    static void Main()
// *    {
// *        Console.Write("// *Ingrese un número entero positivo: ");
// *        
// *        if (int.TryParse(Console.ReadLine(), out int numero) && numero > 0)
// *        {
// *            Console.WriteLine("// *Contando:");
// *            for (int i = 1; i <= numero; i++)
// *            {
// *                Console.WriteLine($"// *{i}");
// *            }
// *        }
// *        else
// *        {
// *            Console.WriteLine("// *Error: Debe ingresar un número entero positivo");
// *        }
// *    }
// *}

// ****************************************************************************
.section .bss
buffer: .skip 64

.section .data
msg_ingrese: .ascii "Ingrese un numero: "
len_ingrese = . - msg_ingrese
nl: .ascii "\n"

.section .text
.global _start

_start:
    // Mostrar mensaje
    ldr x0, =msg_ingrese
    mov x1, #len_ingrese
    bl print_msg

    // Leer entrada
    mov x0, #0
    ldr x1, =buffer
    mov x2, #64
    mov x8, #63
    svc #0

    // Convertir a entero
    ldr x1, =buffer
    mov x2, #0
parse_loop:
    ldrb w3, [x1], #1
    cmp w3, #'0'
    blt fin_parse
    cmp w3, #'9'
    bgt fin_parse
    sub w3, w3, #'0'
    mov x4, #10
    mul x2, x2, x4
    add x2, x2, x3
    b parse_loop
fin_parse:
    // x2 = número ingresado
    mov x20, #1          // contador comienza en 1
    mov x21, x2          // límite superior

cuenta_arriba:
    // Imprimir número actual
    mov x0, x20
    bl print_number

    // Imprimir salto de línea
    ldr x0, =nl
    mov x1, #1
    bl print_msg

    // Incrementar contador
    add x20, x20, #1
    cmp x20, x21
    ble cuenta_arriba

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

// --- Función: imprimir texto ---
print_msg:
    mov x2, x1
    mov x1, x0
    mov x0, #1
    mov x8, #64
    svc #0
    ret

// --- Función: imprimir número ---
print_number:
    mov x1, x0
    ldr x2, =buffer
    add x2, x2, #63
    mov w3, #0
convert_loop:
    mov x4, #10
    udiv x5, x1, x4
    msub x6, x5, x4, x1
    add x6, x6, #'0'
    strb w6, [x2], #-1
    mov x1, x5
    add w3, w3, #1
    cbnz x1, convert_loop
    add x2, x2, #1
    mov x1, x2
    mov w2, w3
    mov x0, #1
    mov x8, #64
    svc #0
    ret