UNIVERSIDAD TECNICA FEDERICO SANTA MARIA Area Electrónica COMPUTADORES Sede TALCAHUANO SBM OPERACIONES CON ARCHIVOS usando las llamadas al Sistema Operativo (int 21H). Se desarrollan las funciones "HANDLE" . (Posibles sólo para versiones DOS 2.0 y superiores). El "handle" (se puede traducir como manilla, mango o asa) del fichero o archivo corresponde a un número que le asigna el DOS para su identificación. El "handle" de un archivo es llamado también el Código del Archivo. Existe "handle" preasignado para el dispositivo estándar de entrada (teclado) y es 0; para el dispositivo estándar de salida (pantalla) es 1. El dispositivo de error estándar tiene "handle" igual a 2 (usualmente la pantalla); el dispositivo auxiliar estándar (COM1) tiene asignado el "handle" igual a 3 y el dispositivo de listado estándar tiene el "handle" igual a 4 (impresora PRN o LPT1). Si las funciones tienen éxito, el "flag" de "carry" se pone en cero. En cambio si las funciones no son exitosas, el "flag" de "carry" se pone en 1 y en el registro AX se anotará el código correspondiente al error producido. Esto último se aprovecha en la programación; mediante la instrucción JC (jump on carry)... será posible realizar la emisión de mensajes de error al usuario, y dependientes del contenido de AX. Una especificación ASCIIZ corresponde a una cadena de caracteres ASCII terminada con un CERO (Zero). LAS FUNCIONES " HANDLE ": A) CREAR O TRUNCAR ARCHIVO; int 21H (33), función 3CH (60). Dada una especificación de archivo ASCIIZ (cadena ASCII terminada con Cero), esta función crea un nuevo archivo en el directorio designado o por defecto, dentro del disco designado o por defecto. Si el fichero designado ya existe, éste se trunca a cero bytes. En cualquier caso se abre el fichero y se devuelve un código de 16 bits en AX , o "handle", que utiliza el programa para accesos posteriores a dicho archivo. Se llama con ah= 3CH cx= atributo del archivo, según 00 normal 01 sólo lectura 02 oculto 04 de sistema. ds:dx = segmento : offset de la especificación ASCIIZ. Si la función tiene éxito, devuelve Flag de acarreo bajo y en AX el "handle" 1 asignado, usualmente $ 4. Si falla, devuelve Flag de acarreo alto y en ax figura el código de error. ax=3, no se encuentra ruta ax=4, no hay ruta disponible ax=5, acceso negado. B) ABRIR ARCHIVO; int 21H (33), función 3DH (61). Dada una especificación ASCIIZ, esta función abre un archivo en el directorio designado o por defecto, dentro del disco designado o por defecto. Se devuelve un código de 16 bits o "handle" que utiliza el programa para accesos posteriores de dicho fichero. Se llama con: ah=3DH al= modo de acceso (ver *) ds:dx= segmento:offset de la especificación ASCIIZ. (*) Bits 0-2= 000 si el acceso es para sólo lectura 001 si el acceso es para sólo escritura 010 si el acceso es para lectura/escritura Bits 3 al 7, son 0. A partir de la versión 3 del DOS, los bits 3 al 7 definen el acceso y la modalidad de compartir el archivo. (Consultar la literatura). Si la función tuvo éxito, devuelve, Flag de "carry" bajo y en AX el "handle" del archivo. Si la función falla, el Flag de "carry" es alto y en AX el código de error según, 1=número de función inválido; 2= fichero no encontrado; 3= ruta no encontarda o fichero inexistente; 4= no hay "handle" disponible; 5= acceso negado. C) CERRAR FICHERO; interrupción 21H (33), función 3EH (62). Dado un código de archivo o "handle", devuelto por una operación previa exitosa de apertura o creación (funciones 3DH, 3CH, 5AH, 5BH), limpia todos los "buffers" internos enviándolos al disco, cierra el fichero y libera el "handle" para su reutilización. Si el fichero ha sido modificado o extendido, se actualiza la hora, la fecha y el tamaño del fichero en la entrada correspondiente del directorio. Se llama con : ah= 3EH bx= "handle" del fichero Si la función tuvo éxito, devuelve el Flag de acarreo en estado bajo. Si la función falla, el Flag de acarreo tomará el estado alto y en AX se anota el código de error. Estos serán los mismo definidos para la función anterior (3DH) más 6= "handle" inválido o no abierto. 2 UNIVERSIDAD TECNICA FEDERICO SANTA MARIA Area Electrónica COMPUTADORES Sede TALCAHUANO SBM D) LEER FICHERO O DISPOSITIVO, int.21H (33), función 3FH (63). Dado un "handle" válido, procedente de una operación previa correcta de apertura (fun. 3DH) o creación (fun. 3CH,5AH o 5BH), una dirección de "buffer" (zona en memoria RAM) y una longitud en bytes, se transfieren datos desde el fichero o dispositivo definido por el "handle", al buffer". En el caso del dispositivo estándar de entrada (teclado), el "handle" tiene asignado el valor 0. Se llama con: ah= 3FH bx= "handle" del fichero o dispositivo. cx= número de bytes a leer ds:dx = segmento : offset de la zona "buffer". Si la función tiene éxito, el "Flag" de "carry" toma el estado bajo y AX contiene la cantidad de bytes leídos. En cambio, si la función no tiene éxito, el "Flag" de "carry" estará en estado alto y AX contiene el código de error producido (5 o 6, ver la función 3DH y 3EH). E) ESCRIBIR EN UN FICHERO O EN UN DISPOSITIVO, int 21H (33), función 40H (64). Dado un "handle" válido, procedente de una operación previa correcta de apertura (fun. 3DH) o creación (fun. 3CH,5AH,5BH), una dirección de "buffer" (zona de memoria RAM) y una longitud en bytes, se transfieren datos desde el "buffer" hasta el fichero o dispositivo identificado por el "handle". El dispositivo estándar (pantalla) tiene asignado el "handle" de valor 1. Se llama con: ah= 40H bx= "handle" del fichero o dispositivo. cx= número de bytes a escribir. ds:dx= segmento : offset de la zona buffer. Si la función tiene éxito, el "Flag" de "carry" toma el estado bajo y AX contiene la cantidad de bytes escritos. En cambio, si la función no tiene éxito, el "Flag" de "carry" estará en estado alto y AX contiene el código de error producido (5 o 6, ver la función 3DH y 3EH). F) BORRAR FICHERO, int 21H (33), función 41H (65). Borra un fichero del directorio y disco especificado o por defecto. Se llama con ah= 41H, y ds:dx = segmento:offset es una especificación de fichero ASCIIZ. Devuelve... Al igual que en los casos anteriores, el "Flag" de "carry" será 0/1 y en AX 3 tendremos en el caso de falla los códigos de error 2 o 5. G) MOVER EL PUNTERO DEL FICHERO, int 21H (33), función 42H (66). Esta función se usa para cambiar la posición lógica de lectura/escritura en un fichero (previamente abierto con 3DH). Para ello se carga BX con el número del fichero ("handle") y luego se especifica la posición nueva del puntero, cargando el AL la posición de comienzo del puntero y el número de bytes que se quieren mover se anotan en el par de registros CX y DX. La dirección relativa del byte en CX y DX es un entero largo sin signo (32 bits) (CX es el más significativo y DX el menos significativo de la dirección relativa). Entonces, la función, Se llama con: ah= 42H al= código del método, según, 0 = La dirección relativa se toma desde el comienzo del fichero y el puntero se mueve CX|DX bytes a partir de ese punto. 1= Se toma la dirección relativa desde la posición en curso, y se mueve a partir de esa posición CX|DX bytes. 2= Se toma la dirección relativa a partir del final del fichero y se mueve el puntero a partir de esa posición CX|DX bytes. bx= "handle" del fichero. cx= mitad más significativa del offset. dx= mitad menos significativa del offset. Si la función tiene éxito, el "flag" C=0 y DX|AX contiene el puntero del fichero como una dirección relativa en bytes desde el principio del fichero donde, dx= parte más significativa y ax= parte menos significativa del puntero. Si se realiza la función 42H con AL=2, y si se define la dirección relativa en CX|DX igual a 0, es posible averiguar el tamaño del fichero. Si se ajusta la dirección relativa a 0 y se pide el método 0, se vuelve al principio del fichero. Si la función no tiene éxito, C=1 y en ax está el código de error (1 o 6). H) OBTENER O ASIGNAR ATRIBUTOS DEL FICHERO, int 21H (33), función 43H (67). Obtiene o asigna atributos del/al fichero (sólo lectura, oculto, sistema o archivo). Se llama con: ah= 43H al= 00H, si se desea obtener los atributos = 01H, si se desea asignar los atributos. ds:dx= segmento:offset de una especificación de fichero ASCIIZ. 4 UNIVERSIDAD TECNICA FEDERICO SANTA MARIA Area Electrónica COMPUTADORES En cx Bit 5 Bit 2 Bit 1 Bit 0 se =1 =1 =1 =1 Sede TALCAHUANO SBM anotan los nuevos atributos si al= 01H. Estos son, si el archivo tiene atributo Archivo.(ver nota *1) si el archivo es de Sistema. si el archivo es Oculto (Hidden). si el archivo es sólo Lectura (Read only)(ver nota *2). (bit 0 es LSB y bit 7 es MSB) Si la función tiene éxito, C=0 (bandera de "carry"=0) y si al=00 en cx estarán los atributos. Si la función falla, Carry=1 y en AX se encontrará el código de error: 1 si el código de la función es inválido; 2 si el fichero no se encuentra; 3 si la ruta no se encuentra o el fichero no existe; 5 si el atributo no puede modificarse. NOTAS: Nota *1) Un fichero o archivo con atributo A (Archivo) se caracteriza por el hecho que ese bit se activa cada vez que se modifica el fichero. Esto permite identificarlos para realizar respaldos (backup). Una vez realizado el respaldo, se le cambia este atributo al archivo, de manera de no volverlo a respaldar a menos que se le realicen cambios en su contenido. Nota *2) En los archivos sólo lectura se suspenden las operaciones que intentan abrir o borrar ese fichero. Nota *3) Otros bit de atributo importantes son: Bit 4, identifica a un subdirectorio, pudiendo éste ocultarse al ser tratados los directorios al igual que un archivo por parte del DOS. Otros atributos no se le pueden cambiar. Bit 3, identifica a una Etiqueta de Volumen; los cambios de atributos carecen de sentido. I) CAMBIAR DE NOMBRE A UN FICHERO, int 21H (33), función 56H (86). Cambia el nombre de un fichero y/o mueve su entrada de directorio a un directorio distinto, del mismo disco. Se llama con, ah= 56H ds:dx = segmento:offset del nombre de fichero ASCIIZ original. es:di = segmento:offset del nuevo nombre de fichero ASCIIZ. Si la función tiene éxito, el "Flag" C=0. Si falla, C=1 y en AX aparece el código de error (2,3,5 o 11H = no es el mismo dispositivo). 5 6 J) OBTENER O CAMBIAR LA FECHA Y HORA DE UN FICHERO, int 21H (33), función 57H (87). Lee o modifica las marcas de hora y fecha a un fichero previamente abierto o creado. Se llama con, ah=57H al=00, obtener hora y fecha al=01, designar hora y fecha. bx= "handle" de fichero. En CX se anotará la hora y en DX se anotará la fecha, como retorno en el caso de AL=00 y como valores anotados en el caso de asignación. La estructura de esta información es: CX (hora), bits b15-b11, las horas, de 0 a 23. bits b5 -b10, los minutos, de 0 a 59. bits b4 -b0 , número de incrementos de 2 segundos (0 a 29) DX (fecha) bits b9 -b15, año, con respecto a 1980. bits b5 -b8 , mes, 0 a 12. bits b0 -b4 , día del mes, 0 a 31. Nota: b0 es el LSB y b15 es el MSB de la palabra de 16 bits. Si la función tiene éxito, C=0, y si falla C=1 con el contenido de AX con el código de error (1 o 6). K) CREAR UN FICHERO TEMPORAL, int 21H (33), función 5AH (90). El nombre de esta función lleva a engaño. Mediante ésta es posible crear un archivo que no tiene nada de "transitorio". El DOS no lo borra automáticamente; la designación obedece a otra idea. El atributo del fichero se anota en CX según 00 si es normal, 01H si es sólo lectura, 02H si es oculto, 04H si es de sistema. El nombre de la cadena ASCIIZ se señala con DS:DX. La cadena ASCIIZ del nombre de ruta o paso, debe estar lista para poder anotar a continuación el nombre del fichero creado; significa esto que la cadena debe terminar con el carácter de barra invertida (\) usada para señalizar rutas. Se deben añadir 12 bytes para dejar espacio suficiente para que el DOS añada la cadena con el nombre del archivo (8 caracteres, el punto y tres caracteres de extensión). Si no se desea especificar una ruta particular, se proporciona al DOS una cadena nula, que indica que se debe usar el directorio activo de UNIVERSIDAD TECNICA TALCAHUANO Area Electrónica SBM FEDERICO SANTA MARIA - Sede 7 COMPUTADORES la unidad activa. Si la función tiene éxito, el "flag" de "carry" estará bajo y AX contiene el "handle" o código del fichero creado. Si la función falla, C=1 y en AX aparece el código de error (3 o 5). L) CREAR NUEVO FICHERO, int 21H (33), función 5BH (91). Idéntica a la función 3CH desarrollada en estas mismas notas, con la diferencia que la función 5BH falla cuando encuentra un fichero del mismo nombre, en lugar de truncar dicho fichero a cero. Fallando la función ("carry" alto), los códigos de error en AX podrán ser 3, 4, 5, 50H= si el fichero ya existe. -o-o-o-o-o- SBM/03/1991/wp5 - disco 2 de 360 SBM/mayo 1995 intfiles.w51 - 14 SBM/mayo 2002, intfiles.wpd, intfiles.pdf - 29