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

Bri*_*Roy 6 c dos

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

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

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

  getch();
}
Run Code Online (Sandbox Code Playgroud)

输出是: we

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

xan*_*tos 23

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

char far *v=(char far*)0xb8000000;
Run Code Online (Sandbox Code Playgroud)

视频缓冲区的内存地址(实模式)(0xb0000000如果你有一个旧的Hercules则使用)

clrscr();
Run Code Online (Sandbox Code Playgroud)

清除屏幕

*v='w';
Run Code Online (Sandbox Code Playgroud)

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

v+=2;
Run Code Online (Sandbox Code Playgroud)

跳过2 bytes(在字符模式中的缓冲液是交织:1 byte用于字符和1 byte的颜色.1 bit用于闪烁,3 bits用于背景0-74 bits对所述前景0-15,装在这种方式:foreground + 16 * background + 128 if you want flashing)

*v='e';
Run Code Online (Sandbox Code Playgroud)

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

getch();
Run Code Online (Sandbox Code Playgroud)

等待钥匙

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


Ben*_*tin 9

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

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