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

时间:2011-02-23 20:22:10

标签: c dos

#include <stdio.h>
#include <conio.h>

void main()
{
  char far *v = (char far*)0xb8000000;
  clrscr();

  *v = 'w';
  v += 2;
  *v = 'e';

  getch();
}

输出为:we

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

6 个答案:

答案 0 :(得分:23)

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

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

视频缓冲区的内存地址(实模式下)(如果您有旧的Hercules,请使用0xb0000000

clrscr();

清除屏幕

*v='w';

0行,第0栏写{0}}

w

跳过v+=2; (在字符模式下缓冲区是交错的:2 bytes代表字符,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栏写{0}}

1

等待钥匙

现在有一个关于CGA Text Mode Format的链接,对于那些需要知道“老一代”如何做到这一点的人,在“Windows”出现之前(甚至在所有“Linux”出现之前:-)) 。啊......以及那些仍然不知道REAL-MODE是什么的链接(这次是wiki)。

答案 1 :(得分:9)

他正在直接写入通常位于该地址的视频缓冲区。

另外,这是严重的旧学校图形处理。

答案 2 :(得分:1)

显示它的原因是0xB8000000 is the address where video memory starts

答案 3 :(得分:0)

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

传统DOS平台上的

0xb8000000是视频内存缓冲区,因此在文本模式下,您可以直接在那里写字符。见这里:http://wiki.answers.com/Q/What_is_0xB8000000

答案 4 :(得分:0)

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

答案 5 :(得分:0)

这是视频内存地址空间的开头。这里写入内存的内容将显示在屏幕上。