2016-04-28 53 views
3

我製作了一個寫入文件的過程,併爲寫入代碼做了一個標籤,但是我填充的字符串沒有寫入文件。如何寫入在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 
    ; 

通話將writeToFile - 它寫過的意外

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

MOV DX,抵消WriteStr mov bx,dx mov [byte ptr bx],100; 8 + 1 + 3 + 1 mov ah,0Ah int 21h這是要求用戶輸入字符串的代碼 – Warrior0201

+0

我已更新問題,我發現有東西 – Warrior0201

+0

我已經加了d他們在我的程序中,看看我做的編輯,雖然ret沒有顯示在這裏,但在我的電腦上我已經改變了它 – Warrior0201

回答

3

發現錯誤在你的代碼:該文件在READ被打開ONLY模式,這樣你就可以把它寫:

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

謝謝你!從來沒有想過這會是問題:P – Warrior0201

相關問題