GNU/Linux xterm-256color bash 198 views

// ****************************************************************************
// * Lenguajes de Interfaz en TECNM Campus ITT
// * Nombre del archivo: practica.s
// * Descripción: Programa que detecta cuantas "B" hay en una cadena y la cuenta 
// * Autor: [America Fernanda Nevarez de la Cruz]
// * Fecha: [2025-04-08]
// * Plataforma: Raspberry Pi OS (64 bits)
// * Demostración:  [https://asciinema.org/a/kaVEaZPruz2cmAvcKMjkJpaXU]
// ****************************************************************************

// ****************************************************************************
// * Codigo equivalente en Javascript
// *
// * Versión para Node.js/consola
// *
// *const readline = require('readline').createInterface({
// *    input: process.stdin,
// *    output: process.stdout
// *});
// *
// *readline.question("// *Ingrese una cadena: ", (texto) => {
// *    const cantidad = contarLetrasB(texto);
// *    console.log(`// *La cadena tiene ${cantidad} letras B/b`);
// *    readline.close();
// *});
// *
// ****************************************************************************
.section .bss
input_buffer: .skip 64      // Buffer de entrada
number_buffer: .skip 16     // Buffer para número convertido a texto

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

msg_resultado: .ascii "Cantidad de letras B: "
len_resultado = . - msg_resultado

newline: .ascii "\n"
len_nl = . - newline

.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 entrada
    mov x3, #0              // contador de letras b/B

check_loop:
    cbz x2, done_check

    ldrb w4, [x1], #1       // leer siguiente byte
    sub x2, x2, #1          // disminuir contador

    cmp w4, #'b'
    beq inc_count
    cmp w4, #'B'
    beq inc_count
    b check_loop

inc_count:
    add x3, x3, #1
    b check_loop

done_check:
    // Mostrar mensaje del resultado
    ldr x0, =msg_resultado
    mov x1, #len_resultado
    bl print_msg

    // Mostrar cantidad (x3)
    mov x0, x3
    bl print_number

    // Imprimir salto de línea
    ldr x0, =newline
    mov x1, #len_nl
    bl print_msg

    // Salir
    mov x8, #93
    mov x0, #0
    svc #0

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

// -------------------------------------------
// Función print_number (x0 = número)
print_number:
    mov x1, x0
    ldr x2, =number_buffer
    add x2, x2, #15         // apuntar al final del buffer
    mov w3, #0

convert_loop:
    mov x4, #10
    udiv x5, x1, x4
    msub x6, x5, x4, x1     // x6 = x1 - x5 * 10
    add x6, x6, #'0'        // convertir a ASCII
    strb w6, [x2], #-1
    mov x1, x5
    add w3, w3, #1
    cbnz x1, convert_loop

    add x2, x2, #1
    mov x1, x2
    mov w2, w3
    mov x0, #1
    mov x8, #64
    svc #0
    ret