// ****************************************************************************
// * 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