**
Nombre: romano.s
Autor: Karla Itzel Vázquez Cruz
Fecha: 08-04-2025
Descripción: Convertir numeros romanos a enteros
Plataforma: Raspberry Pi OS 64-bit
Asciinema: romano.s
Versión en C:
Versión en ARM64 RaspbianOS Linux:
.section .bss
buffer: .skip 64
.section .data
msg_ingrese: .ascii "Ingrese numero romano (I, IV, V, IX, X): "
len_ingrese = . - msg_ingrese
msg_resultado: .ascii "Resultado: "
len_resultado = . - msg_resultado
newline: .ascii "\n"
len_nl = . - newline
.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
ldr x1, =buffer
// Leer primer caracter
ldrb w2, [x1]
ldrb w3, [x1, #1]
// Combinaciones de dos letras (IV o IX)
cmp w2, #'I'
bne revisar_uno
cmp w3, #'V'
beq valor_iv
cmp w3, #'X'
beq valor_ix
revisar_uno:
cmp w2, #'I'
beq valor_1
cmp w2, #'V'
beq valor_5
cmp w2, #'X'
beq valor_10
// Valor por defecto
mov x4, #0
b mostrar
valor_iv:
mov x4, #4
b mostrar
valor_ix:
mov x4, #9
b mostrar
valor_1:
mov x4, #1
b mostrar
valor_5:
mov x4, #5
b mostrar
valor_10:
mov x4, #10
b mostrar
mostrar:
ldr x0, =msg_resultado
mov x1, #len_resultado
bl print_msg
mov x0, x4
bl print_number
ldr x0, =newline
mov x1, #len_nl
bl print_msg
// Salida
mov x8, #93
mov x0, #0
svc #0
// --- Función imprimir mensaje ---
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