es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo leer y mostrar datos de archivo usando la función int86 con la estructura REGS para 8086 en lenguaje C.

Tengo un archivo de texto con contenido del cual debo mover el cursor de forma relativa al BOF (Beginning of File) y mostrar su contenido en la pantalla usando int 21h/42h.

Aquí está el código en el que estoy trabajando. Estoy usando Windows 98 (DOS de 16 bits) en una máquina virtual y es parte de mi tarea de programación de sistemas, así que tengo que usarlo. Intenté usar Turbo C++ con DOSBox, pero tiene algunos problemas.

Al imprimir “buff”, muestra valores aleatorios.

Código

#include <stdio.h>
#include <conio.h>
#include <fcntl.h>
#include <bios.h>
#include <dos.h>

unsigned int handle;
char buff[50];

void main(){

    union REGS regs; // establecer puntero
    union REGS regs_r; // leer archivo
    handle = open("text.txt", O_RDONLY);

    // establecer puntero al BOF (Beginning of File)
    regs.x.bx = handle;
    regs.h.ah = 0x42; // LSEEK
    regs.h.al = 0x00; // Modo (0) BOF
    regs.x.cx = 0;
    regs.x.dx = 0;
    int86(0x21, &regs, &regs);


    // leer el archivo

    regs_r.x.bx = handle;
    regs_r.x.cx = 0x07; // ¿Bytes a leer?
    regs_r.h.ah = 0x3fh; 
    regs_r.x.dx = (unsigned int) buff; // buffer para los datos
    int86(0x21, &regs_r, &regs_r);

    printf("DATOS: %c", buff);


    getch();
    clrscr();
}

Aquí hay algunos enlaces de referencia

Cualquier ayuda será apreciada.</dos.h></bios.h></fcntl.h></conio.h></stdio.h>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para mover el cursor desde relativo al comienzo del archivo (BOF) y mostrar su contenido en la pantalla utilizando int 21h/42h, se puede utilizar el siguiente código:

    #include <stdio.h>
    #include <conio.h>
    #include <fcntl.h>
    #include <bios.h>
    #include <dos.h>
    
    unsigned int handle;
    char buff[50];
    
    void main(){
    
        union REGS regs; // establecer puntero
        union REGS regs_r; // leer archivo
        handle = open("text.txt", O_RDONLY);
    
        // establecer el puntero en BOF (Beginning of File)
        regs.x.bx = handle;
        regs.h.ah = 0x42; // LSEEK
        regs.h.al = 0x00; // Modo (0) BOF
        regs.x.cx = 0;
        regs.x.dx = 0;
        int86(0x21, &regs, &regs);
    
        // leer el archivo
        regs_r.x.bx = handle;
        regs_r.x.cx = sizeof(buff);
        regs_r.h.ah = 0x3f; 
        regs_r.x.dx = (unsigned int) buff; // búfer para los datos
        int86(0x21, &regs_r, &regs_r);
    
        printf("DATOS : %s", buff);
    
        getch();
        clrscr();
        close(handle);
    }
    

    Hubo un par de problemas en el código original:
    – La instrucción printf solo estaba imprimiendo el primer carácter del búfer. Para imprimir todo el contenido, debemos usar %s en lugar de %c.
    – El tamaño de los datos a leer no se estableció correctamente. Necesitamos usar sizeof(buff) para asegurarnos de leer todo el búfer.
    – Faltaba la función close, que es necesaria para cerrar correctamente el identificador del archivo.

    ¡Espero que esto ayude!</dos.h></bios.h></fcntl.h></conio.h></stdio.h>

Comments are closed.