En la sesión de hoy hablamos de algunos conceptos generales de archivos y su manejo en bajo nível. Les presenté la información de referencia de las interrupciones
Int 21,3D,
Int 21,3E e
Int 21,3F, que son las interrupciones de DOS que abren, cierran y leen un archivo respectivamente mediante el uso de una manija (handle). Les presenté y expliqué brevemente el siguiente programa que despliega su código fuente:
; Archivo: da.asm
; Despliega en pantalla el archivo "da.asm"
; Abre el archivo origen en modo solo lectura
; Utiliza llamadas a DOS Int 21h/3d, 21h/3E, 21h/3F para
; el manejo de archivos. Int 21h/2 para desplegar los
; bytes leidos caracter por caracter.
; ---------------------------------------------------------
; Algunas constantes
LF EQU 10
CR EQU 13
pila segment stack 'stack'
db 512 dup(?)
pila ends
datos segment 'DATA'
Errora db "Error al abrir archivo origen",LF,CR,07,07,"$"
Buffer db 256 dup (0)
Origen db "da.asm",0
datos ends
prog segment 'CODE'
assume cs:prog,ds:datos,ss:pila
inicio:
mov ax,seg datos
mov ds,ax
mov ah,3dh ; Abre archivo "da.asm"
mov al,00 ; Modo Solo Lectura
mov dx,offset Origen
int 21h
jnc Continua ; Si Error
mov ah,9 ; Despilega mensaje de error
mov dx, offset Errora
int 21h
jmp Fin ; y termina
Continua: ; Sino, lee y despliega contenido del archivo
mov bx,ax ; BX = manija (file handler)
Rep1:
mov cx,256 ; Lee_CX_bytes_de(Origen) a Buffer
Mov ah,3fh
mov dx,offset Buffer
Int 21h
or ax,ax ; Si Bytes_leidos = 0
jz Do1 ; Ve a Do1
mov cx,ax ; CX = Bytes_leidos
xor DI,DI ; Indice = 0
Desp2: ; Despliega los bytes leidos
mov ah,02h
mov dl,Buffer[DI] ; DL = Buffer[DI]
Int 21h ; Continuaiega_caracter_en_DL
Inc DI ; Indice = Indice + 1
Loop Desp2
; Ve a Rep1
jmp Rep1
Do1: ; Cierra_archivo(Origen)
mov ah,3eh
Int 21h
Fin: ; Termina
mov ax,4c00h
int 21h
prog ends
end inicio
A manera de ejercicio, modifiquen este programa para que lea desde la línea de comandos el nombre del archivo a desplegar.