Странный расчет позиции взаимодействия с видеопамятью в BIOS

Я написал очень простое ядро, которое загружается внутри QEMU с помощью GRUB. У меня, вероятно, проблема с вычислением указателя, но я не могу понять, что не так.

Следующий код работает, как и ожидалось, он печатает заданный символ.

char* video = 0xb8000 + 0;
char* color = 'A';

*video++ = c;
*video++ = color;

Однако, когда я изменяю вычисление указателя видео на это, он не работает, на экране ничего не появляется:

int pos = 0;
char* video = 0xb8000 + pos;

Но когда я делаю переменную pos unsigned int, она работает неправильно, а когда я делаю ее 1, она работает как первая, но почему она должна быть 1?

unsigned int pos = 1;
char* video = 0xb8000 + pos;

Мои флаги C: CFLAGS = -std=c99 -pedantic -Wall -nostdlib -ffreestanding -g


person Mustafa    schedule 08.09.2013    source источник
comment
Разве это не должно быть char color = 'A' (вместо указателя)?   -  person Martin R    schedule 08.09.2013


Ответы (1)


Возможно, попробуйте добавить к нему такой префикс: (char*)0xB8000.

char* video = (char*)0xB8000;
int pos = 0;

video[pos++] = 'A';
video[pos++] = 0x7;
person DmitryK    schedule 08.09.2013
comment
Это заставило меня осознать, что я неправильно использовал цвет и символ, порядок должен быть обратным, сначала цвет, затем символ! Спасибо - person Mustafa; 08.09.2013
comment
Первый (младший) байт - символ ASCII, второй (старший) байт - атрибуты (цвет, мерцание и т.д.) - person DmitryK; 08.09.2013
comment
О, я использовал это: char* video = (char*)0xB8000;video[2 * pos] = c; video[2 * pos + 1] = color;но последний символ всегда является неправильным атрибутом, что не так? - person Mustafa; 08.09.2013
comment
Вроде исправили, когда сделал смещение на 1, вдруг все заработало! - person Mustafa; 08.09.2013