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