-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpoli.s
83 lines (67 loc) · 2.58 KB
/
poli.s
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
// Autor: Cortez Huerta Gonzalo
// Fecha: 05/11/2024
// Descripción: Programa en ensamblador que verifica si una cadena es palíndromo
// Equivalente en C#:
/*
using System;
using System.Runtime.InteropServices;
using System.Text;
class Program
{
// Importar la función de verificación de palíndromo desde la biblioteca compartida
[DllImport("libcalculations.so")]
public static extern int es_palindromo(StringBuilder str);
static void Main()
{
// Pedir al usuario que ingrese una cadena
Console.Write("Ingresa una cadena para verificar si es palíndromo: ");
string input = Console.ReadLine();
// Convertir la cadena a StringBuilder (mutable)
StringBuilder cadena = new StringBuilder(input);
// Llamar a la función para verificar si es palíndromo
int resultado = es_palindromo(cadena);
// Mostrar el resultado
if (resultado == 1)
{
Console.WriteLine($"\"{input}\" es un palíndromo.");
}
else
{
Console.WriteLine($"\"{input}\" no es un palíndromo.");
}
}
}
*/
.section .data
.section .text
.global es_palindromo
// Función para verificar si una cadena es un palíndromo
// Parámetro de entrada: x0 (puntero a la cadena)
// Retorno: x0 = 1 si es palíndromo, x0 = 0 si no lo es
es_palindromo:
// Encuentra la longitud de la cadena
mov x1, x0 // x1 apunta al inicio de la cadena
find_end:
ldrb w2, [x1], #1 // Leer el siguiente byte (carácter) y avanzar
cbz w2, check_palindrome // Si llegamos al final ('\0'), comenzar verificación
b find_end // Continuar hasta encontrar el final
check_palindrome:
sub x1, x1, #2 // Retroceder una posición (x1 apunta al último carácter)
mov x2, x1 // x2 apunta al final de la cadena
mov x3, x0 // x3 apunta al inicio de la cadena
compare_loop:
cmp x3, x2 // Comparar el inicio con el final
bge is_palindrome // Si se cruzan, es un palíndromo
ldrb w4, [x3] // Leer carácter desde el inicio
ldrb w5, [x2] // Leer carácter desde el final
cmp w4, w5 // Comparar caracteres
bne not_palindrome // Si no son iguales, no es palíndromo
add x3, x3, #1 // Avanzar el inicio
sub x2, x2, #1 // Retroceder el final
b compare_loop // Repetir la comparación
is_palindrome:
mov w0, 1 // Retornar 1 si es palíndromo
ret
not_palindrome:
mov w0, 0 // Retornar 0 si no es palíndromo
ret