Запись в 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
во-первых, он получает адрес начала видеобуфера. Затем он очищает экран и начинает добавлять текст в буфер.
Это начало адресного пространства видеопамяти. То, что здесь записано в память, будет отображаться на экране.