Warrior0201
Warrior0201

Reputation: 87

how can i clear string [dos asm]

when i'm reading and getting file's data and than trying to read and get another text file's data, it's writing the new data on the used string for example, string contains "oh yeah!", after getting another file's data "heyyeah!". (obviously the second file i was reading contained the word hey in it). i want to clear the string from the data it got from the 1st file when reading the second file/after displaying the data of the 1st file.

Full code:

IDEAL
MODEL small
STACK 100h
DATASEG

szMsg1 db "Hi! What do you want to do?",10,13,10,13,"/h-help(see all the commands)",10,13,"/e-Exit",10,13,10,13,"$"
szHelloWorld db 10,13,"Hello World!",10,13,"$"
ErrorMsg db 10,13,"Illegal Command,Try again!",10,13,"$"
filenameStr db 13,0,13 dup("$")
help db 10,13,"HELP LIST:",10,13,"-----------",10,13,"Commands are:",10,13," /e-Exit",10,13," /h-help",10,13," /1-Says: 'Hello World!'",10,13,"$"
filename db ?,0
filehandle dw 0
ErrorOpenMsg db 'Error',10,13,'$'
FileNameLength db "file name consists of 8 letters max! (dont forget to add '.txt' at the end of the name: 'example.txt')",10,13,"/r/ ","$"
fileString db 255 dup (0)
space db " ","$"
CommandMsg db 10,13,"Enter your command:",10,13,"Command: ","$",10,13
filereaderline db "file's text:","$"


CODESEG                                    
proc OpenFile
;Open file
    mov ah,3Dh
    xor al,al
    lea dx,[filenameStr+2]
    int 21h
    jc openerror
    mov [filehandle],ax
    ret
openerror:  
    mov dx,offset ErrorOpenMsg
    mov ah,9h
    int 21h
    ret
endp OpenFile   

proc ReadFile
    mov ah,3fh
    mov bx,[filehandle]
    mov cx,255
    lea dx,[fileString]
    int 21h
    ret
endp ReadFile   

proc DeleteFile
    mov ah,41h
    lea dx,[filenameStr+2]
    int 21h
endp DeleteFile

proc DisplayFileString
    mov ah,09h
    lea dx,[fileString]
    int 21h 
endp DisplayFileString  

proc KeyStroke
    xor ax,ax
    int 16h
endp KeyStroke

proc WriteToFile
    mov ah,40h
    mov bx,[filehandle]
    mov cx,255
    lea dx,[fileString]
    int 21h
    ret
endp WriteToFile

proc CloseFile
    mov ah,3Eh
    mov bx,[filehandle]
    int 21h
    ret
endp CloseFile  

start:
    mov ax, @data
    mov ds, ax

    mov dx,offset szMsg1
    mov ah,9h
    int 21h
    jmp GetCommandLetter

_Error:

    mov dx,offset ErrorMsg
    mov ah,9h
    int 21h 

GetCommandLetter:
    mov dx,offset CommandMsg
    mov ah,9h
    int 21h

    mov ah, 1h
    int 21h
    mov bl,al   

    mov ah, 1h
    int 21h
    mov bh,al   
compare:    

    cmp bl,'/'
    jne _Error
    cmp bh,'h'
    je _help

    cmp bl,'/'
    jne _Error
    cmp bh,'H'
    je _help

    cmp bl,'/'
    jne _Error
    cmp  bh,'1'
    je PrintLine

    cmp bl,'/'
    jne _Error
    cmp bh,'e'
    je _exit

    cmp bl,'/'
    jne _Error
    cmp bh,'E'
    je exit


    mov dx,offset space
    mov ah,9h
    int 21h
    mov dx,offset FileNameLength
    mov ah,9h
    int 21h

    cmp bl,'/'
    jne _Error
    cmp  bh,'r'
    je GetFileName

    cmp bl,'/'
    jne _Error
    cmp  bh,'R'
    je GetFileName

    jmp _Error
_exit:
    jmp exit

_help:  
    mov dx,offset help
    mov ah,9h
    int 21h
    jmp GetCommandLetter

GetFileName:
    mov dx,offset space 
    mov ah,9h 
    int 21h
    mov dx,offset filenameStr
    mov bx,dx
    mov [byte ptr bx],13    ;8+1+3+1
    mov ah,0Ah
    int 21h
    mov dx,offset filenameStr + 2
    mov ah,9h
    int 21h
    mov [byte ptr filenameStr+2+8],0
    call OpenFile 
    call ReadFile
    mov dx,offset filereaderline 
    mov ah,9h 
    int 21h
    call DisplayFileString
    call CloseFile 
    jmp GetCommandLetter





PrintLine:
    mov dx, offset szHelloWorld
    mov ah, 9h
    int 21h
    jmp GetCommandLetter

exit:
    mov ax, 4c00h
    int 21h
END start

Upvotes: 2

Views: 1743

Answers (1)

Fifoernik
Fifoernik

Reputation: 9899

If your program runs fine for the "bova.txt" then you'll get a similar result for the second file "help.txt" if you just clean the buffer at the label fileString.

call OpenFile

xor  bx,bx
WipeClean:
     mov  [byte ptr fileString + bx], 0
     inc  bx
     cmp  bx, 255
     jb   WipeClean

call ReadFile
mov  dx, offset filereaderline 
mov  ah, 09h 
int  21h
call DisplayFileString
call CloseFile 
jmp  GetCommandLetter

Upvotes: 1

Related Questions