写入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 byte
为1 byte
,颜色为1 byte
。闪烁为1 bit
,后台为0-7为3 bits
,前景为0-15为4 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内存地址空间的开始。 此处写入内存的内容将显示在屏幕上。