TITLE ERASER: OVERWRITE AND ERASE A FILE .MODEL SMALL .STACK 100H .DATA PROMPT DB 'FILENAME:$' FILENAME DB 30 DUP (0) BUFFER DB 512 DUP (0) HANDLE DW ? OPENERR DB 0DH,0AH,'OPEN ERROR-CODE' ERRCODE DB 30H,'$' FILESIZE DW ? .CODE MAIN PROC MOV AX,@DATA MOV DS,AX ;INIT DS MOV ES,AX ;AND ES CALL GET_NAME ;READ FILENAME LEA DX,FILENAME ;DX HAS FILENAME OFFEST MOV AL,0 ;ACCESS CODE 0 FOR READING CALL OPEN ;OPEN FILE JC OPEN_ERROR ;EXIT IF ERROR MOV HANDLE, AX ;SAVE HANDLE ;seems like here we can count how big the file is? READ_LOOP: LEA DX,BUFFER ;DX PTS TO BUFFER MOV BX,HANDLE ;GET HANDLE CALL READ ;READ FILE. AX=BYTES READ OR AX,AX ;END FILE? JE EXIT ;YES, EXIT MOV CX,AX ;CX GETS NO. OF BYTES READ ;CALL DISPLAY ;DISPLAY FILE JMP READ_LOOP ;EXIT OPEN_ERROR: LEA DX,OPENERR ;GET ERROR MESSAGE ADD ERRCODE, AL ;COVERT ERROR CODE TO ASCII MOV AH,9 INT 21H ;DISPLAY ERROR MESSAGE EXIT: MOV BX,HANDLE ;GET HANDLE CALL CLOSE ;CLOSE FILE ;save filesize currently in CX MOV FILESIZE, CX MOV CX,122 FOR_: CMP CX,34 JLE EXIT_FOR ;first open file for writing LEA DX,FILENAME ;DX HAS FILENAME OFFEST call openre ;write over the buffer call writeover ;we would then want to write the file back out erasing it call write call close dec cx jmp FOR_ EXIT_FOR: ;call delete file call delete MOV AH,4CH INT 21H ;DOS EXIT MAIN ENDP WRITEOVER PROC NEAR ;writes over buffer ;input: value of cx is used as overwrite value push cx push ax push si mov ah,cl mov cx, filesize lea si,buffer ;mov ah,'r' top: mov [si], ah inc si loop top pop si pop ax pop cx ret WRITEOVER ENDP GET_NAME PROC NEAR ;READS AND STORES FILENAME ;INPUT: NONE ;OUTPUT: FILE NAMED STORED AS ASCIIZ STRING PUSH AX ;SAVE REGISTERS USED PUSH DX PUSH DI MOV AH,9 ;DISPLAY STRING FUNCTION LEA DX,PROMPT INT 21H ;DISPLAY DATA PROMPT CLD LEA DI, FILENAME ;DI PTS TO FILENAME MOV AH,1 ;READ CHAR FCN READ_NAME: INT 21H ;GET A CHAR CMP AL,0DH ;CR? JE DONE ;YES EXIT STOSB ;NO,STORE IN STRING JMP READ_NAME ;KEEP READING DONE: MOV AL,0 STOSB ;STORE 0 BYTE (I ASSUME AS STRING ENDER LIKE IN C) POP DI ;RESTORE REGISTERS POP DX POP AX RET GET_NAME ENDP OPEN PROC NEAR ;OPEN FILE ;INPUT DS:DX FILENAME ; AL ACCESS CODE ;OUTPUT: IF SUCCESSFUL, AX HANDLE ; IF UNSUCCESSFUL, CF=1, AX=ERRORCODE MOV AH,3DH ;OPEN FILE FCN MOV AL,2 ;INPUT ONLY 1 means opening for writing, 2 reading and writing INT 21H ;OPEN FILE RET OPEN ENDP OPENRE PROC NEAR ;OPEN FILE ;INPUT DS:DX FILENAME ; AL ACCESS CODE ;OUTPUT: IF SUCCESSFUL, AX HANDLE ; IF UNSUCCESSFUL, CF=1, AX=ERRORCODE push ax push cx MOV AH,3CH ;OPEN FILE FCN MOV CL,0 ;set to normal file type INT 21H ;OPEN FILE pop cx pop ax RET OPENRE ENDP WRITE PROC NEAR ;writes buffer area out to file ;input: ; filesize contains number of bytes to write out which must be placed in cx ; bx contains the file handle push cx push dx push ax mov cx,filesize lea dx, buffer ;get buffer address mov ah, 40h ;write function int 21h ;execute the write pop ax pop dx pop cx ret WRITE ENDP READ PROC NEAR ;READS A FILE SECTOR ;INPUT: BX FILE HANDLE ; CX BYTES TO READ (512) ; DS:DX BUFFER ;OUTPUT: IF SUCCESSFUL, SECTOR IN BUFFER ; AX NUMBER OF BYTES READ ; IF UNSUCCESSFUL, CF=1 PUSH CX MOV AH, 3FH ;READ FILE FCN MOV CX,512 ;512 BYTES INT 21H ;READ FILE INTO BUFFER POP CX RET READ ENDP DISPLAY PROC NEAR ;DISPLAYS MEMORY ON SCREEN ;INPUT BX = HANDLE (1) ; CX = BYTES TO DISPLAY ; DS:DX = DATA ADDRESS ;OUTPUT: AX=BYTES DISPLAYED PUSH BX MOV AH,40H ;WRITE FILE FCN MOV BX,1 ;HANDLE FOR SCREEN INT 21H ;DISPLAY FILE POP BX RET DISPLAY ENDP DELETE PROC NEAR ;source for interrupt: http://webster.cs.ucr.edu/AoA/DOS/ch13/CH13-6.html ;Deletes A FILE ;INPUT DX:DS MUST HAVE FILENAME ;OUTPUT: IF CF=1, ERROR CODE IN AX push dx push ax LEA dx, filename ;DX HAS FILENAME OFFEST MOV AH,41H ;DELETE FILE FUNCTION INT 21H ;CLOSE FILE pop ax pop dx RET DELETE ENDP CLOSE PROC NEAR ;CLOSES A FILE ;INPUT: BX = HANDLE ;OUTPUT: IF CF=1, ERROR CODE IN AX MOV AH,3EH ;CLOSE FILE FUNCTION INT 21H ;CLOSE FILE RET CLOSE ENDP END MAIN