写入0xb8000000会在屏幕上产生输出,而不会出现任何打印语句,例如`printf`

#include  #include  void main() { char far *v = (char far*)0xb8000000; clrscr(); *v = 'w'; v += 2; *v = 'e'; getch(); } 

输出是: we

我没有得到如何在没有任何printf或其他打印语句的情况下打印输出。

这是一个x86 实模式 IBM PC程序,它假定CGA / EGA / VGA兼容的图形适配器采用彩色文本模式映射到默认存储位置(B800:0000); 它基本上来自MS-DOS(20世纪80年代/ 90年代)的时代。 无论如何,这是一所非常古老的学校!

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

video缓冲区的内存地址(实模式下)(如果你有一个旧的Hercules,请使用0xb0000000

 clrscr(); 

清除屏幕

 *v='w'; 

在第0行,第0列写入字符w

 v+=2; 

跳过2 bytes (在字符模式下缓冲区是交错的: 1 byte1 byte ,颜色为1 byte 。闪烁为1 bit ,后台为0-73 bits ,前景为0-154 bits ,打包这样: foreground + 16 * background + 128 if you want flashing

 *v='e'; 

在第0行,第1列写入字符e

 getch(); 

等待钥匙

现在是关于CGA文本模式格式的链接,对于那些需要知道“老一代”如何做到这一点的人,在“Windows”出现之前(甚至在所有“Linux”来之前:-))。 啊…和那些仍然不知道REAL-MODE是什么的链接(这次是wiki)。

他正在直接写入video缓冲区,该缓冲区通常位于该地址。

此外,这是严重旧学校图形操纵。

它显示的原因是因为0xB8000000 是video内存启动的地址 。

你没有指定它是什么平台,而且它显然不会使这个讨厌的代码崩溃。

传统DOS平台上的0xb8000000是video内存缓冲区,因此在文本模式下,您可以直接在那里写字符。 见这里: http : //wiki.answers.com/Q/What_is_0xB8000000

首先,它获取video缓冲区开头的地址。 然后它清除屏幕,并开始向缓冲区添加文本。

这是video内存地址空间的开始。 此处写入内存的内容将显示在屏幕上。