GNU/Linux xterm-256color bash 150 views

/*
Autor: Victor Manuel Madrid Lugo
Fecha: 08/04/2025
Descripción: Reemplaza todas las 'a' por '@' en una cadena ingresada por el usuario
Demostración: [https://asciinema.org/a/EiAW9rSUyObqT4fifpCa7Z63u]

Equivalente en Python:
texto = input("Ingrese texto: ")
texto_modificado = texto.replace('a', '@')
print("Texto modificado:", texto_modificado)
*/

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

.section .text
.global _start

_start:
    // Solicitar cadena al usuario
    mov x0, #1                   // stdout
    ldr x1, =msg_prompt
    mov x2, #27                 // 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
    mov x19, #0                  // Contador de posición
    ldr x20, =buffer             // Puntero a la cadena original
    ldr x21, =modified           // Puntero a la cadena modificada

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

    // Reemplazar 'a' por '@'
    cmp w22, #'a'
    b.ne store_char
    mov w22, #'@'                // Reemplazar

store_char:
    strb w22, [x21, x19]         // Almacenar carácter (modificado o no)
    add x19, x19, #1             // Incrementar posición
    b process_loop

print_result:
    // Añadir null terminator
    mov w22, #0
    strb w22, [x21, x19]

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

    // Imprimir cadena modificada
    mov x0, #1
    ldr x1, =modified
    mov x2, x19                  // Longitud de la cadena
    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