GNU/Linux
•
xterm
•
bash
200 views
📌 Demostración: Invertir caracteres de una cadena en ARM64 Assembly
💻 Lenguajes de Interfaz en TECNM Campus ITT
👨💻 Autor: Alejandro Suarez Sandoval
📅 Fecha: 2025/04/02
🎯 Descripción
Este programa invierte los caracteres de una cadena guardada en memoria.
La implementación se realiza en:
✅ Assembly ARM64 para RaspbianOS en Raspberry Pi
🔧 Compilación en Raspberry Pi (ARM64)
as cadena_al_reves.s -o cadena_al_reves.o
ld cadena_al_reves.o -o cadena_al_reves
▶️ Ejecución
./cadena_al_reves
👀 Código fuente
🔗 Código fuente en Gist: Programa 5 Cambia el orden de una cadena (al reves) y muestra el resultado en terminal 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/02 |
| • Descripción: Programa que mueve el orden de los caracteres |
| de una cadena(al reves)en GO y Assembly ARM64 para RaspbianOS. |
| • Demostración: |
| https://asciinema.org/a/712723 |
| • Compilación (Raspberry Pi ARM64): |
| as cadena_al_reves.s -o cadena_al_reves.o |
| ld cadena_al_reves.o -o cadena_al_reves |
| • Ejecución: ./cadena_al_reves |
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
⠂⠄⠄⠂⠁⠁⠂⠄⠄⠂⠁⠁⠂⠄⠄⠂ ⠂⠄⠄⠂☆
═════════•°• Demostración Código en lenguaje GO •°•═══════
package main
import (
"fmt"
)
func reverseString(s string) string {
// Convertir la cadena a un slice de runas para manejar correctamente caracteres Unicode
runes := []rune(s)
// Invertir el slice de runas
for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
runes[i], runes[j] = runes[j], runes[i]
}
// Convertir de vuelta a string
return string(runes)
}
func main() {
original := "THE BOYZ"
reversed := reverseString(original)
fmt.Printf("Cadena original: %s\n", original)
fmt.Printf("Cadena invertida: %s\n", reversed)
for _, str := range otrasStrings {
fmt.Printf("\nOriginal: %s\nInvertida: %s\n", str, reverseString(str))
}
}
════════════════════•°• ☆ •°•══════════════════════════════
/*
/* ⠂⠄⠄⠂⠁⠁⠂⠄⠄⠂⠁⠁⠂⠄⠄⠂ ⠂⠄⠄⠂☆
═════════════•°• Código en ARM64 Assembly •°•═════════════ */
// ARM64 Assembly - Programa para invertir una cadena con formato mejorado
// Muestra: "Original: hola
// Invertida: aloh"
.global _start
.data
input_str: .asciz "THE BOYZ" // Cadena original
str_len = . - input_str - 1 // Longitud de la cadena (sin el nulo final)
reversed_str: .space 100 // Espacio para la cadena invertida
msg_original: .asciz "Original: " // Mensaje para la cadena original
msg_orig_len = . - msg_original - 1
msg_reversed: .asciz "\nInvertida: " // Mensaje para la cadena invertida
msg_rev_len = . - msg_reversed - 1
newline: .asciz "\n" // Carácter de nueva línea
.text
_start:
// Inicializar registros para la inversión
adr x0, input_str // x0 = dirección de la cadena original
adr x1, reversed_str // x1 = dirección donde guardar la cadena invertida
mov x2, #str_len // x2 = longitud de la cadena
add x0, x0, x2 // x0 apunta al último carácter (antes del nulo)
sub x0, x0, #1 // Ajustar para apuntar al último carácter real
// Bucle para invertir la cadena
reverse_loop:
ldrb w3, [x0] // Cargar un byte de la cadena original
strb w3, [x1], #1 // Guardar el byte en la cadena invertida y avanzar puntero
sub x0, x0, #1 // Retroceder en la cadena original
subs x2, x2, #1 // Decrementar contador
bne reverse_loop // Continuar si no hemos terminado
// Añadir un byte nulo al final de la cadena invertida
mov w3, #0 // Byte nulo (fin de cadena)
strb w3, [x1] // Guardar al final de la cadena invertida
// Imprimir mensaje "Original: "
mov x0, #1 // Descriptor de archivo: stdout
adr x1, msg_original // Dirección del mensaje
mov x2, #msg_orig_len // Longitud del mensaje
mov x8, #64 // Syscall: write
svc #0 // Llamar al sistema
// Imprimir la cadena original
mov x0, #1 // Descriptor de archivo: stdout
adr x1, input_str // Dirección de la cadena original
mov x2, #str_len // Longitud de la cadena
mov x8, #64 // Syscall: write
svc #0 // Llamar al sistema
// Imprimir mensaje "Invertida: " (incluye \n)
mov x0, #1 // Descriptor de archivo: stdout
adr x1, msg_reversed // Dirección del mensaje
mov x2, #msg_rev_len // Longitud del mensaje
mov x8, #64 // Syscall: write
svc #0 // Llamar al sistema
// Imprimir la cadena invertida
mov x0, #1 // Descriptor de archivo: stdout
adr x1, reversed_str // Dirección de la cadena invertida
mov x2, #str_len // Longitud de la cadena
mov x8, #64 // Syscall: write
svc #0 // Llamar al sistema
// Imprimir nueva línea final
mov x0, #1 // Descriptor de archivo: stdout
adr x1, newline // Dirección del carácter de nueva línea
mov x2, #1 // Longitud: 1 byte
mov x8, #64 // Syscall: write
svc #0 // Llamar al sistema
// Salir del programa
mov x0, #0 // Código de salida: 0 (éxito)
mov x8, #93 // Syscall: exit
svc #0 // Llamar al sistema