Ejercicio lenguaje ensamblador


Debido a que esta semana nos hemos enfocado en resolver ejercicios en lenguaje ensamblador, decidí desarrollar un pequeño programa. El programa nos permite contar la cantidad de veces que aparece un carácter en una cadena de caracteres. Aun que es un ejercicio básico y sencillo ayuda a entender un poco mas sobre el lenguaje ensamblador.
Código completo del programa

Para facilidad de entendimiento me centrare en las distintas etiquetas del programa.

Variables

Las variables las encontramos en el segmentos de datos.

En la linea 3 y 5, vemos dos variables(amblas alienadas a 4 bytes). La variable entryMessage es la que almacena el texto al que queremos buscarle el carácter. Y la variable outMessage es el mensaje que se utilizara para imprimir. Vemos que la variable tiene un %c y un %d, esto nos permite ingresar en este texto un carácter(%c) y un valor decimal(%d). 

Las variables tienen una dirección, y son las que se aprecian en la linea 36 y 37 del código. 

main

Nuestra etiqueta main (encontrada en la linea 9 del código) sera la parte principal del código, y es donde nuestro programa accederá de primero.
En el main de nuestro programa definiremos nuestros parámetros. 
En el registro 0 moveremos el carácter que se desea buscar.
En el registro 1 moveremos un 0, el registro 1 funcionara como el contador de apariciones. (Cada vez que aparezca el carácter que buscamos se le suma 1 al r1)
En el registro 2 moveremos un 0, el registro 2 funcionara como el contador de posicion. (Cada vez que se evalúe un carácter del texto, se pasara al siguiente es decir se le suma 1 al r2)

step1 y addOne

En las etiquetas step1 y addOne encontraremos las instrucciones que básicamente se encargan de resolver el ejercicio.
Y funcionan mas o menos de la siguiente manera:

Cargamos en el registro 5 la dirección de el texto donde que remos buscar.
Cargamos en el registro 4 lo que tenemos en el registro 5 en la posición que contenga el registro 2. Eso nos dará como resultado un solo carácter. (El carácter queda en el registro 4).
Una vez suceda esto sumaremos un 1 a la posición. (r2+1).

Ahora compararemos este carácter para saber si tenemos la letra que buscamos, es otra letra, o si ya llegamos al final.
Como la variable del texto es asciz, esto implica que al final siempre encontraremos un 0, y por eso el primer paso del ciclo es comparar el carácter en r4 con un 0 para saber si ya se llego al final.
Si no ha llegado al final del texto lo compararemos con el carácter buscado. (Que se guardó en el r0)
Si el carácter de r4 es igual al carácter encontrado saltaremos a la etiqueta r1 addOne, que sumara 1 al r1 que es donde se cuentan la cantidad de apariciones, y vuelve al ciclo de step 1 donde se repite el proceso.
Si no hay coincidencias de r4 con el carácter buscado o no es el final, vuelve a iniciarse el ciclo. 
Dado que es un ciclo, este proceso se repetirá hasta encontrar un final. Cuando se encuentre el final del ciclo, saltara a la etiqueta end.

end

En este bloque de instrucciones. Moveremos los contenidos del registro 2 al registro 1. Y los contenidos del registro 0 al registro 1. Y en el registro 0 cargaremos la dirección del mensaje de salida. La linea 32 del código es el llamado a la función de imprimir.
Y las lineas 33 y 34 son las llamadas para terminar el programa.


Prueba de funcionalidad

Usaremos las siguientes instrucciones en el LXTerminal para compilar y correr nuestro codigo.

(cuentaLetra fue el nombre de como yo guardé mi archivo, se debe ingresar en vez de eso el nombre se su archivo).

En el texto "each easter eddie eats eighty easter eggs" queriamos contar la cantidad de apariciones de el caracter 'e'.


Como apreciamos en la imagen el resultado fue:
-Letter e: found 10 times
(Letra e: encontrada 10 veces).

El resultado es correcto.  

each easter eddie eats eighty easter eggs

Fuente: Propia (Axel Mairena Arauz)

Comentarios

Entradas populares de este blog

Arquitectura del conjunto de instrucciones (ISA)

Pipelining