在 8086 中读取文件直到文件结束

Posted

技术标签:

【中文标题】在 8086 中读取文件直到文件结束【英文标题】:Read file in 8086 until the end of the file 【发布时间】:2020-09-22 05:43:50 【问题描述】:
MOV AH,3DH
MOV DX,OFFSET(FNAME)
MOV AL,0  ; 0 MEAN FOR READING PURPOSE             ;OPEN
INT 21H
MOV HANDLE,AX 

MOV AH,3FH
MOV BX,HANDLE
MOV DX,OFFSET(BUFFER)                            ;READ
MOV CX,30
INT 21H

MOV AH,3EH
MOV DX,HANDLE                                     ;CLOSE
INT 21H 

现在程序只从文件中读取 30 个字母。我需要的是在不知道其中有多少个字母的情况下读取整个文件,因此程序将读取它们有多少个字母。

【问题讨论】:

如果文件太大以至于它不仅不能放在一个段中,甚至不能放在整个 RAM 中怎么办?.. 不,我只需要每次读取 5 位,然后将这 5 位发送到另一个文件并重新读取另外 5 位,直到文件结束 返回时,AX 将包含读取的字节数 (source)。通常,您所做的是分配一个适当大小的缓冲区,将文件的一块读入缓冲区,处理该块,然后重复。你知道你完成的 AX 比你要求的要少。 * AX 小于... 【参考方案1】:
MOV AH,3FH
MOV BX,HANDLE
MOV DX,OFFSET(BUFFER)                            ;READ
MOV CX,30
INT 21H

这是您需要用一个循环替换的代码,该循环读取文件的连续块直到没有任何内容。

3Fh DOS 调用不仅通过进位标志通知您可能的错误,而且还在AX 寄存器中返回实际读取的字节数。

ReadMore:
    mov dx, offset BUFFER
    mov cx, 5           ; Your chunk apparently has 5 bytes
    mov bx, HANDLE
    mov ah, 3Fh         ; DOS.ReadFile
    int 21h             ; -> AX CF
    jc  ReadError
    cmp ax, cx          ; Compares RECEIVED BYTES with REQUESTED BYTES
    jb  PartialRead
WholeChunk:

    ... Whatever you need to do with 5 bytes ...

    jmp     ReadMore
PartialRead:
    test    ax, ax
    jz      EndOfFile
PartialChunk:

    ... Whatever you can do with 1, 2, 3, or 4 left-over bytes ...

EndOfFile:
    mov bx, HANDLE
    mov ah, 3Eh         ; DOS.CloseFile
    int 21h
    ...

请注意下一个 sn-p 中的错字。句柄进入BX 寄存器!

MOV AH,3EH
MOV DX,HANDLE                                     ;CLOSE
INT 21H

【讨论】:

以上是关于在 8086 中读取文件直到文件结束的主要内容,如果未能解决你的问题,请参考以下文章

php fread()函数读取文本直到文件尾却无法结束

在 MASM 8086 程序集中读取多个文件

在java中读取二进制文件,直到特定的“%% EOF”标记?

如何在 C 语言中使用带有 REGS 结构的 int86 函数读取和显示文件数据,用于 8086

C++中怎么逐行读取数据

从 C# 中的文本文件一次读取 10 行