如何在C语言中使用带有8086的REGS结构的int86函数读取和显示文件数据 [英] How to read and display file data using int86 function with REGS struct for 8086 in C-Language

查看:14
本文介绍了如何在C语言中使用带有8086的REGS结构的int86函数读取和显示文件数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

打印时缓冲区显示随机值

代码

#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();
}

以下是一些参考链接

如有任何帮助,将不胜感激。

推荐答案

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

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);

它应该可以工作。

这篇关于如何在C语言中使用带有8086的REGS结构的int86函数读取和显示文件数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