如何在C语言中使用带有8086的REGS结构的int86函数读取和显示文件数据 [英] How to read and display file data using int86 function with REGS struct for 8086 in C-Language
本文介绍了如何在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, ®s, ®s);
// 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, ®s_r, ®s_r);
printf("DATA : %c", buff);
getch();
clrscr();
}
以下是一些参考链接
ASM移动文件 指针
如有任何帮助,将不胜感激。
推荐答案
要获取数据段,您可以尝试以下方式: 声明一个远指针并将缓冲区的地址分配给它,然后重新转换它。
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屋!
查看全文