GNU/Linux xterm bash 145 views

📌 Demostración: Contar cuántas “a” existen en una cadena de texto en ARM64 Assembly

💻 Lenguajes de Interfaz en TECNM Campus ITT
👨‍💻 Autor: Alejandro Suarez Sandoval
📅 Fecha: 2025/04/07

🎯 Descripción

Este programa cuenta cuántas letras “a” tiene una cadena de texto.
La implementación se realiza en:

Assembly ARM64 para RaspbianOS en Raspberry Pi

🔧 Compilación en Raspberry Pi (ARM64)

as contar_a.s -o contar_a.o  
ld contar_a.o -o contar_a  

▶️ Ejecución

./contar_a

👀 Código fuente

🔗 Código fuente en Gist: Programa 8 Contar cuantas “a” existen en una cadena de texto 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/07                                                            |
| • Descripción: Programa que cuenta cuantas letras "a"                          |
|   hay en una cadena en Python y Assembly ARM64 para RaspbianOS.                |
| • Demostración:                                                                |
|   https://asciinema.org/a/712758                                               |
| • Compilación (Raspberry Pi ARM64):                                            |
|     as contar_a.s -o contar_a.o                                                |
|     ld contar_a.o -o contar_a                                                  |
| • Ejecución: ./contar_a                                                        |
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

⠂⠄⠄⠂⠁⠁⠂⠄⠄⠂⠁⠁⠂⠄⠄⠂ ⠂⠄⠄⠂☆
═════════•°• Demostración Código en lenguaje Python •°•═══════

# Cadena de ejemplo
cadena = "overwatch es el mejor juego del mundo"

# Inicializar el contador de letras 'a'
contador = 0

# Recorrer la cadena
for caracter in cadena:
    if caracter == 'a':  # Comparar con 'a'
        contador += 1  # Incrementar el contador

# Imprimir el resultado
print(f"La cantidad de letras 'a' es: {contador}")

════════════════════•°• ☆ •°•══════════════════════════════
/*

/* ⠂⠄⠄⠂⠁⠁⠂⠄⠄⠂⠁⠁⠂⠄⠄⠂ ⠂⠄⠄⠂☆
═════════════•°• Código en ARM64 Assembly •°•═════════════ */

    .global _start       // Punto de entrada del programa
    .align 2

_start:
    // Inicializar el puntero a la cadena
    ADR     X0, cadena
    MOV     X1, #0       // Inicializar contador a 0

loop:
    LDRB    W2, [X0], #1 // Cargar un byte y avanzar el puntero
    CMP     W2, #0       // Verificar si es el fin de la cadena
    B.EQ    imprimir     // Si es 0, ir a imprimir resultado
    
    CMP     W2, #'a'     // Comparar con 'a'
    B.NE    no_es_a      // Si no es 'a', saltar
    ADD     X1, X1, #1   // Incrementar contador de 'a'

no_es_a:
    B       loop         // Volver al ciclo

imprimir:
    // Convertir el número a ASCII para imprimir
    ADR     X0, buffer   // Cargar dirección del buffer
    ADD     X0, X0, #19  // Moverse al final del buffer
    MOV     X2, #0       // Terminar string con nulo
    STRB    W2, [X0]
    SUB     X0, X0, #1   // Retroceder una posición

    MOV     X2, #10      // Base 10 para la conversión
    MOV     X3, X1       // Copiar el contador a X3

convertir_digito:
    UDIV    X4, X3, X2   // X4 = X3 / 10
    MSUB    X5, X4, X2, X3 // X5 = X3 - (X4 * 10) = X3 % 10
    ADD     W5, W5, #'0' // Convertir a ASCII
    STRB    W5, [X0], #-1 // Guardar en buffer y retroceder
    MOV     X3, X4       // X3 = X3 / 10
    CMP     X3, #0       // Si X3 != 0, continuar
    B.NE    convertir_digito

    // Ajustar X0 para apuntar al primer dígito
    ADD     X0, X0, #1

    // Imprimir la cadena original
    MOV     X8, #64      // Syscall write
    MOV     X0, #1       // File descriptor 1 = STDOUT
    ADR     X1, cadena   // Puntero a la cadena
    MOV     X2, #54      // Longitud de la cadena (ajustar según sea necesario)
    SVC     #0

    // Imprimir mensaje de resultado
    MOV     X8, #64      // Syscall write
    MOV     X0, #1       // File descriptor 1 = STDOUT
    ADR     X1, msg      // Puntero al mensaje
    MOV     X2, #21      // Longitud del mensaje
    SVC     #0

    // Imprimir el resultado
    MOV     X8, #64      // Syscall write
    MOV     X0, #1       // File descriptor 1 = STDOUT
    ADR     X1, buffer   // Puntero al buffer ajustado con el primer dígito
    ADR     X2, buffer   // Calcular longitud restando las direcciones
    ADD     X2, X2, #20
    SUB     X2, X2, X1
    SVC     #0

    // Imprimir un salto de línea
    MOV     X8, #64      // Syscall write
    MOV     X0, #1       // File descriptor 1 = STDOUT
    ADR     X1, newline  // Puntero al salto de línea
    MOV     X2, #1       // Longitud 1
    SVC     #0

    // Terminar programa con código de salida 0
    MOV     X0, #0       // Código de salida 0
    MOV     X8, #93      // Syscall exit
    SVC     #0           // Llamada al sistema

    .data
cadena:
    .asciz  "Overwatch es un juego genial"    // Cadena de ejemplo
msg:
    .asciz  "\nNúmero de letras a: "
newline:
    .asciz  "\n"
buffer:
    .space  20           // Buffer para la conversión del número