Запись в 0xb8000000 дает вывод на экран без каких-либо инструкций печати, таких как "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 или другие операторы печати.

6 ответов


это x86 реального режима программа IBM PC, которая предполагает, что CGA/EGA / VGA совместимый графический адаптер в режиме цветного текста отображается в месте памяти по умолчанию (B800:0000); это в основном из эпохи MS-DOS (1980-е/1990-е). Во всяком случае, это очень старая школа!

char far *v=(char far*)0xb8000000;

адрес памяти (в реальном режиме) видеобуфера (используйте 0xb0000000 если у вас есть старый Геркулес)

clrscr();

очищает экран

*v='w';

пишет в строке 0, колонки 0 символ w

v+=2;

переход 2 bytes (в символьном режиме буфер чередуется:1 byte для характера и 1 byte цвета. 1 bit для мигания, 3 bits на фоне 0-7 и 4 bits на переднем плане 0-15, упакованные таким образом: foreground + 16 * background + 128 if you want flashing)

*v='e';

пишет в строке 0, колонки 1 символ e

getch();

ждет для ключа

теперь ссылка о формат текстового режима CGA, для тех, кто чувствует необходимость знать, как "старое поколение" это сделало, до того, как "Windows" пришла (и даже до того, что "Linux" пришел :-) ). Ах... и еще одна ссылка (на этот раз wiki) для тех, кто еще не знает, что РЕАЛЬНЫЙ РЕЖИМ есть.


Он пишет непосредственно в видеобуфер, который обычно находится по этому адресу.

кроме того, это серьезно старая школа графики манипуляции.


причина, по которой он отображается, заключается в том, что 0xB8000000 - это адрес, где начинается видеопамять.


вы не указали, какая это платформа, и, по-видимому, это не тот, который приведет к сбою этого неприятного кода.

0xb8000000 на устаревшей платформе DOS был буфер видеопамяти, поэтому в текстовом режиме вы могли писать символы там напрямую. Смотрите здесь: http://wiki.answers.com/Q/What_is_0xB8000000


во-первых, он получает адрес начала видеобуфера. Затем он очищает экран и начинает добавлять текст в буфер.


Это начало адресного пространства видеопамяти. То, что здесь записано в память, будет отображаться на экране.