GNU/Linux xterm-256color bash 144 views

// ****************************************************************************
// * Nombre del archivo: practica.s
// * Descripción: Invertir una cadena ingresada
// * Autor: Roldan Castro Luis Alberto
// * Fecha: 07-04-2025
// * Plataforma: Raspberry Pi OS (64 bits)
// * Asciinema: https://asciinema.org/a/gS6Ea7GoE9Zo6Mg8jRJISSu4m
// ****************************************************************************

// ****************************************************************************
// * Codigo equivalente en Ruby
// * # Leer cadena desde teclado
// * print "Ingrese una cadena: "
// * input = gets.chomp  # Elimina automáticamente el salto de línea (\n)
// *# Invertir la cadena
// * reversed = input.reverse
// * # Imprimir cadena invertida
// * puts reversed
// ****************************************************************************

.global _start

.section .bss
input_buffer: .skip 128     // Espacio para la cadena

.section .text

_start:
    // ========================
    // Leer cadena desde teclado
 // ========================
    MOV X0, #0              // stdin
    ADR X1, input_buffer    // buffer destino
    MOV X2, #128            // tamaño máximo a leer
    MOV X8, #63             // syscall: read
    SVC #0
    MOV X20, X0             // guardar longitud real (sin incluir enter todavía)

    // ========================
    // Eliminar el salto de línea (\n)
    // ========================
    ADR X1, input_buffer
    ADD X1, X1, X20         // apunta al último carácter
    SUB X1, X1, #1          // retrocede una posición
    LDRB W2, [X1]
    CMP W2, #'n'            // '\n' = 10
    BNE no_trim
    SUB X20, X20, #1        // descarta el \n
no_trim:

    // ========================
    // Invertir la cadena en el buffer
    // ========================
    ADR X1, input_buffer    // inicio
    ADD X2, X1, X20         // final
    SUB X2, X2, #1          // apuntar al último carácter válido

reverse_loop:
    CMP X1, X2
    BHS end_reverse         // salir si punteros se cruzan o se tocan
LDRB W3, [X1]           // cargar byte de inicio
    LDRB W4, [X2]           // cargar byte de fin
    STRB W4, [X1]           // escribir fin en inicio
    STRB W3, [X2]           // escribir inicio en fin

    ADD X1, X1, #1
    SUB X2, X2, #1
    B reverse_loop

end_reverse:

    // ========================
    // Imprimir cadena invertida
    // ========================
    MOV X0, #1              // stdout
    ADR X1, input_buffer
    MOV X2, X20             // longitud de la cadena
    MOV X8, #64             // syscall: write
    SVC #0

    // Agregar salto de línea
    LDR X1, =newline
    MOV X2, #1
    MOV X0, #1
    MOV X8, #64
    SVC #0

    // ========================
    // Salida limpia
    // ========================
   MOV X0, #0
    MOV X8, #93             // syscall: exit
    SVC #0

.section .rodata
newline: .asciz "\n"