GNU/Linux xterm-256color bash 192 views

// ****************************************************************************
// * Lenguajes de Interfaz en TECNM Campus ITT
// * Nombre del archivo: practica.s
// * Descripción: Programa que convierte a decimal a base 20
// * Autor: [America Fernanda Nevarez de la Cruz]
// * Fecha: [2025-04-10]
// * Plataforma: Raspberry Pi OS (64 bits)
// * Demostración:  [https://asciinema.org/a/AqquARd5WpNoqe3Bsp662oAFq]
// ****************************************************************************

// ****************************************************************************
// * Codigo en  base 20 con C++
// *
// * Conversor de Decimal a Base 20
// * Todas las líneas de código tienen comentarios separados
// *

// *#include <iostream>
// *#include <string>
// *#include <algorithm>
// *
// *using namespace std;
// *
// *string decimal_a_base20(int decimal) {
// *    if (decimal == 0) return "0";
// *    
// *    string resultado;
// *    const string digitos = "0123456789ABCDEFGHIJ";
// *    
// *    while (decimal > 0) {
// *        resultado += digitos[decimal % 20];
// *        decimal /= 20;
// *    }
// *    
// *    reverse(resultado.begin(), resultado.end());
// *    return resultado;
// *}
// *
// *int main() {
// *    int num;
// *    cout << "Ingrese un número decimal: ";
// *    cin >> num;
// *    cout << num << " en base 20 es: " << decimal_a_base20(num) << endl;
// *    return 0;
// *}
// ****************************************************************************
.global _start

.section .bss
base20_buffer: .skip 32     // espacio para el número base 20 como texto
dec_buffer:     .skip 16     // espacio para número decimal como texto

.section .text

_start:
    // ========================
    // Número decimal a convertir
    // ========================
    MOV X6, #324             // Cambia este número si deseas
    MOV X20, X6              // Guardamos copia del número

    // ========================
    // Mostrar mensaje base
    // ========================
    LDR X1, =msg1
    MOV X2, #8               // Longitud de "Decimal "
    MOV X0, #1
    MOV X8, #64
    SVC #0

    // ========================
    // Mostrar número decimal
    // ========================
    MOV X6, X20
    BL print_decimal

    // ========================
    // Mostrar texto " en base 20 es: "
    // ========================
    LDR X1, =msg2
    MOV X2, #20              // Longitud de " en base 20 es: "
    MOV X0, #1
    MOV X8, #64
    SVC #0

    // ========================
    // Mostrar número en base 20
    // ========================
    MOV X6, X20
    BL print_base20

    // ========================
    // Salto de línea
    // ========================
    LDR X1, =newline
    MOV X2, #1
    MOV X0, #1
    MOV X8, #64
    SVC #0

    // ========================
    // Salida limpia
    // ========================
    MOV X0, #0
    MOV X8, #93
    SVC #0

// ========================
// print_decimal (X6)
// ========================
print_decimal:
    ADR X7, dec_buffer
    ADD X7, X7, #15
    MOV X8, X6
    MOV X9, #0

dec_loop:
    MOV X10, #10
    UDIV X11, X8, X10
    MUL X12, X11, X10
    SUB X13, X8, X12
    ADD X13, X13, #'0'
    STRB W13, [X7], #-1
    MOV X8, X11
    ADD X9, X9, #1
    CBNZ X8, dec_loop

    ADD X1, X7, #1
    MOV X2, X9
    MOV X0, #1
    MOV X8, #64
    SVC #0
    RET

// ========================
// print_base20 (X6)
// ========================
print_base20:
    ADR X7, base20_buffer
    ADD X7, X7, #31          // Tamaño del buffer - 1
    MOV X8, X6
    MOV X9, #0

base20_loop:
    MOV X10, #20
    UDIV X11, X8, X10
    MUL X12, X11, X10
    SUB X13, X8, X12

    // Si el dígito es mayor a 9, convertir a letra A-J
    CMP X13, #9
    BLE store_base20_digit
    ADD X13, X13, #'A' - 10
    B store_base20

store_base20_digit:
    ADD X13, X13, #'0'

store_base20:
    STRB W13, [X7], #-1
    MOV X8, X11
    ADD X9, X9, #1
    CBNZ X8, base20_loop

    ADD X1, X7, #1
    MOV X2, X9
    MOV X0, #1
    MOV X8, #64
    SVC #0
    RET

.section .rodata
msg1:    .asciz "Decimal "
msg2:    .asciz " en base 20 es: "
newline: .asciz "\n"