Moving Grave2:(MG#_2.X03):21/11/1995 << Back To Moving Grave2


Hi gente del UNDER, esta oportunidad empezaremos un tema new, ya que este pibe (Vlade Petis) meca... con la continuacion sobre el tratamiento de discos pero bue' encontre tema asi que aqui me tienen de nuevo. Sujetense FUERTE!... -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- LA INTERRUPCION INDOCUMENTADA 2Eh DEL DOS ───────────────────────────────────────── by MI! (DESTROYER) Cuando uno va recorriendo un listado de interrupciones y se encuentra con la palabra (ya tipica de por si) RESERVED, la actitud que uno toma es la de darse por vencido, esto siempre ocurre luego de que uno reviso esperanzado la lista de RALF BROWN ilusionado (uh!...pobrecito...). Cuando una interrupción es RESERVED, es porque se puede amparar a un recurso que no está en uso, pero que se planea su empleo en futuras versiones, pero en esta se le fue la mano, ya que se encuen tra habilitada desde la version 2.00 en adelante. Tratandose de sistemas complejos, la situación "suele ser bastante diferen- te". Y justamente este es el caso de un sistema operativo. Un OS no sólo debe prestar una cantidad de servicios, se requiere, además que ellos esten adecuadamente documentados, y que guarden una minima compatibili dad entre diferentes versiones. DOS brinda diferentes servicios a los que se accede via interrupciones de software. Por ejemplo, la función 9 de la interrupción 21h permite la salida de una cadena al dispositivo standard de salida (STDOUT), y asi ha sido desde la versión 1. Un progama que emplee exclusivamente este servicio de DOS puede ope- rar, por lo tanto, con cualquiera versión del sistema operativo, desde la origi- nal hasta la ultima. Si examinamos las diferentes interrupciones y funciones de DOS (por ejemplo, consultando la referencias tecnicas, "DOS technical Reference"), encontraremos que muchas de ellas estan catalogadas como RESERVED. Esos servicios estan actual mente implementados, solo que no se liberan al usuario programador. El objeto de la reserva NO ES UNA APLICACION FUTURA, sino evitar el compro- miso que implica la documentación, un servicio reservado puede ser alterado ra- dicalmente en versiones posteriores, y su uso puede estar sujeto a condiciones dificiles de cumplir. Los servicios reservados generalmente corresponden a funciones internas del sistema operativo, pero en muchos casos se trata de funciones de las que el programador podria sacar buen partido. Este es el caso de la INTERRUPCION 2E. Se trata de la puerta al PROCESADOR DE COMANDOS "COMMAND.COM", cuando desde un programa se desea ejecutar un commando residente (como COPY), simplemente basta construir una cadena conteniendo el comando, e invocar a DOS. Esto permitiria ejecutar desde un programa comandos directos (no a travez de un SHELL), con la simplicidad de un bath. En rigor, se deben cumplir otros requisitos previamente. Para comprender stas exigencias, debemos revisar algu- nos aspectos de DOS. BLOQUES DE MEMORIA ────────────────── DOS administra la memoria del sistema en forma de "paragrafos" completos de 16 bytes. Cada "bloque" de memoria incluye un numero entero de paragrafos, y es- ta indentificado por una etiqueta (que en si ocupa un paragrafo). La etiqueta contiene la longitud del bloque que le sigue y la direccion del programa "dueño" del bloque, ademas de una firma identificatoria ("M"o, para el ultimo bloque, "Z"). Cuando un programa es cargado, DOS le asigna, en principio, TODA la memoria disponible. Si es necesario, el programa debe pedir a DOS una "reduccion" de esa memoria, para garantizar espacio libre (en el caso de residentes, esta memoria es reducida normalmente al finalizar la instalacion). COMMAND.COM ─────────── El procesador de comandos no es exactamente un programa RESIDENTE, se lo mantiene en memoria en tanto hay disponibilidad de lugar. Por otro lado, el COMMAND.COM se carga de una menera "irregular", en lugar de cargarse, como otros programas, en el primer bloque de memoria de tamaño suficiente, el COMMAND.COM se carga en memoria alta, es decir, en el techo de la memoria del sistema (el fin del codigo de COMMAND.COM queda entonces en 9000:FFFF si la memoria base es de 640Kb). Si bien esta carga se realiza solo si esa area esta disponible, la memoria ocupada por COMMAND.COM "no se reserva", cualquier programa puede tomarla para si, e incluso sobreescribirla. Solo un pequeño NUCLEO de COMMAND.COM queda residente, en una porcion normal Cuando este nucleo es invocado, verifica si el procesador de comandos aún re- side intacto en memoria alta, si no es asi, se intenta su recarga desde disco. Esto requiere que la copia en disco este disponible (o sea, que la especifi- ccacion COMSPEC sea correcta), y que haya suficiente espacio para acomodar a el COMMAND.COM. Grafico la forma en que se carga el COMMAND.COM ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │░░░░░░░░░│ │ │ │ │ │ command │ │░A░O░P░P░│ │ │ │ command │ │ │ │░R░C░O░R░│ │ MEMORIA │ │ │ ├─────────┤ │░E░U░R░O░│ │ │ ├─────────┤ │ │ │░A░P░░░G░│ │ │ │ │ │ memoria │ │░░░A░E░R░│ │ LIBRE │ │ memoria │ │ libre │ │░░░D░L░A░│ │ │ │ libre │ │ │ │░░░A░░░M░│ │ │ │ │ │ │ │░░░░░░░A░│ │ │ │ │ │ │ │░░░░░░░░░│ │ │ │ │ ├─────────┤ ├─────────┤ ├─────────┤ ├─────────┤ │ porcion │ │ porcion │ │ porcion │ │ porcion │ │residente│ │residente│ │residente│ │residente│ ├─────────┤ ├─────────┤ ├─────────┤ ├─────────┤ │▓▓▓▓▓▓▓▓▓│ │▓▓▓▓▓▓▓▓▓│ │▓▓▓▓▓▓▓▓▓│ │▓▓▓▓▓▓▓▓▓│ │▓▓▓▓▓▓▓▓▓│ │▓▓▓▓▓▓▓▓▓│ │▓▓▓▓▓▓▓▓▓│ │▓▓▓▓▓▓▓▓▓│ │▓▓D▓O▓S▓▓│ │▓▓D▓O▓S▓▓│ │▓▓D▓O▓S▓▓│ │▓▓D▓O▓S▓▓│ │▓▓▓▓▓▓▓▓▓│ │▓▓▓▓▓▓▓▓▓│ │▓▓▓▓▓▓▓▓▓│ │▓▓▓▓▓▓▓▓▓│ │▓▓▓▓▓▓▓▓▓│ │▓▓▓▓▓▓▓▓▓│ │▓▓▓▓▓▓▓▓▓│ │▓▓▓▓▓▓▓▓▓│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ carga de un programa terminacion recarga de que invade COMMAND.COM del programa. COMMAND.COM EL USO DE LA INTERRUPCION 2Eh ───────────────────────────── Para emplear la interrupcion 2Eh desde un programa, es necesario, entonces liberar suficiente memoria como para que el COMMAND.COM pueda ser cargado (recor demos nuevamente que la mayoria de los programas recibe la totalidad de la memo ria disponible, devolviendola al POOL de DOS al terminar su ejecucion). La dismi nucion del requerimiento de memoria debe cursarse a travez de la funcion 4Ah de la interrupcion 21h, colocando como argumentos el segmento del bloque ( que para un .COM es CS), y la cantidad de paragrafos de memoria requeridos. Grafico del Empleo de la funcion 4Ah (Modificar Memoria Asignada). ------------------------------------------------------------------ ░░░░░░░ENCABEZADO░░░░░░░ ─────┐ PARAMETROS DE ENTRADA ├──────────────────────┤  │ ┌──┬──┐ ├──────────────────────┤ │ └ ES │ │ PRIMER SEGMENTO DEL BLOQUE ├──────────────────────┤ │ └──┴──┘ ├──Bloque de Memoria───┤ ├──┐ ┌──┬──┐ ├──────────────────────┤ │ └── BX │ │ CANTIDAD DE PARAGRAFOS REQUERIDOS ├──────────────────────┤ │ └──┴──┘ ├──────────────────────┤  ░░░░░░░ENCABEZADO░░░░░░░ PARAMETROS RETORNADOS ├──────────────────────┤ ├──────────────────────┤ ┌──┬──┐ ├──────────────────────┤ BX │ │ CANTIDAD DE PARAGRAFOS DISPONIBLES ├──Bloque de Memoria───┤ └──┴──┘ ├──────────────────────┤ ┌──┐ ├──────────────────────┤ Carry │ │ FLAG DE ERROR └──────────────────────┘ └──┘ DOS libera entonces el resto de la memoria y devuelve el flag de Carry en 0 si la operacion fue exitosa, o en 1 si hubo error (por ejemplo, si el semento del bloque coonsignado es incorrecto). Este servicio puede emplearse tambien pa ra ampliar esa memoria, en tal caso, DOS retorna error si no se puede asignar la memoria solicitada. PARAMETROS DE ENTRADA --------------------- ┌──┬──┐ ┌──┬──┐ │ │:│ │ Puntero al comando └──┴──┘ └──┴──┘ │ DS SI │ │  ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │  │ C O M A N D O │ └─┼─┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘ │ longitud del comando Una vez liberada suficiente memoria, un programa puede ejecutar cualquiera de los comandos residentes de DOS (DIR, DEL, REN, COPY, etc) mediante el senci- llo expediente de apuntar DS:SI a una cadena ASCII que contenga el comando, pre- cedido por un byte que indica su longitud (O sea, una cadena al estilo PASCAL: byte de longitud + secuencia alfanumerica). UN EJEMPLO ────────── El siguiente programa muestra un ejemplo de uso de la interrupcion 2Eh. Al- gunas instrucciones (como las secuenciasde PUSH y POP) son superfluas en este ejemplo minimo, pero pueden resultar necesarias en una aplicacion real. Algo similar ocurre con el proposito del programa, que este ejemplo es me- ramente demostrativo (se limita a ejecutar un DIR). -=-=-=-=-=-=-=-=-=-=-=-=- CUT HERE -=-=-=-=-=-=-=-=-=-=-=-=- .model small .code org 100h paragrafos Equ 10 ;Aqui se consigna la ;cantidad real de ;paragrafos requeridos Int2E: Push ax Push bx Push dx Push es Push cs ;Liberacion de memoria Pop es mov bx,Paragrafos mov ax,4A00h int 21h mov si,offset Comando ;Ejecucion del comando int 2eh pop es pop ds pop dx pop bx int 20h ;Retorno a DOS comando Label Byte db fincomando-$-1 db "DIR *.*",13 ;Comando especifico fincomando Label Byte end Int2E -=-=-=-=-=-=-=-=-=-=-=-=- CUT HERE -=-=-=-=-=-=-=-=-=-=-=-=-