0

我有一个包含一些内容的文本文件,我必须将光标从相对于 BOF 的位置移入,并使用 int 21h/42h 在屏幕上显示其内容。

这是我正在处理的代码。我在VM中使用Windows 98(16位DOS),它是我系统编程任务的一部分,所以我必须在带有DOSBox的Turbo c ++中尝试使用它,但它有一些问题。

在打印buff它显示随机值

代码

#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; // set pointer
    union REGS regs_r; // read file
    handle = open("text.txt", O_RDONLY);
    
    // set pointer to BOF (Begenning of File)
    regs.x.bx = handle;
    regs.h.ah = 0x42; // LSEEK
    regs.h.al = 0x00 // Mode (0) BOF
    regs.x.cx = 0;
    regs.x.dx = 0;
    int86(0x21, &regs, &regs);
    
    
    // read the file
    
    regs_r.x.bx = handle;
    regs_r.x.cx = 0x07; Bytes to read ?
    regs_r.h.ah = 0x3fh; 
    regs_r.x.dx = (unsigned int) buff; // buffer for data
    int86(0x21, &regs_r, &regs_r);
    
    printf("DATA : %c", buff);
    
    
    getch();
    clrscr();
}

这里有一些参考链接

任何帮助将不胜感激。

4

1 回答 1

0

要获取数据段,您可以尝试以下方式:声明一个远指针并将缓冲区的地址分配给它并重新转换它。

char buffer[100];
char far *ptr = (char far *)&buffer;

现在从指针中取出 16 个最高有效位,注意符号的补码

unsigned long addr_value = (unsigned long)ptr;
unsigned int data_segment = (unsigned int)(addr_value >> 16);

它应该工作。

于 2021-12-07T21:32:29.923 回答