/*
Autor: Victor Manuel Madrid Lugo
Fecha: 09/04/2025
Descripción: Separa los dígitos de una cadena y los imprime con espacios
Demostración: [https://asciinema.org/a/14XuacOz9G3ZKbi25plfiHxQW]
Equivalente en Python:
texto = input("Ingrese texto: ")
digitos = [c for c in texto if c.isdigit()]
print("Dígitos encontrados:", ' '.join(digitos))
*/
.section .data
msg_prompt: .asciz "Ingrese una cadena de texto: "
msg_result: .asciz "Dígitos encontrados: "
msg_no_digits: .asciz "No se encontraron dígitos en la cadena.\n"
space: .asciz " "
newline: .asciz "\n"
buffer: .skip 256 // Buffer para entrada
digits: .skip 512 // Buffer para dígitos separados
.section .text
.global _start
_start:
// Solicitar cadena al usuario
mov x0, #1 // stdout
ldr x1, =msg_prompt
mov x2, #28 // Longitud del mensaje
mov x8, #64 // syscall write
svc #0
// Leer entrada
mov x0, #0 // stdin
ldr x1, =buffer
mov x2, #256 // Tamaño máximo
mov x8, #63 // syscall read
svc #0
// Procesar cadena (buscar dígitos)
mov x19, #0 // Índice para buffer de entrada
mov x20, #0 // Índice para buffer de dígitos
mov x21, #0 // Contador de dígitos encontrados
ldr x22, =buffer // Puntero a la cadena original
ldr x23, =digits // Puntero al buffer de dígitos
process_loop:
ldrb w24, [x22, x19] // Cargar carácter actual
cbz w24, check_digits // Terminar si es null
cmp w24, #10 // Terminar si es newline
beq check_digits
// Verificar si es dígito (ASCII 48-57)
cmp w24, #'0'
b.lt next_char
cmp w24, #'9'
b.gt next_char
// Es dígito, almacenar en buffer
strb w24, [x23, x20] // Almacenar dígito
add x20, x20, #1
// Añadir espacio después del dígito
mov w25, #' '
strb w25, [x23, x20]
add x20, x20, #1
add x21, x21, #1 // Incrementar contador de dígitos
next_char:
add x19, x19, #1 // Mover al siguiente carácter
b process_loop
check_digits:
// Verificar si se encontraron dígitos
cbnz x21, print_digits
// No se encontraron dígitos
mov x0, #1
ldr x1, =msg_no_digits
mov x2, #42 // Longitud del mensaje
mov x8, #64
svc #0
b exit
print_digits:
// Reemplazar último espacio con null terminator
sub x20, x20, #1
mov w25, #0
strb w25, [x23, x20]
// Imprimir mensaje de resultado
mov x0, #1
ldr x1, =msg_result
mov x2, #20 // Longitud del mensaje
mov x8, #64
svc #0
// Imprimir dígitos separados
mov x0, #1
ldr x1, =digits
mov x2, x20 // Longitud del buffer de dígitos
mov x8, #64
svc #0
// Imprimir nueva línea
mov x0, #1
ldr x1, =newline
mov x2, #1
mov x8, #64
svc #0
exit:
// Salir
mov x0, #0 // Código de retorno
mov x8, #93 // syscall exit
svc #0