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