GNU/Linux xterm bash 95 views

📌 Demostración: Verificar si una cadena es un palíndromo en ARM64 Assembly

💻 Lenguajes de Interfaz en TECNM Campus ITT
👨‍💻 Autor: Alejandro Suarez Sandoval
📅 Fecha: 2025/04/09

🎯 Descripción

Este programa verifica si una cadena dada en memoria es un palíndromo o no.
La implementación se realiza en:

Assembly ARM64 para RaspbianOS en Raspberry Pi

🔧 Compilación en Raspberry Pi (ARM64)

as palindromo.s -o palindromo.o  
ld palindromo.o -o palindromo

▶️ Ejecución

./palindromo

👀 Código fuente

🔗 Código fuente en Gist: Programa 25 Verifica si una cadena es un palindromo Código Assembly ARM64 para RaspbianOS

/*
 ______  ____               ____  __ __      
/\  _  \/\  _`\   /'\_/`\  /'___\/\ \\ \     
\ \ \L\ \ \ \L\ \/\      \/\ \__/\ \ \\ \    
 \ \  __ \ \ ,  /\ \ \__\ \ \  _``\ \ \\ \_  
  \ \ \/\ \ \ \\ \\ \ \_/\ \ \ \L\ \ \__ ,__\
   \ \_\ \_\ \_\ \_\ \_\\ \_\ \____/\/_/\_\_/
    \/_/\/_/\/_/\/ /\/_/ \/_/\/___/    \/_/  
                                             
♡ ∩_∩ 
(„• ֊ •„)♡
| ̄U U ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| 
| • Lenguajes de Interfaz en TECNM Campus ITT                            |   
| • Autor: Alejandro Suarez Sandoval                                     | 
| • Fecha: 2025/04/09                                                    | 
| • Descripción: Programa que verifica si una cadena es                  | 
|   un palindromo en C++ y Assembly ARM64 para RaspbianOS.               | 
| • Demostración:                                                        |
|   https://asciinema.org/a/713457                                       |
| • Compilación (Raspberry Pi ARM64):                                    |  
|     as palindromo.s -o palindromo.o                                    |  
|     ld palindromo.o -o palindromo                                      |  
| • Ejecución: ./palindromo                                              |  
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄                                        

⠂⠄⠄⠂⠁⠁⠂⠄⠄⠂⠁⠁⠂⠄⠄⠂ ⠂⠄⠄⠂☆
═════════•°• Demostración Código en lenguaje C++ •°•═══════

#include <iostream>
#include <string>

using namespace std;

bool esPalindromo(const string& str) {
int izquierda = 0;
int derecha = str.length() - 1;

while (izquierda < derecha) {
    if (str[izquierda] != str[derecha]) {
        return false;
    }
    izquierda++;
    derecha--;
}
return true;
}

int main() {
string cadena = "anitalavalatina";

if (esPalindromo(cadena)) {
    cout << "La cadena ES un palindromo" << endl;
} else {
    cout << "La cadena NO es un palindromo" << endl;
}

return 0;
}

════════════════════•°• ☆ •°•══════════════════════════════
/*

/* ⠂⠄⠄⠂⠁⠁⠂⠄⠄⠂⠁⠁⠂⠄⠄⠂ ⠂⠄⠄⠂☆
═════════════•°• Código en ARM64 Assembly •°•═════════════ */

.data
cadena:         .asciz "anitalavalatina"
es_palindromo:  .asciz " es un palíndromo\n"
no_palindromo:  .asciz " no es un palíndromo\n"
resultado:      .space 256

.text
.global _start

_start:
    // Usar ADRP/ADD para cargar direcciones correctamente
    adrp    x19, cadena
    add     x19, x19, :lo12:cadena
    mov     x0, x19

    // Calcular longitud de la cadena
    mov     x1, #0
contar_longitud:
    ldrb    w2, [x0, x1]
    cbz     w2, fin_contar
    add     x1, x1, #1
    b       contar_longitud
fin_contar:
    sub     x1, x1, #1          // Longitud sin el null terminator

    // Verificar palíndromo
    mov     x2, #0              // Índice izquierdo
verificar:
    cmp     x2, x1              // Comparar índices
    bge     es_palin
    ldrb    w3, [x19, x2]       // Carácter izquierdo
    ldrb    w4, [x19, x1]       // Carácter derecho
    cmp     w3, w4
    bne     no_palin
    add     x2, x2, #1
    sub     x1, x1, #1
    b       verificar

es_palin:
    // Preparar para concatenar
    adrp    x20, es_palindromo
    add     x20, x20, :lo12:es_palindromo
    b       concatenar

no_palin:
    adrp    x20, no_palindromo
    add     x20, x20, :lo12:no_palindromo

concatenar:
    // Copiar cadena original
    adrp    x21, resultado
    add     x21, x21, :lo12:resultado
    mov     x22, x19            // Origen (cadena original)
    mov     x23, #0             // Contador de longitud

copiar_original:
    ldrb    w24, [x22], #1
    cbz     w24, copiar_mensaje
    strb    w24, [x21], #1
    add     x23, x23, #1
    b       copiar_original

copiar_mensaje:
    ldrb    w24, [x20], #1
    cbz     w24, imprimir
    strb    w24, [x21], #1
    add     x23, x23, #1
    b       copiar_mensaje

imprimir:
    // Añadir null terminator
    strb    wzr, [x21]
    
    // Llamada a write
    mov     x0, #1              // stdout
    adrp    x1, resultado
    add     x1, x1, :lo12:resultado
    mov     x2, x23             // Longitud calculada
    mov     x8, #64             // syscall write
    svc     #0

    // Salir
    mov     x0, #0
    mov     x8, #93
    svc     #0