GNU/Linux xterm-256color bash 201 views

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

// ****************************************************************************
// * Codigo euivalente en C#
// *
// * Programa que genera tabla de dividir en C#
// * Formato con comentarios // * en cada línea
// *

// *using System;
// *
// *class TablaDeDividir
// *{
// *    static void Main(string[] args)
// *    {
// *        Console.WriteLine("// *Generador de Tablas de Dividir");
// *        Console.Write("// *Ingrese el número para la tabla: ");
// *        
// *        if (double.TryParse(Console.ReadLine(), out double numero))
// *        {
// *            Console.Write("// *Ingrese el límite de la tabla: ");
// *            if (int.TryParse(Console.ReadLine(), out int limite) && limite > 0)
// *            {
// *                Console.WriteLine($"// *Tabla de dividir del {numero}:");
// *                for (int i = 1; i <= limite; i++)
// *                {
// *                    double resultado = numero / i;
// *                    Console.WriteLine($"// *{numero} ÷ {i} = {resultado:F2}");
// *                }
// *            }
// *            else
// *            {
// *                Console.WriteLine("// *Error: Límite debe ser un entero positivo");
// *            }
// *        }
// *        else
// *        {
// *            Console.WriteLine("// *Error: Ingrese un número válido");
// *        }
// *    }
// *}
// ****************************************************************************
.data
    msg_prompt:     .asciz "¿Cuántos valores quieres en la tabla de dividir 100? "
    len_prompt = . - msg_prompt

    msg_label:      .asciz "100 / "
    len_label = . - msg_label

    msg_equal:      .asciz " = "
    len_equal = . - msg_equal

    msg_newline:    .asciz "\n"
    len_newline = . - msg_newline

    buffer:         .fill 32, 1, 0

.text
    .global _start
    .align 2

_start:
    // Mostrar prompt
    mov x0, #1
    adr x1, msg_prompt
    mov x2, len_prompt
    mov x8, #64
    svc #0

    // Leer entrada del usuario
    mov x0, #0
    adr x1, buffer
    mov x2, #12
    mov x8, #63
    svc #0

    // Convertir ASCII a número
    mov x19, #0
    adr x20, buffer
    mov x21, #10

convert_loop:
    ldrb w22, [x20], #1
    cmp w22, #0xA
    beq convert_done
    sub w22, w22, #'0'
    madd x19, x19, x21, x22
    b convert_loop

convert_done:
    mov x23, #1        // Divisor actual

loop_tabla:
    cmp x23, x19
    bgt exit_program

    // Mostrar "100 / "
    mov x0, #1
    adr x1, msg_label
    mov x2, len_label
    mov x8, #64
    svc #0

    // Mostrar divisor
    mov x0, x23
    bl print_number

    // Mostrar " = "
    mov x0, #1
    adr x1, msg_equal
    mov x2, len_equal
    mov x8, #64
    svc #0

    // Calcular y mostrar resultado (100 ÷ x23)
    mov x0, #100
    udiv x0, x0, x23
    bl print_number

    // Nueva línea
    mov x0, #1
    adr x1, msg_newline
    mov x2, len_newline
    mov x8, #64
    svc #0

    add x23, x23, #1
    b loop_tabla

exit_program:
    mov x0, #0
    mov x8, #93
    svc #0

// ===================================
// Función print_number (x0 = número)
// ===================================
print_number:
    stp x29, x30, [sp, -16]!
    mov x29, sp

    adr x1, buffer + 31
    mov w2, #0
    mov x3, #10

convert_to_ascii:
    udiv x4, x0, x3
    msub x5, x4, x3, x0
    add x5, x5, #'0'
    strb w5, [x1], #-1
    mov x0, x4
    cbnz x0, convert_to_ascii

    adr x2, buffer + 31
    sub x2, x2, x1
    add x2, x2, #1
    add x1, x1, #1

    mov x0, #1
    mov x8, #64
    svc #0

    ldp x29, x30, [sp], 16
    ret