GNU/Linux xterm-256color bash 205 views

// ****************************************************************************
// * Lenguajes de Interfaz en TECNM Campus ITT
// * Nombre del archivo: practica.s
// * Descripción: Programa que detecta si una cadena tiene letras "A"
// * Autor: [America Fernanda Nevarez de la Cruz]
// * Fecha: [2025-04-10]
// * Plataforma: Raspberry Pi OS (64 bits)
// * Demostración:  [https://asciinema.org/a/K81qGx8xfGJLEIka1a7NhwH1n]
// ****************************************************************************

// ****************************************************************************
// * Codigo equivalente en C
// *#include <stdio.h>
// *#include <ctype.h>
// *
// *int contar_letras_A(const char* texto) {
// *    int contador = 0;
// *    while(*texto) {
// *        if(toupper(*texto) == 'A') {
// *            contador++;
// *        }
// *        texto++;
// *    }
// *    return contador;
// *}
// *
// *int main() {
// *    char entrada[100];
// *    
// *    printf("// *Ingrese una cadena de texto: ");
// *    fgets(entrada, sizeof(entrada), stdin);
// *    
// *    int cantidad = contar_letras_A(entrada);
// *    printf("// *La cadena tiene %d letras 'A' o 'a'\n", cantidad);
// *    
// *    return 0;
// *}

// ****************************************************************************
.section .bss
input_buffer: .skip 64

.section .data
msg_pedir: .ascii "Ingrese una cadena: "
len_pedir = . - msg_pedir

msg_si: .ascii "Hay letra A\n"
len_si = . - msg_si

msg_no: .ascii "No hay letra A\n"
len_no = . - msg_no

.section .text
.global _start

_start:
    // Mostrar mensaje de entrada
    ldr x0, =msg_pedir
    mov x1, #len_pedir
    bl print_msg

    // Leer entrada del usuario
    mov x0, #0              // stdin
    ldr x1, =input_buffer
    mov x2, #64
    mov x8, #63             // syscall read
    svc #0

    // Configurar registros para el escaneo
    ldr x1, =input_buffer
    mov x2, x0              // longitud de lo leído
    mov x3, #0              // bandera de encontrado

check_loop:
    cbz x2, done_check      // fin del buffer

    ldrb w4, [x1], #1       // leer un byte
    sub x2, x2, #1          // reducir contador

    cmp w4, #'a'
    beq found
    cmp w4, #'A'
    beq found

    b check_loop

found:
    mov x3, #1              // marcar que se encontró
    b done_check

done_check:
    cmp x3, #1
    beq mostrar_si

    // Si no se encontró
    ldr x0, =msg_no
    mov x1, #len_no
    bl print_msg
    b fin

mostrar_si:
    ldr x0, =msg_si
    mov x1, #len_si
    bl print_msg

fin:
    mov x8, #93
    mov x0, #0
    svc #0

// -------------------------------------------
// Función print_msg
// x0 = puntero, x1 = longitud
print_msg:
    mov x2, x1     // longitud
    mov x1, x0     // puntero al mensaje
    mov x0, #1     // stdout
    mov x8, #64
    svc #0
    ret