如何在 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, &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();

这里有一些参考链接

8086 int 21h/42h

asm move File Pointer

我们将不胜感激。

【问题讨论】:

您还需要设置ds。困难的问题是弄清楚你的 C 编译器使用什么...... ds 里会有什么? 无论你的 C 编译器使用什么。也许它有一些宏来访问指针的段? 不,我没有,我也尝试使用 asm..... 在 C 中嵌入汇编代码,但它也没有工作,buff 保持不变.无法访问数据。 AFAIR 在dos.h 中有宏是FP_SEG(&amp;x)FP_OFF(&amp;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”对性能造成的影响?

c语言中,如何画带有函数嵌套的流程图?

arm-linux-gcc工具链:汇编文件如何include c的头文件呢???

如何在 SQL (JPA) 中使用带有 IN 运算符的嵌套 SELECT 语句?

C语言结构体存储问题

c语言一个结构体如何在多个源文件里面调用?