Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
写入0xb8000000将在屏幕上产生输出,而不需要任何打印语句,如“printf”` #包括 #包括 void main() { char far*v=(char far*)0xb8000000; clrsc(); *v='w'; v+=2; *v='e'; getch(); }_C_Dos - Fatal编程技术网

写入0xb8000000将在屏幕上产生输出,而不需要任何打印语句,如“printf”` #包括 #包括 void main() { char far*v=(char far*)0xb8000000; clrsc(); *v='w'; v+=2; *v='e'; getch(); }

写入0xb8000000将在屏幕上产生输出,而不需要任何打印语句,如“printf”` #包括 #包括 void main() { char far*v=(char far*)0xb8000000; clrsc(); *v='w'; v+=2; *v='e'; getch(); },c,dos,C,Dos,输出为:we 如果没有任何printf或其他打印语句,我无法理解输出是如何打印的。他直接向通常位于该地址的视频缓冲区写入 而且,这是一种严重的老式图形操作。您没有指定它是什么平台,而且它显然不会使这段讨厌的代码崩溃 旧式DOS平台上的0xb8000000是视频内存缓冲区,因此在文本模式下,您可以直接在那里写入字符。请参见此处:首先,它获取视频缓冲区开头的地址。然后它清除屏幕,并开始向缓冲区添加文本。这是视频内存地址空间的开始。此处写入内存的内容将显示在屏幕上。之所以显示它,是因为0xB80000

输出为:
we


如果没有任何
printf
或其他打印语句,我无法理解输出是如何打印的。

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


而且,这是一种严重的老式图形操作。

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


旧式DOS平台上的
0xb8000000
是视频内存缓冲区,因此在文本模式下,您可以直接在那里写入字符。请参见此处:

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

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

之所以显示它,是因为
0xB8000000
这是一个x86实模式IBM PC程序,它假定CGA/EGA/VGA兼容图形适配器处于默认内存位置(B800:0000)映射的彩色文本模式;它基本上来自MS-DOS时代(1980/1990年代)。无论如何,这是非常古老的学校

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

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

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

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

清除屏幕

clrscr();
在行
0
、列
0
中写入字符
w

*v='w';
跳过
2个字节
(在字符模式下,缓冲区是交错的:
1字节
用于字符,
1字节
用于颜色。
1位
用于闪烁,
3位
用于背景0-7,
4位
用于前景0-15,按此方式打包:
前景+16*背景+128,如果您想要闪烁

在行
0
、列
1
写入字符
e

*v='e';
等待钥匙


现在有一个关于的链接,对于那些觉得需要知道“老一代”是如何做到的人来说,在“Windows”出现之前(甚至在所有“Linux”出现之前:-)。啊。。。还有另一个链接(这次是一个维基)供那些仍然不知道是什么的人使用。

Plz正确地格式化代码,并增加您的接受度r8。(记录在案,在不到5分钟的时间内进行9到10次编辑之前,这更有趣)。哇,向内存中的任意地址写入。这可能会导致惊人的崩溃或其他未定义的行为。@Ebo如果你要做一些愚蠢的事情,你最好在荣耀和失败的火焰中完成。大约一分钟内编辑9次!这是某种记录吗?@Andrew:
9次编辑大约一分钟!这是某种记录吗?
:多人试图纠正同一文本,但方式不同,这就是所谓的竞争条件…:-)@如果你认为我的解释不够完整,下次我会让你用BIOS的int10h在屏幕上写:-):-):-):-(),但是请记住(引用维基)
int10h相当慢
!:-)(如果不清楚,这是个笑话)我刚刚完成了关于Real Mode的文章,我最后的想法是“嘿,我很高兴我太年轻了,不能在这些环境中编写代码!”,所以我想我今晚会通过“INT 10h”考试…^ ^。。。
v+=2;
*v='e';
getch();