Uno de los elementos más valiosos con los que puede contar cualquier programador bajo
el entorno DOS son, sin duda, las Interrupciones, gracias a ellas podemos dotar a nuestros
programas de funcionales totalmente imprescindibles si queremos hacer programas lo
suficientemente legibles como para llamar la atención del usuario al que va dirigido, es más,
las interrupciones se convierten en un "arma" fundamental si lo que queremos es acceder
a niveles bajos para poder apoderarnos del corazón de nuestra CPU y sacar la máxima
eficiencia de ésta.
En este artículo, os voy a presentar los conceptos generales de los que son las interrupciones,
comentaros algunas ideas y hacer que, al menos, os suenen cuando leaís algún artículo (como el
de la programación del ratón) en dónde se hablan de ellas.
Definición y Tipos de Interrupciones.
La primera cosa de todas, ¿qué son las interrupciones?, bien, las interrupciones son un
"mecanísmo" por medio del cual hacemos que la CPU deje la tarea en la que estaba para
que se vaya a ocupar de otra cosa distinta, es decir, es una forma de llamar la atención
de la CPU de tal forma que cada dispositivo cuando necesita ser atendido por la CPU,
emite una interrupción o señal haciendo que la CPU vaya a atenderla de inmediato. Esto es
importantísimo ya que de no existir interrupciones, la CPU debería de ir preguntando, cada
cierto tiempo, a los dispositivos para ver si necesitan de su intervención y como podeis
suponer, eso significaría lentitud, mucha lentitud.
Por tanto, quedaros con que las interrupciones sirven para controlar el hardware, ya
que son las que llaman a la CPU cuando este, el hardware, necesita la intervención de
la misma.
Las interrupciones se pueden dividir en 2 grupos:
1. Interrupciones de Software. También son conocidas como "falsas interrupciones"
ya que se producen como consecuencia de la ejecución de otra instrucción al no ser
el hardware las que las produce. Otra forma de entender estas interrupciones, es verlas
desde el punto de vista de llamadas a subrutinas, lógicamente, la gracia está en que
esas subrutinas no son nuestras, sino que son las propias de cada sistema operativo,
driver o similar tiene. Quedaros pues, con que somos nostros los que hacemos invocamos a la
interrupción.
Este tipo de interrupción es el más habitual en la programación.
2. Interrupciones de Hardware. Este tipo de interrupción es invocado
directamente por los dispositivos hardware de nuestro ordenador, por lo que "son bastante
más auténticas" que las anteriores. Al producir algún dispositivo hardware la interrupción el
controlador de interrupciones o PIC se encarga de gestionarla determinando, en el caso
de producirse más de una interrupción a la vez, cual de ellas tiene más prioridad y
debe de ser gestionada por la CPU. El funcionamiento de este tipo de interrupciones es
bastante similar y se suele utilizar mucho para la programación de sistemas de comunicaciones.
La Tabla de Vectores de Interrupciones.
Seguro que alguno se ha preguntado, "si cuando llamamos a una interrupción se ejecuta
una determinada rutina...¿dónde narices se encuentra esta rutina?, es más, ¿cómo sabe
nuestra CPU dónde encontrarla?."
Bien, la respuesta a estas dos preguntas (y muchas más) se encuentra en la tabla de
vectores de interrupción. Dicha tabla es una estructura que se crea durante la inicialización
del ordenador y se coloca, en el principio de nuestra memoria (segmento 0 y desplazamiento 0).
Dicha estrucutura ocupa y de forma justa 1Kb, ya que dispone de 256 entradas de 4 bytes cada una.
Lo importante de todo esto es que, dicha estructura, almacena la dirección, en memoria, de las
distintas rutinas que van ligadas a las distintas interrupciones, de tal modo que cuando invocamos,
mediante interrupción software, o se invoca, mediante hardware, una interrupción, lo que
se hace es utilizar un índice que va ligado a la interrupción, de tal manera que, con dicho índice,
se acude a la tabla de vectores de interrupción para que el sistema encuentre la dirección de la rutina
en dónde se encuentra el verdadero tratamiento a la interrupción, es decir, si se produce la interrupción x, lo
que se hace es acudir a la tabla con el índice x para encontrar la entrada (recordar que eran 256 entradas con 4 bytes
cada una) que contiene la dirección en memoria de la rutina que sirve para tratar a la interrupción de índice
x.
Como cada entrada es de 4 bytes, es fácil adivinar que dichos 4 bytes forman la dirección, ya que 2 de esos
bytes se utilizan como segmento y los otros 2 como desplazamiento, total, que ya tenemos la
dirección de memoria con la rutina que hay que utilizar.
Ahora pensar por un momento que somos nostros los que, conociendo la dirección de memoria
de una de esas rutinas, cambiamos dicha rutina por una nuestra para que al producirse
una determinada interrupción ocurra lo que a nosotros nos interese...Como podéis observar,
las posibilidades son muy interesantes, tan sólo tenéis que mirar el efecto de luz del Visualizator v:2.0 (ir
a sencción de Bájate algo interesante), dicho efecto se consiguió poniendo en la
rutina que se encargaba de controlar la interrupción de reloj del sistema, el código necesario
para el efecto de luz, con lo que al producirse la interrupción de reloj se ejecutaba también el
código del efecto y como la interrupción de reloj se produce contínuamente, los efectos
son muy buenos, vamos, que si queréis hacer ese efecto acudiendo a un bucle While lo llevais
claro :-(.
Espero haber despertado, con este artículo, el interés por saber dominar las interrupciones. Si queréis
saber más, tan sólo teneis que buscar información en libros sobre programación de dispositivos tales
como ratón, VGA, etc, en los que se acude siempre a ellas. Ahora mismo estoy pensando
el hacer un artículo sobre como controlar el ratón así que puede que aparezca en esta
actualización de la revista, además, es la mejor forma de entender las interrupciones ¿o no?. ;).