Vous êtes sur la page 1sur 5

; Programa ejemplo: similar al copy, copiar un archivo fuente a uno destino

; Basado en MITYPE.ASM
;
.model small
.stack 100h
.data
; El Nombre est fijo para el ejemplo
Nombre DB
''micopy.asm', 0
; El Nombre del destino tambin est fijo para el ejemplo
Nombre2 DB 'micopy.cpy', 0
; Ahora necesitamos 2 handles
Archivo DW ?
Archivo2 DW ?
Buffer DB
?
.code
again:
MOV AX, @data
MOV DS, AX
; 1a. parte, insertada: Crear el archivo
MOV AH, 3Ch
; Servicio fopen para crear
LEA DX, Nombre2 ; Apuntar a la cadena con el nombre destino
MOV CX, 0
; Atributo normal (no de solo-lectura ni similares)
INT 21h
; En este momento se crea
JC Error ; Lgica negada. En caso de error, terminar de lo contrario, abrir el otro
archivo
MOV Archivo2, AX ; Guardar el handle de destino
; 2a. parte: Abrir el archivo
MOV AH, 3Dh
; Servicio fopen
LEA DX, Nombre
; Apuntar a la cadena con el nombre
MOV AL, 0
; Abrir para lectura
INT 21h
; En este momento se abre
JNC Lectura
Error: MOV AX, 4C01h
; Terminar el programa con cdigo 1
INT 21h
Lectura:
MOV Archivo, AX ; Guardar el manejador o handle en la variable
;
; 3a. parte: ciclo, leer un caracter y en vez de mostrarlo en
; pantalla, guardarlo en el segundo archivo
;
Ciclo:
MOV AH, 3Fh
; Servicio para leer
LEA DX, Buffer ; Buffer donde quedar la informacin
MOV BX, Archivo ; Handle
MOV CX, 1
; Voy a leer 1 caracter a la vez
INT 21h
JC Error
CMP AX, 0
; Caracteres ledos
JE FinDeArchivo ; Si son 0, terminar
;
; Escribir
;
MOV AH, 40h
; Servicio para escribir
LEA DX, Buffer ; Buffer de donde se toma la informacin
MOV BX, Archivo2 ; Handle

MOV CX, 1
; Voy a escribir 1 caracter a la vez
INT 21h
JC Error
JMP SHORT Ciclo
; Ciclarse. Uso SHORT porque est a menos
; de 127 bytes de distancia
FinDeArchivo:
;
; Cerrar los archivos
;
MOV AH, 3Eh
; Servicio fclose
MOV BX, Archivo ; Handle
INT 21h
MOV BX, Archivo2 ; Handle
INT 21h
MOV AX, 4C00h
; Terminar el programa con cdigo 0
INT 21h
END again
; Programa ejemplo: similar al type, mostrar un archivo en pantalla
.model small
.stack 100h
.data
; El Nombre esta fijo para el ejemplo
;Nombre DB
'c:\autoexec.bat', 0
Archivo DW ?
Buffer DB
?
.code
begin:
MOV AX, @data
MOV DS, AX
;
; 1a. parte: Abrir el archivo
;
MOV AH, 3Dh
; Servicio fopen
LEA DX, Nombre
; Apuntar a la cadena con el nombre
MOV AL, 0
; Abrir para lectura
INT 21h
; En este momento se abre
JNC Lectura
Error:
MOV AX, 4C01h
; Terminar el programa con cdigo 1
INT 21h
Lectura:
MOV Archivo, AX ; Guardar el manejador o handle en la variable
; 2a. parte: ciclo, leer un caracter y mostrarlo en pantalla
Ciclo:
MOV AH, 3Fh
; Servicio para leer
LEA DX, Buffer ; Buffer donde quedar la informacin
MOV BX, Archivo ; Handle
MOV CX, 1
; Voy a leer 1 caracter a la vez
INT 21h
JC Error
CMP AX, 0
; Caracteres ledos
JE FinDeArchivo ; Si son 0, terminar
; Imprimir
MOV AH, 2
; Servicio de imprimir un caracter

MOV DL, Buffer


