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