GNU/Linux xterm-256color bash 199 views

// ****************************************************************************
// * Nombre del archivo: practica.s
// * Descripción: Programa que da la cantidad de consonantes
// * Autor: Roldan Castro Luis Alberto
// * Fecha: 10-04-2025
// * Plataforma: Raspberry Pi OS (64 bits)
// * Asciinema: https://asciinema.org/a/1xd6kgJo4REpiaBNjv8gQTfya
// ****************************************************************************

// ****************************************************************************
// Version en C++
//
//#include <iostream>
//#include <cctype>
//
//using namespace std;
//
// Función para contar consonantes en una cadena
//int contarConsonantes(const string& cadena) {
//    int contador = 0;
//    for (char c : cadena) {
//        char letra = tolower(c); // Convertimos a minúscula para simplificar la comparación
//        if (isalpha(letra) && letra != 'a' && letra != 'e' && letra != 'i' && letra != 'o' && letra != 'u') {
//            contador++; // Incrementamos si es una consonante
//        }
//    }
//    return contador;
//}
//
//int main() {
//    string texto;
//    
//    // Pedimos al usuario que ingrese una cadena
//    cout << "Ingrese un texto: ";
//    getline(cin, texto);
//    
//    // Contamos e imprimimos la cantidad de consonantes
//    int cantidadConsonantes = contarConsonantes(texto);
//    cout << "Número de consonantes en el texto: " << cantidadConsonantes << endl;
//
//    return 0;
//}
// ****************************************************************************

.section .bss
input_buffer: .skip 64

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

msg_resultado: .ascii "Cantidad de consonantes: "
len_resultado = . - msg_resultado

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

.section .text
.global _start

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

    // Leer entrada
    mov x0, #0
    ldr x1, =input_buffer
    mov x2, #64
    mov x8, #63
    svc #0

    // Preparar para análisis
    ldr x1, =input_buffer
    mov x2, x0
    mov x3, #0              // contador de consonantes

check_loop:
    cbz x2, done_check

    ldrb w4, [x1], #1
    sub x2, x2, #1

    // Verificar si es letra (A-Z o a-z)
    mov w5, w4
    cmp w5, #'A'
    blt check_loop
    cmp w5, #'Z'
    ble is_upper_letter

    cmp w5, #'a'
    blt check_loop
    cmp w5, #'z'
    bgt check_loop

    b check_if_vowel

is_upper_letter:
    b check_if_vowel

check_if_vowel:
    // Comprobar si es vocal (minúsculas)
    cmp w4, #'a'
    beq check_loop
    cmp w4, #'e'
    beq check_loop
    cmp w4, #'i'
    beq check_loop
    cmp w4, #'o'
    beq check_loop
    cmp w4, #'u'
    beq check_loop

    // Comprobar si es vocal (mayúsculas)
    cmp w4, #'A'
    beq check_loop
    cmp w4, #'E'
    beq check_loop
    cmp w4, #'I'
    beq check_loop
    cmp w4, #'O'
    beq check_loop
    cmp w4, #'U'
    beq check_loop

    // Si llegamos aquí, es una letra y no es vocal → consonante
    add x3, x3, #1
    b check_loop

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

    mov x0, x3
    bl print_number

    ldr x0, =newline
    mov x1, #len_nl
    bl print_msg

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

// ---------------------------------------
print_msg:
    mov x2, x1
    mov x1, x0
    mov x0, #1
    mov x8, #64
    svc #0
    ret

// ---------------------------------------
print_number:
    mov x1, x0
    ldr x2, =input_buffer
    add x2, x2, #63
    mov w3, #0

convert_loop:
    mov x4, #10
    udiv x5, x1, x4
    msub x6, x5, x4, x1
    add x6, x6, #'0'
    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