在C语言中,我如何写入一个特定的内存位置,例如视频内存b800,在DOS(真正的DOS, MS DOS 6.22)



在C语言中,我如何写一个特定的内存位置,例如视频内存b800,在DOS(真正的DOS, MS DOS 6.22)

我知道C没有任何内置的功能,但可能有一些特定于平台的API函数,例如DOS特定的API函数。

如果有一个小的演示程序可以做到这一点,那就太好了。

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

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

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

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

char *p = (char *)0xb8000;

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

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

32位的值被分成两个16位的值,分别分配给segment和offset。

你可以正常使用这个指针,然后:

*p = '!';

你可以试试这个(未经测试,因为我没有我的旧电脑)

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

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

E。G为模式0x13的东西:char far *graphScreen = (char far*) 0xA0000000;

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

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

最新更新