GNU/Linux xterm-256color bash 149 views

// ****************************************************************************
// * Lenguajes de Interfaz en TECNM Campus ITT
// * Nombre del archivo: practica.s
// * Descripción: Detector de palidromos
// * Autor: [America Fernanda Nevarez de la Cruz]
// * Fecha: [2025-04-08]
// * Plataforma: Raspberry Pi OS (64 bits)
// * Demostración:  [https://asciinema.org/a/0Bdv69M0G1A63hpPshIeKK8kO]
// ****************************************************************************


// ****************************************************************************
// * Codigo equivalente en C++
// *#include <iostream>
// *#include <string>
// *#include <algorithm>
// *
// *using namespace std;
// *
// *int main() {
// *    cout << "Ingrese una palabra: ";
// *    string palabra;
// *    getline(cin, palabra);
// *
// *    string original = palabra;
// *    reverse(palabra.begin(), palabra.end());
// *
// *    if(original == palabra) {
// *        cout << "Es un palindromo" << endl;
// *    } else {
// *        cout << "No es un palindromo" << endl;
// *    }
// *
// *    return 0;
// *}
// ****************************************************************************

.section .bss
buffer: .skip 64

.section .data
msg_input: .ascii "Ingrese una palabra: "
len_input = . - msg_input

msg_si: .ascii "Es un palindromo\n"
len_si = . - msg_si

msg_no: .ascii "No es un palindromo\n"
len_no = . - msg_no

.section .text
.global _start

_start:
    // Mostrar mensaje de ingreso
    ldr x0, =msg_input
    mov x1, #len_input
    bl print_msg

    // Leer entrada del usuario
    mov x0, #0
    ldr x1, =buffer
    mov x2, #64
    mov x8, #63
    svc #0

    // Calcular longitud
    ldr x1, =buffer
    mov x2, #0        // contador
long_loop:
    ldrb w3, [x1, x2]
    cmp w3, #10       // \n
    beq end_long
    add x2, x2, #1
    b long_loop
end_long:
    mov x21, x2       // longitud

    // Comparar caracteres de inicio y fin
    mov x4, #0                // índice desde el inicio
    sub x5, x21, #1           // índice desde el final

check_loop:
    cmp x4, x5
    bge es_palindromo

    ldr x6, =buffer
    add x7, x6, x4
    ldrb w8, [x7]

    add x7, x6, x5
    ldrb w9, [x7]

    cmp w8, w9
    bne no_palindromo

    add x4, x4, #1
    sub x5, x5, #1
    b check_loop

es_palindromo:
    ldr x0, =msg_si
    mov x1, #len_si
    bl print_msg
    b salir

no_palindromo:
    ldr x0, =msg_no
    mov x1, #len_no
    bl print_msg
    b salir

salir:
    mov x8, #93     // syscall exit
    mov x0, #0
    svc #0

// --- Función: imprimir mensaje ---
print_msg:
    mov x2, x1
    mov x1, x0
    mov x0, #1
    mov x8, #64
    svc #0
    ret