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

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

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

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

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

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

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

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

 char *p = (char *)0xb8000; 

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

 char far *p = (char far *)0xb8000000; 

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

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

 *p = '!'; 

你可以尝试这个(未经测试,因为我没有旧PC)

 char far* video = 0xb8000000L; *(video++) = '!'; *(video++) = 0x0A; 

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

例如,对于模式0x13 stuff: char far *graphScreen = (char far*) 0xA0000000;

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

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