INT 21h
JMP SHORT Ciclo
; Ciclarse. Uso SHORT porque est a menos
; de 127 bytes de distancia
FinDeArchivo:
;
; Cerrar los archivos
;
MOV AH, 3Eh
; Servicio fclose
MOV BX, Archivo ; Handle
INT 21h
MOV AX, 4C00h
; Terminar el programa con cdigo 0
INT 21h
END begin
;******************************************************************
; Programa ejemplo: similar al type, mostrar un archivo en pantalla
;
.model small
.stack 100h
.data
; El Nombre est fijo para el ejemplo
Nombre DB
'primer.asm', 0
;
Archivo DW ?
Buffer DB
?
.code
inicio:
MOV AX, @data
MOV DS, AX
;
; 1a. parte: Abrir el archivo
;
MOV AH, 3Dh
; Servicio fopen
LEA DX, Nombre
; Apuntar a la cadena con el nombre
MOV AL, 0
; Abrir para lectura
INT 21h
; En este momento se abre
JNC Lectura
Error: MOV AX, 4C01h
; Terminar el programa con cdigo 1
INT 21h
Lectura:
MOV Archivo, AX ; Guardar el manejador o handle en la variable
;
; 2a. parte: ciclo, leer un caracter y mostrarlo en pantalla
;
mov ax,0B800h ; segment of video buffer
mov es,ax ; put this into es
xor di,di ; clear di, ES:DI points to video memory
cld
Ciclo:
MOV AH, 3Fh
; Servicio para leer
LEA DX, Buffer ; Buffer donde quedar la informacin
MOV BX, Archivo ; Handle
MOV CX, 1
; Voy a leer 1 caracter a la vez
INT 21h
JC Error

CMP AX, 0
; Caracteres ledos
JE FinDeArchivo ; Si son 0, terminar
;
; Imprimir
;
mov ah,089h ; attribute - red
mov al,buffer ; character to put there
mov es:[di],al ; output attribute to video memory
inc di
mov es:[di],ah
inc di
stosb ; output character at ES:[DI]
MOV AH, 2
; Servicio de imprimir un caracter
MOV DL, Buffer
INT 21h
JMP SHORT Ciclo
; Ciclarse. Uso SHORT porque est a menos
; de 127 bytes de distancia
FinDeArchivo:
;
; Cerrar los archivos
;
MOV AH, 3Eh
; Servicio fclose
MOV BX, Archivo ; Handle
INT 21h
MOV AX, 4C00h
; Terminar el programa con cdigo 0
INT 21h
END inicio
; Programa ejemplo: leer un archivo de texto, lnea a lnea, y generar la
; salida (en este caso, a la salida estandar, que puedo redireccionar), con
; lineas numeradas
; Basado en MITYPE.ASM
.model small
.stack 100h
.data
; El Nombre est fijo para el ejemplo
Nombre DB 'c:\autoexec.bat', 0
;
Archivo DW ?
Buffer DB ?
; Contador de lneas
Linea DW 1
TextoNumero DB 13, 10, 5 DUP (' '),': $' ; 5 espacios
.code
BEGIN:
MOV AX, @data
MOV DS, AX
;
; 1a. parte: Abrir el archivo
;
MOV AH, 3Dh ; Servicio fopen
LEA DX, Nombre ; Apuntar a la cadena con el nombre
MOV AL, 0 ; Abrir para lectura
INT 21h ; En este momento se abre
JNC Lectura

Error: MOV AX, 4C01h ; Terminar el programa con cdigo 1


INT 21h
Lectura:
MOV Archivo, AX ; Guardar el manejador o handle en la variable
;CALL ImprimeLinea
INC Linea
;
; 2a. parte: ciclo, leer un caracter y mostrarlo en
; pantalla; si es un ENTER, mostrar lnea e incrementarla
;
Ciclo:
MOV AH, 3Fh ; Servicio para leer
LEA DX, Buffer ; Buffer donde quedar la informacin
MOV BX, Archivo ; Handle
MOV CX, 1 ; Voy a leer 1 caracter a la vez
INT 21h
JC Error
CMP AX, 0 ; Caracteres ledos
JE FinDeArchivo ; Si son 0, terminar
MOV DL, Buffer
CMP DL, 13 ; Ver si es un ENTER
JE NuevaLinea ; Si es as, imprimir nueva lnea
CMP DL, 10 ; Ver si es un Salto de lnea
JE Ciclo ; Si es as, ignorarlo.
MOV AH, 2
INT 21h
JMP SHORT Ciclo ; Ciclarse. Uso SHORT porque est a menos
; de 127 bytes de distancia
NuevaLinea:
; Es un ENTER, llamamos a impresin de lnea
;CALL ImprimeLinea
INC Linea
JMP SHORT Ciclo ; Ciclarse. Uso SHORT porque est a menos
; de 127 bytes de distancia
FinDeArchivo:
;
; Cerrar los archivos
;
MOV AH, 3Eh ; Servicio fclose
MOV BX, Archivo ; Handle
END BEGIN

Vous aimerez peut-être aussi