Explicación de código para contar letras - Simple

Explicación de Código

A continuación se explicara de la manera mas simple posible el código creado en la clase de Arquitectura de Computadores para poder contar cuantas vocales y consonantes tiene una oración o palabra ya definida anteriormente. En este código tomamos todo lo que no sea una vocal como consonante.El único valor que dejamos sin contar es el espacio, por ejemplo: el arreglo de caracteres "hola mundo!" tiene 4 vocales y 6 consonantes. Debemos tomar en cuenta que este programa solo funciona con letras minúsculas. El programa completo final acepta mayúsculas e incluso separa a los caracteres que no son letras, sin embargo deseo explicar este algoritmo incompleto ya que me parece interesante la manera rápida en que es resuelto.

Para iniciar veremos que se encuentra en el segmento de data:


Como podemos ver en la imagen anterior en "separar" se encuentra el fragmento de texto que deseamos separar en cantidad de vocales y consonantes, en "uno" se encuentra simplemente el fragmento de texto que se imprimirá en pantalla. Recordemos usar el .asciz, sobre todo en "separar" debido a que es muy importante para el programa.

Ahora que sabemos que información esta guardada en el segmento de datos podemos explicar que esta sucediendo en el segmento de texto.
Primero debemos definir algunas cosas:

Con estos datos importamos el printf de la librería de C y ademas guardamos las posiciones de nuestros datos en lo que se podrían llamar "variables".

En la primera etiqueta (main) lo que hacemos es definir los contadores de las letras en registros diferentes, en nuestro caso el contador de vocales estará en r5 y el de consonantes en r4. También definimos r6 como un contador que nos ayudara a movernos carácter por carácter en el texto con el que trabajamos. Tras definir esto, inmediatamente saltamos a la segunda etiqueta (start). En start primero movemos el texto a separar al registro r2, después  guardamos en el registro r1 el carácter del en la posición r6 del texto guardado en r2. Finalmente para acabar esta parte sumamos 1 al contador en r6.
Por ejemplo si tenemos que r2 = "hola" y r6 = 1, entonces al hacer ldrb r1, [r2,r6] encontraríamos una "o" en r1.
Después de la etiqueta "start" inicia la etiqueta "process".

                 
                 
Lo primero que hacemos en la etiqueta de "process" es comparar r1 con cero (esto significa que llegamos al final del fragmento de texto), si son iguales saltamos a la etiqueta "end", de lo contrario ignoramos el salto. A continuación haremos 5 comparaciones (comparaciones entre r1 y cada vocal por separado), en caso de que el r1 sea igual a cierta vocal saltamos a la etiqueta "countvocal" de lo contrario ignoramos el salto. Como vemos en la imagen de la derecha el trabajo de "countvocal" es sumar uno al contador de vocales y luego saltar a la etiqueta "start" para crear un bucle. En caso de que ninguna comparación se cumpla, comparamos r1 con el espacio vació, si son iguales simplemente retornamos a "start" en caso contrario contamos una consonante y saltamos a "start".

En caso de que r1 sea igual a 0, en otras palabras la primera comparación de "process" sea correcta, saltamos a end.

Lo único que se hace en esta etiqueta es imprimir el texto con la respuesta (cuantas vocales y cuantas consonantes tiene el texto) y luego sale del programa.

Como mencionamos al inicio de esta entrada, ya tenemos una manera mejorada de crear este programa con unas cuantas funciones extras, sin embargo explicarlo es mucho mas complicado que el código recién presentado. En otras palabras si se desea hacer un algoritmo parecido a este, se puede tomar el programa que se acaba de explicar como base o como guía.


Fuentes
En esta entrada no se requirieron fuentes externas, lo único utilizado fue la materia que se ha explicado en el curso de arquitectura.

Comentarios

Entradas populares de este blog

Arquitectura del Set de Instrucciones y Conjunto de Instrucciones

Representación de Números: Punto Fijo