Está en la página 1de 7

Practica 4

Programación con subrutinas


El juego del Ahorcado

Matías Sánchez Beltrán


Introducción:

Para el desarrollo de esta práctica se ha pedido un programa que simule el juego del ahorcado,
se ha dejado libertad a la hora de diseñar el programa con el fin de que todos los juegos sean
únicos.

Para el juego desarrollado, las letras han de ser acertadas en orden, es decir, si la primera
palabra es ‘hola’, al introducir la primera letra esta ha de ser ‘h’, si fuese por ejemplo ‘a’,
incluida en la palabra, pero no en la posición requerida, esto sería considerado como fallo

Se han establecido 3 errores máximos por palabra, si habiendo fallado la letra 3 veces
seguidas, se comete un cuarto fallo se acabaría el juego.

El progreso en el juego se muestra con la ultima letra acertada, y con las que faltan
representadas mediante guiones

Pseudocodigo:

Inicializar nfallos=3, npalabras=6, tamañomax=10, nerrores=0, cadena de


caracteres=palabra1palabra2…palabra6

Imprimir enunciado

Para i=0 hasta i=npalabras hacer

Si i > npalabras fin juego

Else

Tamañopalabra=0

Para k=0 hasta k=tamanomax leer caracter

If carácter =! 0

Escribir guiones

Tamañopalabra ++

Else end para

Para j=0 hasta j= tamañopalabra pedir al usuario que meta una letra

Si j> tamaño palabra leer siguiente palabra

Else

Si letra es correcta entonces


Escribir letra y guiones para rellenar las que queden

Volver a pedir letra

Else imprimir enunciado de fallo y numero de errores +1

Si numero de errores >3

Fin juego

Else volver a pedir letra

End para

End para

Uso de registros:

_start:

R0->argumentos de entrada/salida de funciones read y print

R7->desplazamiento a la siguiente palabra

R8->i

R12->dirección de cadena de caracteres(más el offset correspondiente)

R4->numero de caracteres de la palabra

R5->bytes de la palabra

R9->j

Tamanopalabra:

R0->k

R2->carácter leido

R12->direccion de la palabra de la cadena de caracteres


Adivinar:

R0->entrada/salida de las funciones read y print

R4->numero de caracteres de la palabra

R5->direccion de la palabra

R7->numero de caracteres de la palabra -1

R8->para imprimir tantos guiones como letras queden sin adivinar

R9->j

R10->numero de fallos

Depuración:

En el proceso de depuración se han corregido numerosos errores.

La función adivinar ha sido la más problemática puesto que es la más compleja y algunos de
los errores corregidos depurando el código han sido:

Había puesto strb en vez de ldrb, para leer los caracteres.

Otro error corregido en dicha función fue el meter en r0 a la función de escritura no la


dirección desde donde tiene que escribir, sino el valor que tiene que escribir, un despiste
localizado al ver el valor que tomaba r0 depurando, puesto que tomaba valores tipo
616261(caracteres ascii) en vez de la dirección de memoria donde se localizaba la palabra.

También hubo el error en el salto al inicio de la función, puesto que al volver con un b, saltaba
a la etiqueta ADIVINAR:STMDB SP!, {R4-R11, LR}, de esta forma pisaba el valor de los registros
otra vez y saltaba error en la consola:

Este error se comunico a la profesora, en busca de ayuda, pero se pudo solucionar por cuenta
propia antes de su respuesta creando una etiqueta justo debajo para que no pisase los
registros otra vez.

Otros errores no relativos a dicha función han sido bastante más fáciles de arreglar puesto que
han sido ciclos que daban una vuelta de más o de menos.
Consideraciones:

Aunque el registro 12 no se deba usar para guardar variables permanentes lo he usado puesto
que en cada ciclo dentro del for vuelvo a meter la dirección inicial de la palabra en 12, no me
da tiempo a pensar como cambiarlo.

Se han creado varias funciones a partir de las dadas por los profesores, uartprint2 para
imprimir sin salto de línea, escrpalabra_ para escribir tantos guiones como letras tenga la
palabra en cuestión, y uarprintcaracter para escribir solo un carácter.

Consideración importante: Al principio del juego hay un error del simulador con overflow de la
pila, comentado a la profesora en clase, que hace que en uno de los enunciados principales se
coma una letra y haya que darle dos veces a continue, después de eso el programa funciona
correctamente

Cuando se ejecuta el programa varias veces, el simulador empieza a dar errores y hay que usar
otro nuevo

Preguntas:

1) Direcciones de memoria de todas las funciones realizadas y cómo se han determinado


esas direcciones de memoria.

Las direcciones de memoria se miran en la pestaña Symbols:

_start:

TAMANOPALABRA:

ADIVINAR:

uartprint:

uartprint2:

uartread:

escrpalabra_:

uartprintcaracter:
2) Uso de la pila por parte de los programas realizados, ¿cuántos bytes en total?

El tamaño total del programa es de 688 bytes:

Se ha usado la pila en las funciones ADIVINAR y escrpalabra_

En la función ADIVINAR se han preservado y restaurado al finalizar los valores de los registros
R4 a R11:

El tamaño de la pila en esta función es de 8(reg)*4B + 4B(lr)=36B

En la función escrpalabra_ se han preservado y restaurado al finalizar los valores de los


registros R4 a R7:

El tamaño de la pila en esta función es de 4(reg)*4B + 4B(lr)=20B

A continuación, se muestran varios ejemplos del desarrollo del juego, sin errores y con
errores

Sin errores:
                                                                                                    
Con errores:

Sobrepasando el numero de errores permitido:

Finalizando el juego correctamente con 6 palabras, siendo la ultima ‘sol’:

También podría gustarte