gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 22:22:23 26 4
gpt4 key购买 nike

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

编写程序:

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

关于assembly - 如何在 DOSBox 下运行的程序集中写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36924892/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com