在C中,如何写入特定的内存位置,例如视频内存b800,在DOS(真实DOS,MS DOS 6.22)

bar*_*lop 8 c dos turbo-c

在C中,如何写入特定的内存位置,例如视频内存b800,在DOS(真实DOS,MS DOS 6.22)

我知道C没有内置任何内容来做到这一点,但可能有一些特定的平台,例如DOS特定的API函数可以.

一个小的演示程序,它会很棒.

我有Turbo C(TCC.EXE - 不是小编译器,Turbo C编译器)

我知道调试可以做到这一点(例如我知道的-f b800:0 FA0 21 CE一些微调) (将一些感叹号写入命令行).但我想要一个C程序写入b800:0

Sim*_*ter 10

地址b800:0000使用一段0xb800和一段偏移量0x0000.这对应于线性地址0xb8000(注意额外的0,因为段向左移位4位).

要在保护模式下创建指向此地址的指针,您可以使用

char *p = (char *)0xb8000;
Run Code Online (Sandbox Code Playgroud)

但是,您最有可能处于实模式,因此需要构造一个远指针:

char far *p = (char far *)0xb8000000;
Run Code Online (Sandbox Code Playgroud)

32位值分为两个16位值,分配给段和偏移量.

您可以正常使用此指针,然后:

*p = '!';
Run Code Online (Sandbox Code Playgroud)

  • 为了确定实际*看*的东西,最好设置字符属性. (2认同)
  • @fjardon 是对的。您可能想要添加“用颜色写入字符串”功能的示例。OP 可能不知道字符和属性数据的交错。 (2认同)
  • 不,需要进行仿真,因为Windows不会为您的程序提供直接的硬件访问.如果写入字符缓冲区在Windows上工作,那是因为仿真层捕获了访问并解释了你的意图,然后使用加速图形驱动程序将字符渲染到屏幕外的位图,然后在屏幕上复制.下一次垂直刷新.如果您真的想要直接硬件访问,则需要启动DOS. (2认同)

fja*_*don 5

你能试试这个吗(未经测试,因为我没有旧电脑)

char far* video = 0xb8000000L;
*(video++) = '!';
*(video++) = 0x0A;
Run Code Online (Sandbox Code Playgroud)


enh*_*lep 5

只需创建一个指向基地址的指针,然后像访问数组一样访问内存。回想一下,在文本模式下,屏幕上显示的每个字符都有两个字节。第一,把握角色本身。第二个保存属性。高4位是背景属性,低4位是前景。设置前景属性中的最高位使其成为高强度颜色,而设置背景属性中的高位则使前景闪烁。这意味着有 8 种颜色可用于背景,16 种颜色可用于前景,最后还可以使文本闪烁。

例如对于模式 0x13 的东西: char far *graphScreen = (char far*) 0xA0000000;

对于文本模式的东西, char far *textScreen = (char far*) 0xB8000000;

写入屏幕内存就像这样简单 textScreen[ someIndex ] = someChar; textScreen[ someIndex+1 ] = someAttrib;