UNIVERSIDAD TECNICA FEDERICO SANTA MARIA Area Electrónica Computación e Informática - Sede Talcahuano sbm/2000 ;P57H21H.ASM ;************* ;Programa que ilustra como se usa la función 57H/21H (57H/21H = Leer o definir Hora y Fecha de un archivo). ;Además muestra como se maneja la cola de órdenes y como se transforma una cantidad en dígitos ASCII, para ;mostrar en pantalla. org 100H ;Averiguar si el usuario ingresó el nombre (unidad de disco, ruta) del archivo. INICIO: mov al, [80H] or al, al jnz SIGUE mov dx, offset MENSAJE1 call CAD_APANT int 20H ;¿ hay cola de órdenes ? Si 0, no la hay ;afectar bandera de cero ;no hay cola de órdenes ;advertir y terminar con cadena a pantalla. ;Transformar la cola de órdenes (nombre y ruta del archivo) en una cadena ASCIIZ, para las ;funciones "handle". SIGUE: OTROMAS: mov bx, 82H mov al, [bx] inc bx cmp al, 0DH jne OTROMAS mov byte Ptr [bx]-1, 00 ;revisar la cola de órdenes ;leyendo byte a byte ;posición del sgte. carácter ;detectar la ubicación del Ret. de Carro (0DH) ;no es 0DH, entonces al sgte. carácter ;y colocar allí un 00 (ASCIIZ) ;Abrir el archivo; el S.O. le asigna un n·mero o "handle" (manilla): ABRIR: ERROR: mov ah, 3DH mov al, 02H mov dx, 82H int 21H jnc SINERROR mov dx, offset MENSAJE2 call CAD_APANT int 20H ;abrir el archivo ;modo de acceso (R/W) ;ASCIIZ del archivo está a partir de este offset ;sin no hay error ... ;si, lo hay, informar y terminar ;cadena ascii a la pantalla (09/21H) ;Leer (o definir) la hora y la fecha del archivo abierto: SINERROR: mov word HANDLE, ax mov bx, ax mov ah, 57H mov al, 00 int 21H ;guardar el código o “handle” del archivo ;el código a BX para la función 57H ;leer la hora y la fecha ;Manipulación de la fecha del archivo (en DX): 1 UNIVERSIDAD TECNICA FEDERICO SANTA MARIA Area Electrónica Computación e Informática - AGNO: push dx and dx, 1111111000000000B shr dx, 9 mov word ELAGNO, dx MES: pop dx push dx and dx, 0000000111100000B shr dx, 5 mov word ELMES, dx ;determinar el mes ;desplazar 5 veces a la derecha ;guardar en la memoria pop dx and dx, 0000000000011111B mov word ELDIA, dx ;determinar el dia ;guardar en la memoria DIA: Sede Talcahuano sbm/2000 ;almacenar temporalmente ;determinar el año (a partir de 1980) ;desplazar a la derecha 9 veces, anteponiendo 0 ;guardar en memoria ;Tenemos ahora que tomar los datos de año, mes y día. Ahora hay que transformarlos en ASCII para emitirlos a la ;pantalla. mov dx, offset NEWLINEA call CAD_APANT ;para función 09/21H ;poner línea en blanco TRANSF_D: mov ax, word ELDIA call CALCULA call PANTALLA ;procesar y mostrar el dia ;devuelve en AH y AL (ASCII) ;presentar en la pantalla TRANSF_M: mov ax, word ELMES call CALCULA call PANTALLA ;procesar y mostrar el mes ;devuelve en AH y AL (ASCII) TRANSF_A: mov ax, word ELAGNO add ax, 1980 mov si, 10 mov cx, 4 xor dx, dx div si RESTOP: or dl, 30H push dx loop RESTOP ;Mostrar el año en la pantalla: mov cx, 4 mov ah, 02 pop dx OTRAVEZ: int 21H loop OTRAVEZ mov dx, offset NEWLINEA ;procesar y mostrar el año ;suma 1980, año es a partir de ese ... ;dividir por 10 cada vez ;4 cifras tiene la cantidad ;hacer DX=0 ;División nivel 16 bits: AX/10, cuociente en AX y resto en DX ;transformar el dÝgito en ASCII ;y guardarlo en la pila ;repetir 4 veces con el cuociente ;4 veces, cuatro dígitos ... ;para función 02/21H, ;poner DL en pantalla ;para función 09/21H 2 UNIVERSIDAD TECNICA FEDERICO SANTA MARIA Area Electrónica Computación e Informática call CAD_APANT ;Cerrar el archivo: mov ah, 3EH mov bx, word HANDLE int 21H FINAL: - Sede Talcahuano sbm/2000 ;poner línea en blanco en pantalla ;función 3EH, cerrar el archivo int 20H ;Los procedimientos del programa: ;------------------------------------------push bx CALCULA: mov bl, 10 div bl or al, 30H or ah, 30H pop bx ret ;-----------------------push dx PANTALLA: push ax mov dl, al mov ah, 02 int 21H pop ax mov dl, ah mov ah, 02 int 21h mov dl, "/" int 21H pop dx ret ;------------------------CAD_APANT: push ax mov ah, 09 int 21H pop ax ret ;-------------------------- ;determinar decena/unidad y transforma ASCII ;divisor ;División nivel 8 bits: AX/10, cuociente en AL y resto en AH ;transforma en ASCII decena (cuociente) ;transforma en ASCII unidad (resto) ;decena en AH, unidad en AL (ASCII) ;para función 02/21H, decena de dia ;para función 02/21H, unidad de dia ;separador de dia, mes y año ;generar línea en blanco en pantalla ;Los datos del programa: ;-----------------------------db 0AH, 0DH, "Debe ingresar el nombre del archivo ...", 0AH, 0DH, 24H MENSAJE1 db 0AH, 0DH, "¡ Error en el nombre del archivo ...!", 0AH, 0DH, 24H MENSAJE2 db 0AH, 0DH, 24H NEWLINEA dw ? HANDLE dw ? ELAGNO 3 UNIVERSIDAD TECNICA FEDERICO SANTA MARIA Area Electrónica Computación e Informática - Sede Talcahuano sbm/2000 dw ? dw ? end ;sbm/mayo 2000, P57H21H.WPD - 26 ELMES ELDIA 4