Reading txt in Assembly i8086

1

I have the following code to read txt file:

; um programa que demonstra a criação de um arquivo e a
; leitura do mesmo

.model small
.stack
.code 

start:

mov ax,@data        ; endereço de base do segmento de dados
mov ds,ax       ; é colocado em ds

mov dx,OFFSET FileName  ; coloca o endereço do nome do arquivo em dx
mov al,2        ; modo de acesso - leitura e escrita
mov ah,3Dh      ; função 3Dh - abre um arquivo
int 21h         ; chama serviço do DOS

mov Handle,ax       ; guarda o manipulador do arquivo para mais tarde
jc ErrorOpening     ; desvia se carry flag estiver ligada - erro!

mov dx,offset Buffer    ; endereço do buffer em dx
mov bx,Handle       ; manipulador em bx
mov cx,100      ; quantidade de bytes a serem lidos
mov ah,3Fh      ; função 3Fh - leitura de arquivo
int 21h         ; chama serviço do DOS

jc ErrorReading     ; desvia se carry flag estiver ligada - erro!

mov bx,Handle       ; coloca manipulador do arquivo em bx
mov ah,3Eh      ; função 3Eh - fechar um arquivo
int 21h         ; chama serviço do DOS

mov cx,100      ; comprimento da string
mov si,OFFSET Buffer    ; DS:SI - endereço da string
xor bh,bh       ; página de vídeo - 0
mov ah,0Eh      ; função 0Eh - escrever caracter

NextChar:

lodsb           ; AL = próximo caracter da string
int 10h         ; chama serviço da BIOS
loop NextChar

mov ax,4C00h        ; termina programa
int 21h 

ErrorOpening:

mov dx,offset OpenError ; exibe um erro
mov ah,09h      ; usando a função 09h
int 21h         ; chama serviço do DOS
mov ax,4C01h        ; termina programa com um errorlevel =1 
int 21h 

ErrorReading:
mov dx,offset ReadError ; exibe um erro
mov ah,09h      ; usando a função 09h
int 21h         ; chama serviço do DOS
mov ax,4C02h        ; termina programa com um errorlevel =2
int 21h

.data
Handle DW ?             ; para guardar o manipulador do arquivo
FileName DB "C:\test.txt",0     ; arquivo a ser aberto
OpenError DB "Ocorreu um erro(abrindo)!$"
ReadError DB "Ocorreu um erro(lendo)!$"
Buffer DB 100 dup (?)   ; buffer para armazenar dados

END start

Would it be possible to read through the end of the file without having to report the number of bytes to be read?

    
asked by anonymous 01.06.2018 / 04:16

1 answer

0

To read the file without specifying the size, you need to read it until it detects the end of the file.

An example of how to change the program to read larger files without specifying the size:

In the file read routine, modify to read a fixed size block and change the address of the buffer as the blocks of text are read. To detect the end of the file, compare the number of bytes read with the requested quantity and finish if it is smaller ( INT 21,3F ):

        ...
        mov dx,offset Buffer    ; endereço do buffer em dx

    LerBloco:                   ; início da leitura do bloco

        mov bx,Handle           ; manipulador em bx
        mov cx,512              ; quantidade de bytes a serem lidos
        mov ah,3Fh              ; função 3Fh - leitura de arquivo
        int 21h                 ; chama serviço do DOS

        jc ErrorReading         ; desvia se carry flag estiver ligada - erro!

        add [BytesLidos], cx    ; adiciona a quantidade de bytes lidos
        cmp ax, cx              ; compara quantos bytes foram lidos com a quantidade solicitada na função            
        jb  Continuar           ; sair da leitura, caso seja menor (final do arquivo encontrado!)

        add dx,512              ; avança o buffer de leitura
        cmp dx, FimBuffer       ; verifica se chegou no final do buffer
        jae Continuar           ; se dx for maior ou igual ao final, sair da leitura
        jmp LerBloco

    Continuar:

        mov bx,Handle           ; coloca manipulador do arquivo em bx
        mov ah,3Eh              ; função 3Eh - fechar um arquivo
        int 21h                 ; chama serviço do DOS

        mov cx,[BytesLidos]     ; comprimento da string (Ler o valor da variável BytesLidos)
        mov si,OFFSET Buffer    ; DS:SI - endereço da string
        xor bh,bh               ; página de vídeo - 0
        mov ah,0Eh              ; função 0Eh - escrever caracter
        ...

In the data area, define the variables BytesLidos , EndBuffer and increase the buffer size:

    .data
    BytesLidos  DW 0                ; Bytes lidos do arquivo
    Buffer      DB 4096 dup (?)     ; buffer para armazenar dados
    FimBuffer   DW $-Buffer         ; Endereço do fim do buffer

With these changes, the program can read a file up to 4096 bytes (maximum buffer size) without having to specify the size to be read in advance.

If you need to read larger files, you can create a similar logic to read a block, print and restart the buffer, read the next one, print and restart the buffer, and so on.     

01.06.2018 / 05:50