汇编程序 (asm) 无法读取文件

Assembler (asm) cannot read file

当我运行那个代码:

;-------------------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

我有那个输出:

Program is started
Error reading from source file
Program is ended

text.txt内容:

Aenean ut scelerisque lacus, at aliquam ipsum. Aenean et tincidunt felis. Suspendisse volutpat aliquam odio at blandit. Integer vitae ligula consequat, interdum metus nec, venenatis arcu. Integer rhoncus quis felis et maximus. Praesent ac condimentum elit. Nullam a molestie ligula.

我很想读这个文件。
编译器:带 DOSBox 的 TASM 16 位(以及带 TASM 的 FreeDOS)。
OS:Windows 10 x64(VirtualBox 上的 FreeDOS v1.2)。

为什么不起作用?

更新
错误代码:我在DOS 3Fh (int 21h)
中出错 CF = 1,AL = 05h(拒绝访问)。 但是文件是免费的。

Jose Manuel Abarca Rodríguez所说,然后删除答案:

There are three possible values when opening a file :

0 = read only.
1 = write only.
2 = read/write.

But in your code you are opening the file with the value 21h

;Result in ax: 0 if all is good, else not openFiles PROC push bx push 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

Replace that 21h with 0, 1 or 2 :

mov al, 0

确实有效。谢谢