#include <stdio.h>
#include <conio.h>
void main()
{
char far *v = (char far*)0xb8000000;
clrscr();
*v = 'w';
v += 2;
*v = 'e';
getch();
}
输出结果为:we
我不明白为什么没有任何printf
或其他打印语句,输出就可以显示。
#include <stdio.h>
#include <conio.h>
void main()
{
char far *v = (char far*)0xb8000000;
clrscr();
*v = 'w';
v += 2;
*v = 'e';
getch();
}
输出结果为:we
我不明白为什么没有任何printf
或其他打印语句,输出就可以显示。
这是一个 x86 实模式 IBM PC 程序,假设在默认内存位置(B800:0000)映射了 CGA/EGA/VGA 兼容的彩色文本模式图形适配器;它基本上来自于 MS-DOS 时代(1980年代/1990年代)。无论如何,它非常老派!
char far *v=(char far*)0xb8000000;
视频缓冲区的内存地址(在实模式下)(如果您使用旧的Hercules,请使用0xb0000000
)
clrscr();
清空屏幕
*v='w';
在第0
行,第0
列写入字符w
v+=2;
跳过2个字节
(在字符模式下,缓冲区是交错的:1个字节
用于字符,1个字节
用于颜色。1位
用于闪烁,3位
用于背景0-7和4位
用于前景0-15,以这种方式打包:前景+16*背景+128(如果您想要闪烁)
)
*v='e';
在第0
行,1
列写入字符e
getch();
等待按键
现在是一个关于CGA文本模式格式的链接,对于那些想要了解“旧一代”是如何做到的,在“Windows”(甚至在所有“Linux”之前)出现之前。啊...还有另一个链接(这次是维基百科),供那些仍然不知道REAL-MODE是什么的人参考。
您没有指定平台,显然这不是一个会崩溃的恶意代码。
在传统的DOS平台上,0xb8000000
是视频内存缓冲区,在文本模式下,您可以直接在那里写入字符。请参见此处:http://wiki.answers.com/Q/What_is_0xB8000000
这是视频内存地址空间的开头。在这里写入的内容将显示在屏幕上。