GNU/Linux xterm-256color bash 196 views

// ****************************************************************************
// * Nombre del archivo: practica.s
// * Descripción: Detectar si la palabra es un palindromo
// * Autor: Roldan Castro Luis Alberto
// * Fecha: 08-04-2025
// * Plataforma: Raspberry Pi OS (64 bits)
// * Asciinema: https://asciinema.org/a/VWq1pAptW2Q5iJ1CB1UI9CCvr
// ****************************************************************************

// ****************************************************************************
// Version en C#
//
//using System;
//
//class Program
//{
//    static void Main()
//    {
//        // Solicitar entrada del usuario
//        Console.Write("Ingrese una palabra: ");
//        string input = Console.ReadLine();
//
//        // Verificar si es un palíndromo
//        if (IsPalindrome(input))
//        {
//            Console.WriteLine("Es un palindromo");
//        }
//        else
//        {
//            Console.WriteLine("No es un palindromo");
//        }
//    }
//
//    static bool IsPalindrome(string str)
//    {
//        int left = 0;
//        int right = str.Length - 1;
//        
//        while (left < right)
//        {
//            if (str[left] != str[right])
//            {
//                return false;
//            }
//            left++;
//            right--;
//        }
//        return true;
//    }
//}
// ****************************************************************************

.section .bss
buffer: .skip 64               // Reservar 64 bytes para almacenar la entrada del usuario

.section .data
msg_input: .ascii "Ingrese una palabra: "  // Mensaje que se muestra para pedir la palabra
len_input = . - msg_input                  // Calcular la longitud del mensaje de entrada

msg_si: .ascii "Es un palindromo\n"        // Mensaje si la palabra es un palíndromo
len_si = . - msg_si                        // Calcular la longitud del mensaje de palíndromo

msg_no: .ascii "No es un palindromo\n"      // Mensaje si la palabra no es un palíndromo
len_no = . - msg_no                        // Calcular la longitud del mensaje de no palíndromo

.section .text
.global _start

_start:
    // Mostrar mensaje de ingreso
    ldr x0, =msg_input            // Cargar la dirección del mensaje de ingreso
    mov x1, #len_input            // Cargar la longitud del mensaje de ingreso
    bl print_msg                  // Llamar a la función para imprimir el mensaje

    // Leer la entrada del usuario
    mov x0, #0                    // 0 significa leer desde la entrada estándar
    ldr x1, =buffer               // Dirección donde se almacenará la entrada
    mov x2, #64                   // Tamaño máximo de la entrada
    mov x8, #63                   // Syscall para leer de la entrada estándar
    svc #0                         // Realizar la llamada al sistema

    // Calcular la longitud de la palabra
    ldr x1, =buffer               // Dirección de la palabra ingresada
    mov x2, #0                    // Inicializar el contador de caracteres
long_loop:
    ldrb w3, [x1, x2]            // Cargar el siguiente byte de la palabra
    cmp w3, #10                   // Comparar si es el salto de línea (\n)
    beq end_long                  // Si es salto de línea, terminamos el cálculo de longitud
    add x2, x2, #1                // Incrementar el contador de caracteres
    b long_loop                   // Repetir el ciclo
end_long:
    mov x21, x2                   // Guardar la longitud de la palabra en x21

    // Comparar los caracteres desde el inicio y el final de la palabra
    mov x4, #0                    // Inicializar el índice desde el inicio
    sub x5, x21, #1               // Inicializar el índice desde el final (longitud - 1)

check_loop:
    cmp x4, x5                    // Comparar los índices de inicio y fin
    bge es_palindromo             // Si los índices se cruzan, es un palíndromo

    ldr x6, =buffer               // Dirección de la palabra
    add x7, x6, x4                // Dirección del carácter desde el inicio
    ldrb w8, [x7]                 // Cargar el carácter desde el inicio

    add x7, x6, x5                // Dirección del carácter desde el final
    ldrb w9, [x7]                 // Cargar el carácter desde el final

    cmp w8, w9                    // Comparar ambos caracteres
    bne no_palindromo             // Si no son iguales, no es un palíndromo

    add x4, x4, #1                // Avanzar el índice desde el inicio
    sub x5, x5, #1                // Retroceder el índice desde el final
    b check_loop                  // Repetir la comparación

es_palindromo:
    ldr x0, =msg_si               // Cargar el mensaje "Es un palíndromo"
    mov x1, #len_si               // Cargar la longitud del mensaje
    bl print_msg                  // Llamar a la función para imprimir el mensaje
    b salir                       // Saltar al final

no_palindromo:
    ldr x0, =msg_no               // Cargar el mensaje "No es un palíndromo"
    mov x1, #len_no               // Cargar la longitud del mensaje
    bl print_msg                  // Llamar a la función para imprimir el mensaje
    b salir                       // Saltar al final

salir:
    mov x8, #93                   // Syscall para salir del programa
    mov x0, #0                    // Código de salida 0
    svc #0                         // Realizar la llamada al sistema para salir

// --- Función: imprimir mensaje ---
print_msg:
    mov x2, x1                    // Cargar la longitud del mensaje
    mov x1, x0                    // Cargar la dirección del mensaje
    mov x0, #1                    // 1 significa salida estándar (stdout)
    mov x8, #64                   // Syscall para escribir en la salida estándar
    svc #0                         // Realizar la llamada al sistema para imprimir el mensaje
    ret