Parte V
Las interrupciones internas son generadas por ciertos eventos que surgen durante la ejecución de un programa.
Este tipo de interrupciones son manejadas en su totalidad por el hardware y no es posible modificarlas.
Un ejemplo claro de este tipo de interrupciones es la que actualiza el contador del reloj interno de la computadora, el hardware hace el llamado a esta interrupción varias veces durante un segundo para mantener la hora actualizada.
Aunque no podemos manejar directamente esta interrupción (no podemos controlar por software las actualizaciones del reloj), es posible utilizar sus efectos en la computadora para nuestro beneficio, por ejemplo para crear un "reloj virtual" actualizado continuamente gracias al contador del reloj interno. Unicamente debemos escribir un programa que lea el valor actual del contador y lo traduzca a un formato entendible para el usuario.
Las interrupciones externas las generan los dispositivos perifericos, como pueden ser: teclado, impresoras, tarjetas de comunicaciones, etc. También son generadas por los coprocesadores.
No es posible desactivar a las interrupciones externas.
Estas interrupciones no son enviadas directamente a la UCP, sino que se mandan a un circuito integrado cuya función es exclusivamente manejar este tipo de interrupciones. El circuito, llamado PIC 8259A, si es controlado por la UCP utilizando para tal control una serie de vias de comunicación llamadas puertos.
Las interrupciones de software pueden ser activadas directamente por el ensamblador invocando al número de interrupción deseada con la instrucción INT.
El uso de las interrupciones nos ayuda en la creación de programas, utilizandolas nuestros programas son más cortos, es más fácil entenderlos y usualmente tienen un mejor desempeño debido en gran parte a su menor tamaño.
Este tipo de interrupciones podemos separarlas en dos categorias: las interrupciones del sistema operativo DOS y las interrupciones del BIOS.
La diferencia entre ambas es que las interrupciones del sistema operativo son más fáciles de usar pero también son más lentas ya que estas interrupciones hacen uso del BIOS para lograr su cometido, en cambio las interrupciones del BIOS son mucho más rápidas pero tienen la desventaja que, como son parte del hardware son muy específicas y pueden variar dependiendo incluso de la marca del fabricante del circuito.
La elección del tipo de interrupción a utilizar dependerá unicamente de las caracteristicas que le quiera dar a su programa: velocidad (utilizando las del BIOS) o portabilidad (utilizando las del DOS).
Propósito: Llamar a diversas funciones del DOS.
Sintaxis:
Int 21H
Nota: Cuando trabajamos en MASM es necesario especificar que el valor que estamos utilizando es hexadecimal.
Esta interrupción tiene varias funciones, para accesar a cada una de ellas es necesario que el el registro AH se encuentre el número de función que se requiera al momento de llamar a la interrupción.
En esta sección unicamente se expone la tarea específica de cada función, para una referencia acerca de los conceptos empleados refierase a la unidad 7, titulada: "Introducción al manejo de archivos".
Uso:
Despliega un caracter a la pantalla.
Registros de llamada:
Ninguno
Esta función nos despliega el caracter cuyo codigo hexagesimal corresponde al valor almacenado en el registro DL, no se modifica ningún registro al utilizar este comando.
Es recomendado el uso de la función 40H de la misma interrupción en lugar de esta función.
Despliega una cadena de carateres en la pantalla.
Ninguno.
Esta función despliega los caracteres, uno a uno, desde la dirección indicada en el registro DS:DX hasta encontrar un caracter $, que es interpretado como el final de la cadena.
Se recomienda utilizar la función 40H en lugar de esta función.
Escribir a un dispositivo o a un archivo.
El uso de esta función para desplegar información en pantalla se realiza dandole al registro BX el valor de 1 que es el valor preasignado al video por el sistema operativo MS-DOS.
Leer un caracter del teclado y desplegarlo.
Con esta función es muy sencillo leer un caracter del teclado, el código hexadecimal del caracter leído se guarda en el registro AL. En caso de que sea un caracter extendido el registro AL contendra el valor de 0 y será necesario llamar de nuevo a la función para obtener el código de este caracter.
Leer caracteres del teclado y almacenarlos en un buffer.
Los caracteres son leídos y almacenados en un espacio predefinido de memoria. La estructura de este espacio le indica que en el primer byte del mismo se indican cuantos caracteres serán leídos. En el segundo byte se almacena el número de caracteres que ya se leyeron, y del tercer byte en adelante se escriben los caracteres leídos.
Cuando se han almacenado todos los caracteres indicados menos uno la bocina suena y cualquier caracter adicional es ignorado. Para terminar la captura de la cadena es necesario darle [ENTER].
Leer información de un dispositivo o archivo.
Abrir archivo FCB
AH = 0FH
Leer secuencialmente un archivo FCB.
Esta función lo que hace es que lee el siguiente bloque de información a partir de la dirección dada por DS:DX, y actualiza este registro.
Escribir secuencialmente a un archivo FCB
La función 15H después de escribir el registro al bloque actual actualiza el FCB.
Crear un archivo FCB.
Se basa en la información proveida en un FCB para crear un archivo en el disco.
Leer en forma aleatoria un archivo FCB.
Esta función lee el registro especificado por los campos del bloque actual y registro actual de un FCB abierto y coloca la información en el DTA (área de transferencia de disco o Disk Transfer Area).
Escribir en forma aleatoria en un archivo FCB.
Escribe el registro especificado por los campos del bloque actual y registro actual de un FCB abierto. Escribe dicha información a partir del contenido del DTA (área de transferencia de disco).
Crear un archivo si no existe o dejarlo en longitud 0 si existe. (Handle)
Esta función sustituye a la 16H. El nombre del archivo es especificado en una cadena ASCIIZ, la cual tiene como característica la de ser una cadena de bytes convencional terminada con un caracter 0.
El archivo creado contendra los atributos definidos en el registro CX en la siguiente forma:
El archivo se crea con los permisos de lectura y escritura. No es posible crear directorios utilizando esta función.
Abre un archivo y regrese un handle
El handle regresado es de 16 bits.
El código de acceso se especifica en la siguiente forma:
Cerrar archivo (Handle).
Esta función actualiza el archivo y libera o deja disponible el handle que estaba utilizando.
Leer de un archivo abierto una cantdad definida de bytes y los almacena en un buffer específico.
Escribe a un archivo ya abierto una cierta cantidad de bytes a partir del buffer designado.
Mover apuntador al archivo (Handle)
El método utilizado se configura como sigue:
Propósito: Llamar a diversas funciones de video del BIOS.
Sintaxis:
Int 10H
Esta interrupción tiene diversas funciones, todas ellas nos sirven para controlar la entrada y salida de video, la forma de acceso a cada una de las opciones es por medio del registro AH.
En este tutorial unicamente veremos algunas de las funciones de esta interrupción.
Posiciona el cursor en la pantalla dentro de las coordenadas válidas de texto.
Las posiciones de localización del cursor son definidas por coordenadas iniciando en 0,0, que corresponde a la esquina superior izquierda hasta 79,24 correspondientes a la esquina inferior derecha. Tenemos entonces que los valores que pueden tomar los registros DH y DL en modo de texto de 80 x 25 son de 0 hasta 24 y de 0 hasta 79 respectivamente.
Desplegar un caracter un determinado número de veces con un atributo definido empezando en la posición actual del cursor.
Esta función despliega un caracter el número de veces especificado en CX pero sin cambiar la posición del cursor en la pantalla.
Desplegar un caracter en la posición actual del cursor.
La única diferencia entre esta función y la anterior es que ésta no permite modificar los atributos, simplemente usa los atributos actuales.
Tampoco se altera la posición del cursor con esta función.
Deplegar un caracter en la pantalla actualizando la posición del cursor.
Propósito: Manejar la entrada/salida del teclado.
Sintaxis:
Int 16H
Veremos dos opciones de la interrupción 16H, estas opciones, al igual que las de otras interrupciones, son llamadas utilizando el registro AH.
Leer un caracter del teclado.
Cuando se utiliza esta interrupción se detiene la ejecución del programa hasta que se introduzca un caracter desde el teclado, si la tecla presionada es un caracter ASCII su valor será guardado en el registro AH, de lo contrario el código de barrido será guardado en AL y AH contendrá el valor 00H.
El código de barrido fué creado para manejar las teclas que no tienen una representación ASCII como [ALT], [CONTROL], las teclas de función, etc.
Leer estado del teclado.
En caso de existir información el registro AH contendrá el código de la tecla guardada en el buffer.
Propósito: Manejar la entrada/salida de la impresora.
Sintaxis:
Int 17H
Esta interrupción es utilizada para escribir caracteres a la impresora, inicializarla y leer su estado.
Escribir un caracter a la impresora.
El puerto a utilizar, definido en DX, se especifica así: LPT1 = 0, LPT2 = 1, LPT3 = 2 ...
El estado de la impresora se codifica bit por bit como sigue:
Los bits 1 y 2 no son relevantes.
La mayoria de los BIOS unicamente soportan 3 puertos paralelos aunque existen algunos que soportan 4.
Inicializar un puerto de impresión.
El puerto a utilizar, definido en DX, se especifica así: LPT1 = 0, LPT2 = 1, etc.
El estado de la impresora se codifica bit por bit como sigue:
Los bits 1 y 2 no son relevantes.
La mayoria de los BIOS unicamente soportan 3 puertos paralelos aunque existen algunos que soportan 4.
Obtener el estado de la impresora.
El puerto a utilizar, definido en DX, se especifica así: LPT1 = 0, LPT2 = 1, etc.
El estado de la impresora se codifica bit por bit como sigue:
Los bits 1 y 2 no son relevantes.
La mayoria de los BIOS unicamente soportan 3 puertos paralelos aunque existen algunos que soportan 4.