A ‚stas alturas del curso estar‚is diciendo: bueno, vale, he aprendido
a mover registros, a meterlos en la pila, etc,... ¨ pero cómo actúo con
el exterior ?. Porque por mucho registro que tenga no voy a escribir por
ejemplo un car cter en la pantalla. Bieeeeeen, pues aquà est , son las
interrupciones.
La primera cosa que tenemos que hacer es saber como funcionan las
interrupciones. Son principalmente subrutinas de la BIOS o el DOS que
pueden ser llamadas por un programa, por ejemplo la función 21h est
dedicada especialmente a tratamiento de archivos.
Para utilizarlas, tendremos que poner los registros con un determinado
valor para que se realice el propósito que buscamos. Cada interrupción
tiene varias funciones, y podremos elegir cual ejecutamos según el valor
de AH.
El formato de la órden es INT X, donde X puede ir desde 1 a 255 ( aunque
normalmente se escribe en formato hexadecimal ).
Cuando se ejecuta una interrupción, el ordenador empuja todos los flags
a la pila, un 'PUSHF', y despu‚s mira en la tabla de vectores de
interrupción, de la que hablar‚ m s adelante, para transferir el control
del programa al punto que indica esa tabla respecto a la interrupción
pedida mediante un 'CALL'. Cuando la interrupción ha terminado, acabar con
un IRET, que es una combinación entre 'POPF' y 'RET'.
La tabla de Vectores de Interrupción es una tabla de direcciones para
la dirección a la que debe saltar cada interrupción. Comienza en la
dirección de memoria 0000:0000 y acaba en la 0000:0400, siendo cada
dirección de 4 bytes de longitud. Para averiguar cual corresponde a cada
interrupción, no hay m s que multiplicar el número de interrupción por
cuatro. Por ejemplo, la dirección de memoria donde est el punto al que
salta una INT 21h, es 0000:21h*4. Ahà se contienen el CS e IP a los que
saltar el programa cuando se ejecute la interrupción. Estos valores, son
modificables, pero hay que tener mucho cuidado con ello.
Y ahora voy a ponerme algo m s mundano, si no hab‚is entendido ‚sto al
menos saber 'qu‚ hace', quiz asà adem s los que os hay is perdido pod is
retornar m s adelante. Vamos con un ejemplo de uso de una interrupción:
jmp mesaltomsg     ; Esto lo hago porque ejecutar el texto
;puede traer consecuencias imprevisibles
archivo:       db 'c:\command.com',0 ; el 0 que va despu‚s es necesario
; en operaciones con archivos, o no
; funcionar .
mesaltomsg:    mov ax,4100h       ; Al ir a llamar a la interrupción, AH
;( que aquà es 41h ), indica la función
;de dicha interrupción que se quiere
;ejecutar. En ‚ste caso es la 41h, que
;significa borrar un fichero
mov dx,OFFSET archivo  ; En dx cargamos la dirección del
;offset con la etiqueta archivo,
;o sea, si la etiqueta archivo est
;en :0014h, ese ser ahora el valor
;de DX. Como vemos, no sólo basta
;con tener AX actualizado para poder
;usar la interrupción.
Int 21h                ; Ejecutamos la interrupción 21h en
;su función 41h, borrar un fichero.
Voy a detallar un poco m s, ¨ por qu‚ en dx pongo la dirección del offset
de archivo ?. Porque la función de la Int21h que busco necesita par metros.
Cuando AH vale 41h, función de borrar fichero, necesita ciertos par metros,
y ‚sto es que en DS:DX se encuentre la cadena de caracteres que indica el
fichero a buscar.
Como DS vale lo mismo que CS si no lo hemos cambiado, tan sólo hace
falta hacer que DX apunte al lugar donde est la cadena de caracteres con
el nombre del archivo.
Vamos con otro ejemplo. Ahora, queremos cambiar el nombre de un fichero.
La interrupción para ello es la 21h, y la función que queremos es la 56h,
con lo que en AH tendremos que poner ese valor.
El par DS:DX, es la dirección de la cadena que contiene la unidad, camino
y nombre del fichero, tal y como sucedÃa en el anterior ejemplo, y ES:DI
la dirección de la cadena que contiene la nueva unidad, camino y nombre.
Vamos con el programa:
Mov    ah,56h                 ; No hace falta inicializar al, como
;hicimos antes, no tiene ninguna
;importancia su contenido.
Mov    dx,OFFSET anterior     ; Ds ya est apuntando a ‚ste segmento,
;sólo tendremos que asignar Dx
Mov    di,OFFSET posterior    ; Di apunta al nuevo nombre, Es no ha
;sido variado de ninguna manera.
Int    21h                    ; Si en ‚ste directorio de halla el
;archivo de DS:DX, cambia su nombre al
;de ES:DI
Int    20h                    ; Devuelve el control al Ms-dos.
anterior:      db 'berilio.com',0
posterior:     db 'magnesio.com',0
En resumen, cambiar el nombre del archivo berilio.com a magnesio.com
si ‚ste se encuentra en el directorio.
Hay innumerables cosas que se pueden hacer con las interrupciones:
escribir textos, leer del teclado, cambiar modos de pantalla, escribir
en archivos, leerlos, ejecutarlos,... demasiado para ponerlo aquÃ, aunque
al final del curso os podr‚is encontrar m s ejemplos.
Recomiendo tener a mano la lista de interrupciones de Ralf Brown, que
es una aut‚ntica biblia de las interrupciones, o las guÃas Norton. El caso
es que es imposible sab‚rselas de memoria, y es mejor tener una buena
obra de consulta al lado. La lista de interrupciones de Ralf Brown es
f cil de encontrar, y ocupa cerca de un disco completo, con largos archivos
de texto, y se actualiza de vez en cuando.
Para dar una idea en general y que sep is cómo buscar lo que necesit is,
aquà est n las interrupciones que m s se usan y sus funciones en general,
sÃmplemente para orientaros al buscar.
Interrupción 21h: Apuesto a que es la que m s utilizar‚is, con ella se
consigue el acceso a la fecha y hora del sistema, gestión de ficheros,
funciones de dos referidas al disco, para la gestión de directorios, y
algunas de lectura/escritura en el teclado y pantalla, adem s de la gestión
de la memoria.
Interrupción 13h: Funciones de BIOS que se refieren al disco.
Interrupción 10h: Gestión de la pantalla en modo alfanum‚rico, gestión
de la pantalla en modo gr fico.
Interrupciones 25h y 26h: Funciones de dos de acceso directo al disco,
escribir y leer sectores...
Interrupción 17h: Impresora.