如何在 C 语言中使用带有 REGS 结构的 int86 函数读取和显示文件数据,用于 8086
Posted
技术标签:
【中文标题】如何在 C 语言中使用带有 REGS 结构的 int86 函数读取和显示文件数据,用于 8086【英文标题】:How to read and display file data using int86 function with REGS struct for 8086 in C-Language 【发布时间】:2022-01-11 19:51:22 【问题描述】:我有一个包含一些内容的文本文件,我必须将光标从相对于 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, ®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();
这里有一些参考链接
8086 int 21h/42h
asm move File Pointer
我们将不胜感激。
【问题讨论】:
您还需要设置ds
。困难的问题是弄清楚你的 C 编译器使用什么......
ds 里会有什么?
无论你的 C 编译器使用什么。也许它有一些宏来访问指针的段?
不,我没有,我也尝试使用 asm..... 在 C 中嵌入汇编代码,但它也没有工作,buff 保持不变.无法访问数据。
AFAIR 在dos.h
中有宏是FP_SEG(&x)
和FP_OFF(&x)
。我所说的“Turbo C++”是指“Borland Turbo C++”RIP。
【参考方案1】:
要获取数据段,您可以尝试以下方式: 声明一个远指针并将缓冲区的地址分配给它并重铸它。
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);
它应该可以工作。
【讨论】:
我应该将哪个值分配给regs_r.x.dx
= (unsigned int)addr_value & 0xffff;以上是关于如何在 C 语言中使用带有 REGS 结构的 int86 函数读取和显示文件数据,用于 8086的主要内容,如果未能解决你的问题,请参考以下文章
在不使结构只读的情况下避免使用带有结构的“in”对性能造成的影响?
arm-linux-gcc工具链:汇编文件如何include c的头文件呢???