2016-04-24 71 views
2

当我正在读取和获取文件的数据,并试图读取和获取另一个文本文件的数据,它正在使用的字符串 新的数据,例如,字符串包含“哦是啊!“,得到另一个文件的数据”heyyeah!“。 (显然,我读的第二个文件中包含嘿这个词)。在显示第一个文件的数据后,我想在读取第二个文件时从第一个文件获取的数据中清除字符串。我怎样才能清除字符串[dos asm]

全码:

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 
+3

您用于打印字符串(INT 21h,AH = 9)的MS-DOS函数仅打印字符串中的字符,直到找到第一个美元符号字符(''$'')。当打印文件的内容时,除非读入文件的一部分中有'$'字符,否则它发现的第一个'$'符号实际上位于您命名为'space'的字符串中,它跟随着缓冲区将文件读入。如果您修复该错误,您将解决您在帖子中描述的问题。 –

+0

我的意思是,我有2个文件,一个(让我们称之为bova.txt)有'啊是啊!'在它中,secod文件(让它称为help.txt)里有'hey',我正在调用bova.txt的阅读函数,并且它设置'ah yeah!'在字符串和比显示字符串,比,我打电话给help.txt的阅读功能,而不是只有'嘿'在字符串中,它有'heyyeah!',这意味着它踩在字母相同的3个地方它需要,并用第二个文件中的单词的字母替换它们,我想要的是从文本 – Warrior0201

回答

1

如果你的程序运行正常的“bova.txt”那么你会得到类似的结果第二“help.txt”文件,如果你只是清理缓冲液标签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 
+1

显示文字后清理字符串,谢谢!它工作完美! – Warrior0201

相关问题