GNU/Linux xterm-256color bash 151 views

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