简体   繁体   English

如何从用户输入[asm,dos]写入文件?

[英]how to write a file from user input[asm,dos]?

i want to make a procedure that creates a file when inputing the name of the file in the console,how can i do this? 我想做一个在控制台中输入文件名时创建文件的过程,我该怎么做? i've tried with those two procedures: 我已经尝试了这两个过程:

filenameStr db 13,0,13 dup("$")
createline db 10,13,"/c/ ","$"
space db " ","$"
filehandle dw 0

proc: 过程:

proc Createfile
mov dx,offset createline
mov ah,9h
int 21h
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 
xor  bx,bx
call WipeClean

call CreateFile1
call CloseFile 
call GetCommandLetter
endp CreateFile

and: 和:

proc CreateFile1
    mov ah,3ch
    mov cx,00000000b
    lea dx,[filenameStr]
    int 21h
    mov [filehandle],ax 
    ret
endp CreateFile1

note: those procedures are not showed in the code since i've changed the code to my older code without the writing file procedures. 注意:这些过程未显示在代码中,因为我已将代码更改为较早的代码,而无需编写文件过程。

full program is here: 完整的程序在这里:

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 WipeClean
     mov  [byte ptr fileString + bx], 0
     inc  bx
     cmp  bx, 255
     jb   WipeClean
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 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 ah,0
    mov al,2
    int 10h

    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 
    xor  bx,bx
    call WipeClean
    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

Reading the DOS api you'll see that CreateFile and OpenFile are very similar functions. 阅读DOS api,您会发现CreateFileOpenFile是非常相似的功能。 In your program you've successfully opened, but you fail on the creation because you made the same mistake as before when user @SepRoland helped you out. 在您的程序中,您已成功打开,但是创建失败,因为您遇到了与@SepRoland用户帮助您时相同的错误。 You forgot that the actual filename starts at offset 2 in the structure that you give to DOS. 您忘记了实际的文件名从给DOS的结构中的偏移量2开始。

proc CreateFile1
    mov ah,3ch
    mov cx,00000000b
    lea dx,[filenameStr +2]             <= Add the 2 here!
    int 21h
    jc  ThisIsAnErrorOnCreatingAFile    <= Do something with the carry flag!
    mov [filehandle],ax 
    ret
endp CreateFile1

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM