如何在dos asm中从用户输入中获取文件名

时间:2016-04-23 22:26:48

标签: assembly dosbox

我正在制作一个控制台程序,我的文件程序需要文件名,但是,我想从用户输入中获取文件名,所以当你在console / r中写入时,你可以写到最多15个字母,包含。文件名中的txt,但似乎我的代码不起作用,如何从用户输入到字符串或此变量filename db "filename.txt",0

我的Openfile proc(例如):

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

ORIGINAL-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 15 dup(?),0
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
string db ?

CODESEG                                    
proc OpenFile
;Open file
    mov ah,3Dh
    xor al,al
    lea dx,[filenameStr]
    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,[string]
    int 21h
    ret
endp ReadFile   

proc DeleteFile
    mov ah,41h
    lea dx,[filename]
    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,'e'
    je _exit

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

    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

    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    

GetFileName:
    mov dx,offset space
    mov ah,9h
    int 21h

    mov dx,offset filenameStr
    mov bx,dx
    mov [byte ptr bx],15
    mov ah,0Ah
    int 21h
    mov dx,offset filenameStr
    mov ah,9h
    int 21h
    call OpenFile
    call ReadFile
    call CloseFile
    jmp GetCommandLetter



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

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

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



    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,[string]
    int 21h
    ret
endp ReadFile   

proc DeleteFile
    mov ah,41h
    lea dx,[filename]
    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,'e'
    je _exit

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

    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

    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    

GetFileName:
    mov dx,offset space
    mov ah,9h
    int 21h

    mov dx,offset filenameStr ;setting letters into string from input
    mov bx,dx
    mov [byte ptr bx],15
    mov ah,0Ah
    int 21h
    mov dx,offset filenameStr ;output of the string,string input supposidly bad
    mov ah,9h
    int 21h
    call OpenFile
    call ReadFile
    call CloseFile
    jmp GetCommandLetter



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

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

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

新完整代码:

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
string db ?

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,'e'
    je _exit

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

    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

    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    

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
    call CloseFile 
    jmp GetCommandLetter



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

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

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

1 个答案:

答案 0 :(得分:1)

filenameStr db 15 dup(?),0
filename db ?,0

你有这两个定义来处理你的问题。第二个( filename )太小而无法使用,这就是 deleteFile 过程失败的原因!第一个( filenameStr )是DOS输入函数的输入结构。这个足够大但你需要将它的第一个字节初始化为小于15的东西,我建议13因为这将允许8个字符+ 1个点+ 3个字符+回车。

mov dx,offset filenameStr
mov bx,dx
mov byte ptr [bx],13    ;8+1+3+1
mov ah,0Ah
int 21h

如果要显示此文本,则需要使用 $ 美元符号终止该文本,并注意实际文本在此结构中的偏移量2处开始。我这样解决了:

filenameStr db 13,0,13 dup("$")


mov dx,offset filenameStr + 2
mov ah,9h
int 21h

要成功打开文件,您需要先将回车符替换为零,然后再次注意文本从偏移量2开始。