写入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();