如何在 DOSBox 下的程序集 运行 中写入文件

How to write to a file in assembly running under DOSBox

我做了一个写入文件的程序,并做了一个写入代码的标签,但是我正在填充的字符串没有被写入文件。

编写程序:

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

写标签:

WritingToFile:
    mov dx,offset w
    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 
    xor  bx,bx
    call WipeClean
    mov dx,offset filereaderline 
    mov ah,9h 
    int 21h
    mov dx,offset WriteStr
    mov bx,dx
    mov [byte ptr bx],100    ;8+1+3+1
    mov ah,0Ah
    int 21h
    call WriteToFile
    call CloseFile 
    call DisplayWriteStr
    jmp GetCommandLetter

我发现在这个过程中:

CreatingFile:
    mov dx,offset c
    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 CreateFile 
    ;

call WriteToFile -it wrote,an accident

    call DisplayFileName
    xor  bx,bx
    call CloseFile 
    jmp GetCommandLetter

它在文件中写了这个:

i $$$$$$$$$$$$$

HELP LIST:

-----------

Commands are:

 /e-Exit

 /h-help

 /1-Says: 'Hello World!'

$   Error

$file name consists of 4 letters MUST!! (dont forget to add '.txt' at the end of the name: 'xmpl.txt')$

/r/ $ 

/c/ $ 

/w/ $              i $$$$$$$$$$$$$

HELP LIST:

-----------

Commands are:

 /e-Exit

 /h-help

 /1-Says: 'Hello World!'

$   Error

$file name consists of 4 letters MUST!! (dont forget to add '.txt' at the end of the name: 'xmpl.txt')$

/r/ $ 

/c/ $ 

/w/ $              "

在它创建的文件中,我看到用于写入文件的变量是:

 WriteStr db 105,0,13 dup("$")

它解释了重复的 $,我知道这个变量主要有问题,我想,我该如何更改它以及如何更改它才能正常工作?

完整代码:

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("$")
WriteStr db 105,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 4 letters MUST!! (dont forget to add '.txt' at the end of the name: 'xmpl.txt')","$"
r db 10,13,"/r/ ","$"
c db ,10,13,"/c/ ","$"
w db ,10,13,"/w/ ","$"
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 Exitp
    mov ax, 4c00h
    int 21h
endp Exitp

proc WipeClean
     mov  [byte ptr fileString + bx], 0
     inc  bx
     cmp  bx, 255
     jb   WipeClean
     ret
endp WipeClean   

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 CreateFile
    mov ah,3ch 
    mov cx,00000000b 
    lea dx,[filenameStr+2] 
    int 21h 
    jc CreateError 
    mov [filehandle],ax
    ret
CreateError:  
    mov dx,offset ErrorOpenMsg
    mov ah,9h
    int 21h
    ret
endp CreateFile  

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 DisplayWriteStr
    mov ah,09h
    lea dx,[WriteStr]
    int 21h 
endp DisplayWriteStr 

proc DisplayFileName
    mov ah,09h
    lea dx,[filenameStr]
    int 21h 
endp DisplayFileName  

proc KeyStroke
    xor ax,ax
    int 16h
endp KeyStroke

proc WriteToFile
    mov ah,40h
    mov bx,[filehandle]
    mov cx,255
    lea dx,[WriteStr]
    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 ah,0
    mov al,2
    int 10h

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

PrintLine:
    mov dx, offset szHelloWorld
    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 bh,'H'
    je _help

    cmp  bh,'1'
    je PrintLine

    cmp bh,'e'
    je _Exitp

    cmp bh,'E'
    je _Exitp

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


    cmp bh,'c'
    je CreatingFile

    cmp bh,'C'
    je CreatingFile

    cmp  bh,'r'
    je GetFileName

    cmp  bh,'R'
    je GetFileName

     cmp  bh,'w'
    je WritingToFile

    cmp  bh,'W'
    je WritingToFile

    jmp _Error

_Exitp:
call Exitp

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

GetFileName:
    mov dx,offset r
    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 
    xor  bx,bx
    call WipeClean
    call ReadFile
    mov dx,offset filereaderline 
    mov ah,9h 
    int 21h
    call DisplayFileString
    call CloseFile 
    jmp GetCommandLetter

CreatingFile:
    mov dx,offset c
    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 CreateFile 
    call WriteToFile
    call DisplayFileName
    xor  bx,bx
    call CloseFile 
    jmp GetCommandLetter

WritingToFile:
    mov dx,offset w
    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 
    xor  bx,bx
    call WipeClean
    mov dx,offset filereaderline 
    mov ah,9h 
    int 21h
    mov dx,offset WriteStr
    mov bx,dx
    mov [byte ptr bx],100    ;8+1+3+1
    mov ah,0Ah
    int 21h
    call WriteToFile
    call CloseFile 
    call DisplayWriteStr
    jmp GetCommandLetter    




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

在您的代码中发现错误:文件是以只读模式打开的,因此您无法写入它:

proc OpenFile
;Open file
    mov ah,3Dh
    mov al,2    ;<================== 0:READ ONLY, 1:WRITE ONLY, 2:READ/WRITE.
    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