Practico 7 Ejercicio 3

Practico 7 Ejercicio 3

de Gianluca Giordano Pignatta -
Número de respuestas: 6

Hola, todo bien?
Mi consulta es sobre como encarar este ejercicio, nos dan operaciones que sirven para obtener las direcciones de las rutinas que hay que ejecutar pero, según tengo entendido, las interrupciones se llaman solas.
Osea no puedo en un main obtener la dirección de la interrupción que se va a llamar y decirle: "atendé esta interrupción". Tendría que hacer polling para eso o no?, en tal caso no parece que sea lo que pide el ejercicio.

Gracias de antemano

En respuesta a Gianluca Giordano Pignatta

Re: Practico 7 Ejercicio 3

de Federico Rivero -

Lo que puede confundir es que 'rutina 1', 'rutina 2' y 'rutina 3' NO son interrupciones, lo que interrumpe es el teclado. Originalmente se está ejecutando un cierto programa, luego, mediante las interrupciones del teclado, se puede pasar a ejecutar las diferentes rutinas. Cada interrupción del teclado corresponde con un nueva tecla presionada en el teclado, y si la sucesión de caracteres presionados es 'ESC' y luego 1, 2 o 3, se pasará a ejecutar alguna de las rutinas. Para pasar a ejecutar alguna de las rutinas es que se precisa las direcciones de las mismas.

Resumiendo, el flujo es:

ejecuta programa ppal

                                          -> interrupción teclado: carácter 'ESC'
                                         <-
ejecuta programa ppal
                                         -> interrpción teclado: carácter '2'
                                                                                                         -> ejecuta rutina 2
                                                                                                         <-
                                              interrupción teclado: carácter 'ESC'

                                         <-
ejecuta programa ppal

...

...


Espero se entienda!

Saludos,

          Federico

En respuesta a Federico Rivero

Re: Practico 7 Ejercicio 3

de Daniel Padron Simon -
Buenas noches, varias dudas:

1) Cuando la interrupción se da ¿es porque tocaron el carácter ESC?, Pregunto porque entonces para leer <2> ¿Se hace en dos interrupciones separadas o como me llega la información por un único byte TECLA?. Ademas, si es asi por dos etapas, ¿como me doy cuenta hasta que ingresan la 2º tecla si era un ESC solo o iba acompañado de algo mas?

2) En el ejemplo que da en el mensaje de arriba parece que la rutina 2 termina por si sola, ¿Esta termina en realidad porque se ejecuto ESC?

3) Se podrían ejecutar rutinas tras rutinas? Algo así como Rutina 1, Rutina 2, y luego de hacer ESC a la rutina 2, volver en donde se quedo la 1?, o solo se puede ir a un nivel de profundidad.
Pregunto esto ultimo porque yo estaba pensando en implementar una pila para mantener las direcciones y luego iras retomando. Pero no me queda claro del todo si eso es lo que se busca.

4) una vez que llamo a jmp para llamar a la otra rutina, ¿deberia ejecutar enabled()? Porque si no lo hago en realidad no se debería ejecutar de nuevo la interrupción  para cancelar la rutina recién llamada. Pero si hago esto, ¿no corro el riesgo que justo apenas hago enabled() antes de llamar a jmp, aparezca alguna interrupción y no me permita llegar al jmp?

Les pido me pueden aclarar esto

Saludos y gracias
Daniel
En respuesta a Daniel Padron Simon

Re: Practico 7 Ejercicio 3

de Federico Rivero -
Hola, buen día!

1) Cuando la interrupción se da ¿es porque tocaron el carácter ESC?, Pregunto porque entonces para leer <2> ¿Se hace en dos interrupciones separadas o como me llega la información por un único byte TECLA?. Ademas, si es asi por dos etapas, ¿como me doy cuenta hasta que ingresan la 2º tecla si era un ESC solo o iba acompañado de algo mas?

