TITLE ERASERNC: OVERWRITE AND DELETE A FILE .MODEL SMALL .STACK 100H .DATA PROMPT DB 'ENTER A FILENAME TO OVERWRITE AND DELETE:$' FILENAME DB 30 DUP (0) HANDLE DW ? OPENERR DB 0DH,0AH,'OPEN ERROR-CODE' ERRCODE DB 30H,'$' holdDX DW ? holdAX DW ? kill DB 'x' .CODE MAIN PROC ;1 GET FILENAME AND OPEN THE FILE 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 CALL OPEN ;OPEN FILE JC OPEN_ERROR ;EXIT IF ERROR MOV HANDLE, AX ;SAVE HANDLE mov bx, handle ;2 GET FILE SIZE IN DX:AX mov bx, handle mov al,2 ;move to the end of file call get_ptr mov holddx,dx ;save DX:AX mov holdax,ax ;3 OVERWRITE THE FILE mov cx,122 ;We loop from 122 (z) to 35 (#) to overwrite. File ends with all bytes as # LOOP_TOP: cmp cx, 35 JL END_LOOP mov kill, cl ;set kill to current ascii push cx ;save cx ;move to beginning of the file mov bx, handle mov al,0 ;move to begining of the file call get_ptr TOP_: mov bx, holdAX cmp bx ,ax ;is ax=holdax? JNE DO_IT_ ;if not keep writing over mov bx, holdDX cmp bx,dx ;is dx=holddx JE END_ ;if it is then exit DO_IT_: ;write a byte over mov ah, 40h mov bx, handle mov cx,1 lea dx,kill int 21h ;Call file pointer at its current position to get DX:AX mov bx, handle mov al,1 ;Move to current position call get_ptr JMP TOP_ END_: pop cx ;restore cx dec cx ;decrement cx JMP LOOP_TOP END_LOOP: ;4 CLOSE THE FILE MOV BX,HANDLE ;GET HANDLE CALL CLOSE ;CLOSE FILE ;5 DELETE THE FILE CALL DELETE jmp exit_ ; HANDLE OPEN ERROR OPEN_ERROR: LEA DX, OPENERR ;get error message ADD ERRCODE,AL ;convert error code to ascii mov ah,9 int 21h ;6 EXIT TO DOS EXIT_: MOV AH,4CH INT 21H ;DOS EXIT MAIN ENDP GET_PTR PROC NEAR ;moves file pointer to eof ;input: BX = filehandle, AL=move relative to where in the file ;output: DX:AX = pointer position from beginning MOV AH,42H ;move ptr function XOR CX,CX ;0 bytes XOR DX,DX ;from end of file INT 21H ;move ptr RET GET_PTR 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 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