Story Transcript
UNIVERSIDAD DEL VALLE DE GUATEMALA Facultad de Ingeniería
“Programas Residentes En Lenguaje Ensamblador”
Trabajo de investigación presentado por Hugo Chinchilla Luis Monteros Josué Rendón Estrada
i
INDICE PÁGINA: INDICE .................................................................................................................................................. ii Antecedentes e Historia ....................................................................................................................... 3 Conceptos Importantes ........................................................................................................................ 3 Ejemplo ................................................................................................................................................. 6 Desarollo ............................................................................................................................................... 9 CONCLUSIONES ............................................................................................................................... 11 BIBLIOGRAFÍA................................................................................................................................... 12
ii
ANTECEDENES E HISTORIA Los programas residentes, tal como la palabra lo indica, son programas que están diseñados para residir en la memoria mientras otros corren. Surgieron con el fin de superar las limitaciones del DOS. La principal limitación que se busco superar fue la de hacer que el DOS no fuera un sistema monousuario y mono-tarea, ya que primeramente fue diseñado para realizar solo una tarea a la vez. Estos programas secundarios se pueden activar para hacer uso de sus servicios oprimiendo una secuencia especial de teclas. Los programas residentes se cargan después que el DOS y antes de activar otros programas de procedimiento normal. Son programas .COM El lenguaje más sencillo para poder desarrollar estos tipos de programas es Assembler. Se utiliza Assembler porque el programador controla totalmente la computadora y no se ve limitado por las facetas ocultas del compilador. Mientras el programa se vuelve más complicado, se ve la necesidad de utilizar programas de un nivel superior.
CONCEPTOS IMPORTANES Cuando se inicia el programa el DOS, se reserva un bloque de memoria en donde el programa reside y carga los programas subsecuentes en la parte superior de la memoria. Para poder activar el programa una vez haya quedado “residente”, se modifica la tabla de servicios de interrupciones, de modo que los programas residentes estén atentos a cualquier tecleo, actúen sobre una 3
entrada de teclas especial o una secuencia de tecleos, y dependiendo el caso, pasen por alto otros. Para poder salir de un programa residente se utiliza la función 31H de la interrupción 21H. Un programa residente para poder ser efectivo, debe tomar en cuenta lo siguiente: Ocupar poco espacio en memoria Esto se debe de respetar debido a que los programas residentes son los primeros programas que son cargados en el DOS reservando un bloque de memoria diseñado para ellos. Si los programas residentes son muy grandes, éstos ocuparían la mayor parte de espacio en memoria y no dejaran espacio para el programa principal. Estar disponibles rápidamente cuando son requeridos. La disponibilidad es un factor altamente importante debido a que los programas residentes son llamados por medio de combinaciones del teclado, si estos son activados y le toma mucho tiempo al sistema hacer el llamado, se pueden crear conflictos con el funcionamiento del programa principal. Esto conlleva a que se puede hacer más lenta la ejecución del programa. No alterar el funcionamiento normal del resto del ordenador. El programa residente debe preservar el estado de todo lo que van a modificar durante su ejecución, restaurándolo antes de retornar al programa principal. Esto incluye registros del CPU, de pantalla, memoria externa, etc. Esto se hace para no generar conflictos con el programa principal que se esta ejecutando. No se pueden invocar libremente desde un programa residente los servicios del sistema operativo. 4
Si se llama a un servicio del DOS desde un programa residente, es posible que en ese momento el DOS ya estuviese realizando otra función del programa principal. Lo que puede suceder con esto, es que el programa pierda su secuencia lógica. Para utilizar el DOS desde un programa residente hay que conocer cómo están organizadas las pilas del sistema operativo, así como determinar el estado del DOS para saber si se puede interrumpir en ese momento o si hay que esperar. Se debe de saber cuando se puede interrumpir por el uso de las pilas, ya que si se interrumpe en el momento en que el programa principal esta guardando información en la pila, ésta se pude perder o hacer una mezcla de la información guardada por el programa residente y el principal. Se debe de eliminar la posibilidad de una reentrada en los programas residentes. Se debe de eliminar la reentrada debido a que un programa residente puede activarse mientras se ejecuta (doblemente). El problema que se puede generar si no se elimina la reentrada, es que cuando un programa residente cambia los valores de algunos registros y es vuelto a llamar; se puede volver a ejecutar, sin generar algún conflicto en el programa, pero no recupera los valores iniciales de los registros utilizados. Es de vital importancia, resaltar que los programas residentes poseen las siguientes partes: 1. Sección que define las localidades en la tabla de servicios de interrupción. 2. Un procedimiento de inicialización que ejecuta solo la primera vez el programa y que realiza lo siguiente:
5
a. Reemplaza la dirección en las tablas de servicios de interrupción con su propia dirección b.Establece el tamaño de la parte del programa que permanece residente c.Utiliza una interrupción que le indica al DOS que termine la ejecución del programa actual y conecte a la memoria la parte especificada del programa. 3. Procedimiento que permanezca residente y que es activado por una entra especial del teclado o en algunos casos por el reloj de la propia computadora.
EJEMPLO DEMORES SEGMENT ASSUME CS:DEMORES, DS:DEMORES ORG 100H INICIO: JMP MAIN CONTROLA_INT08 PROC PUSHF CALL CS:ANT_INT08
; LLAMAR AL GESTOR NORMAL DE INT 8
STI CMP CS:IN10,0 JNE FIN_INT08
; ESTAMOS DENTRO DE INT 10H
;COLOCAR AQUÍ EL PROCESO A EJECUTAR 18,2 VECES/SEG.
6
; QUE PUEDE INVOCAR FUNCIONES DE INT 10H FIN_INT08: IRET CONTROLA_INT08 ENDP CONTROLA_INT10 PROC INC CS:IN10
; INDICAR ENTRADA EN INT 10H
PUSHF CALL CS:ANT_INT10 DEC CS:IN10
; FIN DE LA INT 10H
IRET CONTROLA_INT10 ENDP IN10 DB 0 ; MAYOR DE 0 SI HAY INT 10H ANT_INT08 LABEL DWORD ANT_INT08_OFF DW ? ANT_INT08_SEG DW ? ANT_INT10 LABEL DWORD ANT_INT10_OFF DW ? ANT_INT10_SEG DW ? ; DEJAR RESIDENTE HASTA AQUÍ. MAIN: PUSH ES MOV AX, 3508H INT 21H ; OBTENER VECTOR DE INT 8 MOV ANT_INT08_SEG, ES 7
MOV ANT_INT08_OFF, BX MOV AX, 3510H INT 21H ; OBTENER VECTOR DE INT 10H MOV ANT_INT10_SEG, ES MOV ANT_INT10_OFF, BX POP ES LEA DX, CONTROLA_INT08 MOV AX, 2508H INT 21H ; NUEVA RUTINA DE INT 8 LEA DX, CONTROLA_INT10 MOV AX, 2510H INT 21H ; NUEVA RUTINA DE INT 10H PUSH ES MOV ES,DS:[2CH] ; DIRECCIÓN DEL ENTORNO MOV AH, 49H INT 21H ; LIBERAR ESPACIO DE ENTORNO POP ES LEA DX, MAIN ; FIN DEL CÓDIGO RESIDENTE ADD DX, 15 ; REDONDEO A PÁRRAFO MOV CL, 4 SHR DX, CL ; BYTES -> PÁRRAFOS MOV AX, 3100H ; TERMINAR RESIDENTE INT 21H DEMORES ENDS END INICIO 8
DESARROLLO
Durante esta investigación, se pudo observar una vez más, la importancia de conocer y además saber manejar, el lenguaje ensamblador. El tema que se presenta, el de programas residentes, es una de las armas más potentes que se pueden lograr con este lenguaje. Es posible también saber, como usuarios de computadoras, de cualquier tipo, que el llamado “multi-tasking”, es hoy en día, una de las herramientas que todo usuario necesita; y ésta clase de programas han abierto la puerta para que realizar más de una tarea al mismo tiempo. Es claro que los programas residentes revolucionaron el mundo de las computadoras al tener dos programas por lo menos, ejecutándose al mismo tiempo, por llamarlo de alguna manera. La manera de realizar estos programas es muy diferente a la que se tenía en un principio, ya que es un programa totalmente diferente e independiente al mismo tiempo, que el programa principal. Lo más cercano que se ha visto y tal vez se hubiera propuesto como una forma de reproducir estos programas hubiera sido con la espera del teclado. Es decir, hacer un programa que esté constantemente revisando la entrada del teclado, y dependiendo la entrada, se llame a la parte deseada; pero con esta investigación ha quedado un poco más claro como es que se forma un programa residente y lo que se debe tener en cuenta para su buen funcionamiento. Otro concepto que se pone sobre la mesa y que ha quedado mucho más claro, es el de pila (o “stack”), ya que los programas residentes, claramente hacen uso de ésta, colocándose prácticamente en la parte superior de la pila.
9
También se ha visto una nueva función de la interrupción la 21h, lo que motiva a la investigación un poco más profunda de la misma interrupción, ya que al parecer, puede usar para varias y distintas necesidades, que se tiene como programador.
10
CONCLUSIONES
A continuación se presenta en una lista con las conclusiones más importantes de la investigación, acompañado de lo aprendido más sobresaliente: •Los programas residentes están diseñados para residir en la memoria mientras otros corren. •Los programas residentes buscan eliminar lo monótono e iniciar el multitasking. •Esta clase de programas son activados mediante una combinación de teclas especial. •Los programas residentes son .COM •Un programa residente eficiente debe tener en cuenta lo siguiente: Ocupar poco espacio en memoria, estar disponible rápidamente al ser llamado, no alterar el funcionamiento del resto del ordenador, no se pueden invocar libremente desde un programa residente los servicios del sistema operativo, no debe haber reentrada en los estos programas, no se pueden invocar libremente desde un programa residente los servicios del sistema operativo. •Un programa residente consta de 3 partes: Sección que define las localidades en la tabla de servicios de interrupción. Un procedimiento que realiza lo siguiente: Reemplaza la dirección en las tablas de servicios de interrupción con su propia dirección, establece el tamaño de la parte del programa que permanece residente, utiliza una interrupción que le indica al DOS que termine la ejecución del programa actual y conecte a la memoria la parte especificada del programa. Y un procedimiento que permanezca residente y que es activado por una entra especial del teclado o en algunos casos por el reloj de la propia computadora. 11
BIBLIOGRAFÍA GARCÍA, C.(1995). El universo digital del IBM PC, AT y PS/2. Cuarta edición. Edición electrónica. Valladolid España MICHAEL, T. (1993) PC Interno. Programación de sistema. Editorial Marcombo - Data Becker A. CATTANIA (1990) 80386: Arquitectura y programación. Grupo editorial Jackson. NORTON, P; SOCHA, J (1991) Nueva Guía del programador en ensamblador para IBM PC/XT/AT y compatibles. Editorial Anaya Multimedia, S.A ABEL, P. Lenguaje Ensamblador y programación para PC IBM y compatibles. Tercera edición. Editorial Pearson Education.
12