GNU/Linux xterm-256color bash 159 views

/*
Autor: Victor Manuel Madrid Lugo
Fecha: 09/04/2025
Descripción: Elimina todos los espacios en blanco de una cadena ingresada por el usuario
Demostración: [https://asciinema.org/a/ZoOnPdJhhzdxECRisPI017oeU]

Equivalente en Python:
texto = input("Ingrese texto: ")
texto_sin_espacios = texto.replace(' ', '')
print("Texto sin espacios:", texto_sin_espacios)
*/

.section .data
    msg_prompt:    .asciz "Ingrese una cadena de texto: "
    msg_result:    .asciz "Texto sin espacios: "
    newline:       .asciz "\n"
    buffer:        .skip 256       // Buffer para entrada
    resultado:     .skip 256       // Buffer para texto sin espacios

.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 (eliminar espacios)
    mov x19, #0                  // Índice origen (buffer original)
    mov x20, #0                  // Índice destino (buffer resultado)
    ldr x21, =buffer             // Puntero a la cadena original
    ldr x22, =resultado          // Puntero al resultado

process_loop:
    ldrb w23, [x21, x19]         // Cargar carácter actual
    cbz w23, print_result        // Terminar si es null
    cmp w23, #10                 // Terminar si es newline
    beq print_result

    // Verificar si es espacio (ASCII 32)
    cmp w23, #' '
    b.ne store_char              // Si no es espacio, almacenar
    add x19, x19, #1             // Si es espacio, saltarlo
    b process_loop

store_char:
    strb w23, [x22, x20]         // Almacenar carácter en resultado
    add x19, x19, #1             // Incrementar índices
    add x20, x20, #1
    b process_loop

print_result:
    // Añadir null terminator
    mov w23, #0
    strb w23, [x22, x20]

    // Imprimir mensaje de resultado
    mov x0, #1
    ldr x1, =msg_result
    mov x2, #19                  // Longitud del mensaje
    mov x8, #64
    svc #0

    // Imprimir cadena sin espacios
    mov x0, #1
    ldr x1, =resultado
    mov x2, x20                  // Longitud de la cadena resultante
    mov x8, #64
    svc #0

    // Imprimir nueva línea
    mov x0, #1
    ldr x1, =newline
    mov x2, #1
    mov x8, #64
    svc #0

    // Salir
    mov x0, #0                   // Código de retorno
    mov x8, #93                  // syscall exit
    svc #0