以8086方式读取文件,直到文件结束。

问题描述 投票:2回答:1
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个字母。我需要的是在不知道文件中有多少字母的情况下读取整个文件,这样程序就会读取所有的字母。

assembly x86-16 file-read emu8086
1个回答
1
投票
MOV AH,3FH
MOV BX,HANDLE
MOV DX,OFFSET(BUFFER)                            ;READ
MOV CX,30
INT 21H

这就是你需要用一个循环来代替的代码,这个循环可以连续读取文件的各个块,直到什么都不剩。

3Fh DOS调用不仅通过carry标志通知你可能出现的错误,而且它还会以 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
    ...

请注意下一个片段中的拼写错误。句柄应该放在 BX 注册

MOV AH,3EH
MOV DX,HANDLE                                     ;CLOSE
INT 21H
© www.soinside.com 2019 - 2024. All rights reserved.