📌 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