// ****************************************************************************
// * Lenguajes de Interfaz en TECNM Campus ITT
// * Nombre del archivo: practica.s
// * Descripción: Programa que convierte un numero decimal a octal
// * Autor: [America Fernanda Nevarez de la Cruz]
// * Fecha: [07-04-2025]
// * Plataforma: Raspberry Pi OS (64 bits)
// * Demostración: [https://asciinema.org/a/Do0dyATSlUhpr7XobMwzqe1nb]
// ****************************************************************************
// ****************************************************************************
// * Codigo en Ruby
//*def decimal_a_octal(decimal)
//* return "0" if decimal == 0
//*
//* octal = []
//* while decimal > 0
//* octal << (decimal % 8)
//* decimal /= 8
//* end
//*
//* octal.reverse.join
//*end
//*
//*print "//*Ingresa un número decimal: "
//*num = gets.chomp.to_i
//*puts "//*El número #{num} en octal es: #{decimal_a_octal(num)}"
// ****************************************************************************
.global _start
.section .bss
oct_buffer: .skip 16 // espacio para el número octal como texto
dec_buffer: .skip 16 // espacio para número decimal como texto
.section .text
_start:
// ========================
// Número decimal a convertir
// ========================
MOV X6, #93 // Cambia este número si quieres probar otro
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 octal es: "
// ========================
LDR X1, =msg2
MOV X2, #17 // Longitud de " en octal es: "
MOV X0, #1
MOV X8, #64
SVC #0
// ========================
// Mostrar número octal
// ========================
MOV X6, X20
BL print_octal
// ========================
// Salto de línea
// ========================
LDR X1, =newline
MOV X2, #1
MOV X0, #1
MOV X8, #64
SVC #0
// ========================
// Terminar programa
// ========================
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_octal (X6)
// ========================
print_octal:
ADR X7, oct_buffer
ADD X7, X7, #15
MOV X8, X6
MOV X9, #0
oct_loop:
MOV X10, #8
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, oct_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 octal es: "
newline: .asciz "\n"