#include <stdio.h>
#include <conio.h>
void main()
{
char far *v = (char far*)0xb8000000;
clrscr();
*v = 'w';
v += 2;
*v = 'e';
getch();
}
输出为:we
我没有得到如何在没有任何printf
或其他打印语句的情况下打印输出。
答案 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)
这是视频内存地址空间的开头。这里写入内存的内容将显示在屏幕上。