在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
答案 0 :(得分:10)
地址b800:0000
使用0xb800
段和0x0000
的偏移量。这对应于线性地址0xb8000
(注意额外的0
,因为该段向左移位4位)。
要在protected mode中创建指向此地址的指针,请使用
char *p = (char *)0xb8000;
但是,您最有可能在real mode,因此您需要构建far pointer:
char far *p = (char far *)0xb8000000;
32位值分为两个16位值,分配给段和偏移量。
您可以正常使用此指针,然后:
*p = '!';
答案 1 :(得分:3)
你可以尝试这个(未经测试,因为我没有旧PC)
char far* video = 0xb8000000L;
*(video++) = '!';
*(video++) = 0x0A;
答案 2 :(得分:2)
只需创建一个指向基地址的指针,然后访问内存就好像它是一个数组。回想一下,在文本模式下,屏幕上显示的每个字符都有两个字节。第一个,持有角色本身。第二个包含属性。高阶4位是背景属性,低4是前景。设置前景属性中的最高位使其成为高强度颜色,而在背景属性中设置高位使前景闪烁。这意味着有8种颜色可用于背景,16种可用于前景,最后能够使文本闪烁。
对于模式0x13的东西:
char far *graphScreen = (char far*) 0xA0000000;
对于文字模式的东西,
char far *textScreen = (char far*) 0xB8000000;
然后写入屏幕内存就像这样简单
textScreen[ someIndex ] = someChar;
textScreen[ someIndex+1 ] = someAttrib;