当我运行该代码时:
;-------------------MACRO-----------------
println MACRO info
push ax
push dx
mov ah, 09h
mov dx, offset info
int 21h
;print new line
mov dl, 10
mov ah, 02h
int 21h
mov dl, 13
mov ah, 02h
int 21h
pop dx
pop ax
ENDM
;-----------------end macro----------------
.model small
.stack 100h
.data
sourcePath db "C:\Files\lab5\text.txt"
sourceID dw 0
maxWordSize equ 50
buffer db maxWordSize + 2 dup(0)
startText db "Program is started", '$'
badSourceText db "Cannot open source file", '$'
fileNotFoundText db "File not found", '$'
errorClosingSource db "Cannot close source file", '$'
errorClosingDest db "Cannot close destination file", '$'
endText db "Program is ended", '$'
errorReadSourceText db "Error reading from source file", '$'
errorWritingDestText db "Error writing to destination file", '$'
.code
main:
mov ax, @data
mov es, ax
mov ds, ax
println startText
call openFiles
cmp ax, 0
jne endMain ;we have some error
call processingFile
cmp ax, 0
jne endMain ;we have some error
call closeFiles
cmp ax, 0
jne endMain ;we have some error
endMain:
;exit
println endText
mov ah, 4Ch
int 21h
;Result in ax: 0 if all is good, else not
openFiles PROC
push bx dx
;open source
mov ah, 3Dh ;open source file
mov al, 21h ;readonly, block write, other cannot write
mov dx, offset sourcePath
mov cx, 01h
int 21h
jb badOpenSource ;works when cf = 1
mov sourceID, ax ;save file ID
mov ax, 0 ;return value
jmp endOpenProc ;all is good
badOpenSource:
println badSourceText
cmp ax, 02h
jne errorFound
println fileNotFoundText
errorFound:
mov ax, 1
endOpenProc:
pop dx bx
ret
ENDP
;macro help processing
;bx - file ID
resetPosInFileToStart MACRO
push ax bx cx dx
mov ah, 42h
xor al ,al ;mov al, 0 - from file start
xor cx, cx
xor dx, dx
int 21h
pop dx cx bx ax
ENDM
;end macro help
processingFile PROC
push ax bx cx dx si di
mov bx, sourceID
resetPosInFileToStart
call readFromFile
cmp ax, 0
je finishProcessing
mov si, offset buffer
mov di, offset buffer
mov cx, ax ;save num of symbols in buffer
xor dx, dx
finishProcessing:
pop di si dx cx bx ax
ret
ENDP
;Result in ax: 0 if all is good, else not
closeFiles PROC
push bx cx
xor cx, cx
mov ah, 3Eh
mov bx, sourceID
int 21h
jnb goodCloseOfSource ;cf = 0
println errorClosingSource
inc cx ;now it is a counter of errors
goodCloseOfSource:
mov ax, cx ;save number of errors
pop cx bx
ret
ENDP
;reads to buffer maxWordSize symbols
;RES: ax - how much symbols we read
readFromFile PROC
push bx cx dx
mov ah, 3Fh
mov bx, sourceID
mov cx, maxWordSize
mov dx, offset buffer
int 21h
jnb goodRead ;cf = 0 - we read file
println errorReadSourceText
mov ax, 0
goodRead:
pop dx cx bx
ret
ENDP
end main
我有那个输出:
程序已启动
从源文件读取时出错 程序已结束
text.txt内容:
Aenean ut scelerisque lacus,在aliquam ipsum。 Aenean et tincidunt felis。 Suspendisse volutpat aliquam odio在blandit。整数ligula consequat,interdum metus nec,venenatis arcu。整数rhoncus quis felis et maximus。 Praesent ac condimentum elit。 Nullam是一个molestie ligula。
我想读这个文件 编译器:TASM 16位使用DOSBox(和FreeDOS使用TASM) 操作系统:Windows 10 x64(VirtualBox上的FreeDOS v1.2)。
为什么它不起作用?
更新
错误代码:DOS 3Fh(int 21h)中有错误
CF = 1,AL = 05h(访问被拒绝)。
但文件是免费的。
答案 0 :(得分:0)
如Jose Manuel Abarca Rodríguez所述,然后删除答案:
打开文件时有三个可能的值:
0 = read only. 1 = write only. 2 = read/write.
但是在您的代码中,您打开的值为21h
;结果为ax:0如果一切都好,否则不是openFiles PROC 推bx 推dx
;open source mov ah, 3Dh ;open source file mov al, 21h ;readonly, block write, other cannot write ◄■■██ As !!! mov dx, offset sourcePath mov cx, 01h int 21h jb badOpenSource ;works when cf = 1
用0,1或2替换21h:
mov al,0
它确实有效。谢谢