La interrupción del teclado se da cuando se presiona cualquier tecla. En el byte de TECLA puede venir ESC, 1, 2, 3, o cualquier otro carácter válido. O sea que, sí, para poder cambiar desde el programa principal a una rutina tienen que ocurrir 2 interrupciones, la primera tiene que ser porque se presionó ESC, y la siguiente tiene que ser porque se presionó 1, 2 o 3.  En este sentido, hay que usar variables para recordar qué pasó en la última interrupción, como mínimo tenés que tener una variable que recuerde si la última tecla presionada fue ESC, porque si en la rutina recibís un 1, pero la última tecla presionada no fue ESC, entonces ese 1 se debe ignorar. Por el contrario, si la última tecla presionada fue ESC, entonces hay que saltar a la rutina 1.

2) En el ejemplo que da en el mensaje de arriba parece que la rutina 2 termina por si sola, ¿Esta termina en realidad porque se ejecuto ESC?

Capaz no me quedó claro el diagrama, pero no, lo que intenté mostrar es que de la rutina 2 se salta a la interrupción, y la única manera de cambiar el flujo hacia una interrupción (en esta asignatura, al menos), es mediante la ocurrencia de una interrupción. O sea que no, la rutina 2 no termina por sí sola, la asumimos infinita.

3) Se podrían ejecutar rutinas tras rutinas? Algo así como Rutina 1, Rutina 2, y luego de hacer ESC a la rutina 2, volver en donde se quedo la 1?, o solo se puede ir a un nivel de profundidad.
Pregunto esto ultimo porque yo estaba pensando en implementar una pila para mantener las direcciones y luego iras retomando. Pero no me queda claro del todo si eso es lo que se busca.

No, si estás en la rutina 1, 2 o 3 solo se puede volver al programa principal. Esto lo podés deducir porque para saltar hacia una rutina tenés que presionar ESC y luego un número, pero para volver al principal se realiza solo con ESC. De este modo, si estás en una rutina, no podés saltar hacia otra porque al presionar ESC ya volvés hacia el programa principal.

4) una vez que llamo a jmp para llamar a la otra rutina, ¿deberia ejecutar enabled()? Porque si no lo hago en realidad no se debería ejecutar de nuevo la interrupción  para cancelar la rutina recién llamada. Pero si hago esto, ¿no corro el riesgo que justo apenas hago enabled() antes de llamar a jmp, aparezca alguna interrupción y no me permita llegar al jmp?

Bien pensado! Muestra un buen nivel de entendimiento que te hayas dado cuenta de esto :). No es necesario, suponé que la función jmp() también habilita las interrupciones para evitar este problema. Lo normal es que al regresar de una interrupción, se use una instrucción especial de la arquitectura que incluya la habilitación de las interrupciones (en x86 se llama IRET).

Saludos,
Federico
En respuesta a Federico Rivero

Re: Practico 7 Ejercicio 3

de Maria Soledad Techera Gomez -
Buenas,

Me queda la duda acerca de presionar ESC para terminar una rutina.
Cuando se esta ejecutando una RUTINA y se presiona ESC, esto produce la interrupcion. Si se llama a la funcion padr() en ese momento, esta no continuaria ejecutando la RUTINA en vez del programa X?

La otra duda es si hay que utilizar jmp para volver al programa principal o no.

Gracias.
Saludos
En respuesta a Maria Soledad Techera Gomez

Re: Practico 7 Ejercicio 3

de Federico Rivero -
Buenas!

Cuando se esta ejecutando una RUTINA y se presiona ESC, esto produce la interrupcion. Si se llama a la funcion padr() en ese momento, esta no continuaria ejecutando la RUTINA en vez del programa X?

Lo que decís es correcto, para poder retornar al programa principal tendrías que recordar en qué lugar fue interrumpido, quizás habría que usar padr() pero en otro lugar...  (la dejo picando para no quemar el ejercicio, cualquier cosa preguntá de nuevo)

Saludos,
Federico