**
Nombre: reversa.s
Autor: Karla Itzel Vázquez Cruz
Fecha: 02-04-2025
Descripción: Programa en ARM64 Assembly para leer una cadena y mostrarla en orden inverso.
Plataforma: Raspberry Pi OS 64-bit
Asciinema: reversa.s
**
Equivalente en C:
#include <stdio.h>
int main() {
char buffer[256];
printf("Ingrese una cadena: ");
fgets(buffer, 256, stdin);
printf("Cadena en reversa: ");
int len = 0;
while (buffer[len] != '\n' && buffer[len] != '\0') len++;
for (int i = len - 1; i >= 0; i--) putchar(buffer[i]);
putchar('\n');
return 0;
}
Versión en ARM64 RaspbianOS Linux:
.section .bss
buffer: .skip 256 // Buffer para entrada de usuario
.section .data
mensaje: .asciz "Ingrese una cadena: "
resultado: .asciz "Cadena en reversa: "
nl: .asciz "\n" // Salto de línea
.section .text
.global _start
_start:
// Mostrar mensaje de entrada
mov x0, #1 // stdout
ldr x1, =mensaje // Dirección del mensaje
mov x2, #19 // Longitud del mensaje
mov x8, #64 // syscall write
svc #0
// Leer entrada del usuario
mov x0, #0 // stdin
ldr x1, =buffer // Dirección del buffer
mov x2, #255 // Tamaño máximo
mov x8, #63 // syscall read
svc #0
// x0 ahora contiene bytes leídos (opcional)
// Encontrar longitud sin contar '\n'
ldr x1, =buffer // Puntero actual
mov x3, x1 // Guardar inicio original
buscar_fin:
ldrb w2, [x1], #1 // Leer byte y avanzar
cmp w2, #0xA // ¿es newline?
beq ajustar_final
cmp w2, #0 // ¿es null?
beq ajustar_final
b buscar_fin
ajustar_final:
sub x1, x1, #2 // Retroceder para ignorar newline
mov x4, x1 // Guardar puntero final
// Mostrar mensaje "Cadena en reversa:"
mov x0, #1
ldr x1, =resultado
mov x2, #19
mov x8, #64
svc #0
// Imprimir en reversa desde x4 hasta x3
imprimir_invertido:
cmp x4, x3 // ¿x4 < x3?
blt imprimir_salto
ldrb w2, [x4], #-1 // Leer byte y retroceder
mov x1, sp // Usar stack como buffer temporal
strb w2, [x1] // Guardar byte
mov x0, #1 // stdout
mov x2, #1 // longitud = 1
mov x8, #64 // syscall write
svc #0
b imprimir_invertido
// Imprimir salto de línea
imprimir_salto:
mov x0, #1
ldr x1, =nl
mov x2, #1
mov x8, #64
svc #0
// Terminar programa
fin_programa:
mov x8, #93 // syscall exit
mov x0, #0
svc #0