【问题标题】:Assembler (asm) cannot read file汇编程序(asm)无法读取文件
【发布时间】:2017-08-12 08:43:55
【问题描述】:

当我运行该代码时:

;-------------------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。 blandit 的 Suspendisse volutpat aliquam odio。 Integer vitae ligula consequat, interdum metus nec, venenatis arcu。整数 rhoncus quis felis et maximus。 Praesent ac condimentum 精英。 Nullam 一个 molestie ligula。

我想阅读这个文件。
编译器:带有 DOSBox 的 TASM 16 位(以及带有 TASM 的 FreeDOS)。
操作系统:Windows 10 x64(VirtualBox 上的 FreeDOS v1.2)。

为什么它不起作用?

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

【问题讨论】:

  • 检查错误代码。另外,使用调试器。
  • 查看更新。调试器告诉我只有 05h 出现错误
  • 何塞找对地方了。您以只写方式打开文件,但随后尝试从中读取。你需要20h 而不是21h

标签: assembly tasm 16-bit


【解决方案1】:

正如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

将 21h 替换为 0、1 或 2:

移动,0

真的很管用。谢谢

【讨论】:

  • 是的,他的意思是21h 无效,但确实有效。这对您的目的来说是错误的,因为这意味着独占写入访问权限。
  • @Jester,够了:)
  • 是的先生,对不起先生:D
猜你喜欢
  • 2011-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多