Запись в 0xb8000000 приводит к выводу на экран без каких-либо операторов печати, таких как `printf` - PullRequest
6 голосов
/ 23 февраля 2011
#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 ]

23 голосов
/ 23 февраля 2011

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

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

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

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 Text Mode Format , для тех, кто ЧУВСТВУЕТ необходимость знать, как это делало «старое поколение», до того, как появилась «Windows» (и даже до того, как «Linux») пришел :-)). Ах ... и еще одна ссылка (на этот раз вики) для тех, кто еще не знает, что такое РЕАЛЬНЫЙ РЕЖИМ .

9 голосов
/ 23 февраля 2011

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

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

1 голос
/ 23 февраля 2011

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

0 голосов
/ 23 февраля 2011

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

0 голосов
/ 23 февраля 2011

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

0 голосов
/ 23 февраля 2011

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

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

...