2013-09-08 3 views
1

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

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

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

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

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

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

Но когда я делаю позы переменным без знака Int, он работает uncorrectly, но когда Я делаю это 1, он работает как первый, но почему он должен быть 1?

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

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

+2

это не должно быть 'символ цвета =«A'' (вместо указатель)? –

+0

Да, вы правы! – Mustafa

ответ

1

Возможно попробовать предваряя его, как это: (символ *) 0xB8000

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

video[pos++] = 'A'; 
video[pos++] = 0x7; 
+0

Это заставило меня осознать, что я неправильно использовал цвет и характер, порядок должен быть обратным, сначала цвет, а затем характер! Спасибо – Mustafa

+0

Первый (низкий) байт - символ ASCII, второй (высокий) байт - атрибуты (цвет, мигание и т. Д.) – DmitryK

+0

О, я использовал это: 'char * video = (char *) 0xB8000; video [2 * pos] = c ; \t video [2 * pos + 1] = color; 'но последний символ всегда является неправильным атрибутом, что не так? – Mustafa