#Realiza un programa que lea una cadena mediante una llamada al sistema e incluya una subrutina que calcule
#cuantas vocales tiene (cuantas letras a, e, i, o y u). Las letras a, e,i, o, u se declararan en el
#segmento de datos y se le pasaran como argumentos a la funcion, junto con el puntero a la cadena. Los resultados
#serun los contadores de letras a, e, i, o y u. La funcion main imprimira dichos resultados.
.data
cadena: .asciiz "\nIntroduzca una cadena: "
cadleida: .space 100
letras: .byte 'a', 'e', 'i', 'o', 'u'
cadres: .asciiz "\nEl nœmero de letras, a, e, i, o y u es: "
separa: .asciiz " "
.text
.globl main
main:
li $v0, 4 #Llamada al sistema para imprimir una cadena
la $a0, cadena #Puntero a la cadena a imprimir
syscall
li $v0, 8 #Llamada al sistema para leer una cadena
la $a0, cadleida #Puntero al espacio reservado
li $a1, 100 #Longitud maxima de la cadena le’da
syscall
la $a0, cadleida #Argumento 1: puntero a la cadena le’da
lb $a1, letras #Argumento 2: letra a
lb $a2, letras + 1 #Argumento 3: letra e
lb $a3, letras + 2 #Argumento 4: letra i
lb $t0, letras + 3 #Argumento 5: letra o
addi $sp, $sp, -1 # Va en la pila
sb $t0, ($sp)
lb $t0, letras + 4 #Argumento 6: letra u
addi $sp, $sp, -1 # Va en la pila
sb $t0, ($sp)
jal cuentavocales
move $t0, $v0
li $v0, 4 #Llamada al sistema para imprimir una cadena
la $a0, cadres #Puntero a la cadena a imprimir
syscall
li $v0, 1 #Llamada al sistema para imprimir una cadena
move $a0, $t0 #Imprimimos el nœmero de letras a (resultado $v0 de la función
syscall
li $v0, 4 #Llamada al sistema para imprimir una cadena
la $a0, separa #Puntero a la cadena a imprimir
syscall
li $v0, 1 #Llamada al sistema para imprimir una cadena
move $a0, $v1 #Imprimimos el numero de letras e (resultado $v1 de la función
syscall
li $v0, 4 #Llamada al sistema para imprimir una cadena
la $a0, separa #Puntero a la cadena a imprimir
syscall
lw $t0, ($sp) # Desapilamos el 5¼ resultado (nœmero de letras u)
addi $sp, $sp, 4
lw $t1, ($sp) # Desapilamos el 4¼ resultado (nœmero de letras o)
addi $sp, $sp, 4
lw $t2, ($sp) # Desapilamos el 3er resultado (nœmero de letras i)
addi $sp, $sp, 4
li $v0, 1 #Llamada al sistema para imprimir una cadena
move $a0, $t2 #Imprimimos el nœmero de letras i
syscall
li $v0, 4 #Llamada al sistema para imprimir una cadena
la $a0, separa #Puntero a la cadena a imprimir
syscall
li $v0, 1 #Llamada al sistema para imprimir una cadena
move $a0, $t1 #Imprimimos el nœmero de letras o
syscall
li $v0, 4 #Llamada al sistema para imprimir una cadena
la $a0, separa #Puntero a la cadena a imprimir
syscall
li $v0, 1 #Llamada al sistema para imprimir una cadena
move $a0, $t0 #Imprimimos el nœmero de letras u
syscall
li $v0, 10 #Llamada al sistema para finalizar el programa
syscall
#Funci—n que cuenta el nœmero de vocales que hay en la cadena que se le pasa como argumento
cuentavocales:
li $v0, 0 #Contador de letras a
li $v1, 0 #Contador de letras e
li $t0, 0 #Contador de letras i
li $t1, 0 #Contador de letras o
li $t2, 0 #Contador de letras u
lb $t3, ($sp)#Desapilo la letra u
addi $sp, $sp, 1
lb $t4, ($sp) #desapilo la letra o
addi $sp, $sp, 1
bucle:
lb $t5, ($a0) #Leo un caracter de la cadena origen
beqz $t5, fin #Si es el fin de cadena, he acabado de leer
beq $t5, $a1, esletraa #Compruebo si es la letra a
beq $t5, $a2, esletrae #Compruebo si es la letra e
beq $t5, $a3, esletrai #Compruebo si es la letra i
beq $t5, $t4, esletrao #Compruebo si es la letra o
beq $t5, $t3, esletrau #Compruebo si es la letra u
sigue:
addi $a0, $a0, 1 #Actualizo el puntero
j bucle
esletraa:
addi $v0, $v0, 1 #Actualizo el contador de letras a
j sigue
esletrae:
addi $v1, $v1, 1 #Actualizo el contador de letras e
j sigue
esletrai:
addi $t0, $t0, 1 #Actualizo el contador de letras i
j sigue
esletrao:
addi $t1, $t1, 1 #Actualizo el contador de letras o
j sigue
esletrau:
addi $t2, $t2, 1 #Actualizo el contador de letras u
j sigue
fin:
addi $sp, $sp, -4
sw $t0, ($sp) #Apilo el Contador de letras i
addi $sp, $sp, -4
sw $t1, ($sp) #Apilo el Contador de letras o
addi $sp, $sp, -4
sw $t2, ($sp) #Apilo el Contador de letras u
jr $ra