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

时间:2017-03-20 21:31:25

标签: assembly tasm 16-bit

当我运行该代码时:

;-------------------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(访问被拒绝)。 但文件是免费的。

1 个答案:

答案 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

它确实有效。谢谢