Я разрабатываю свою собственную операционную систему. Я завершил загрузочный сектор и успешно загрузил мое ядро. Моя среда разработки - Ubuntu 14.04 и GCC 4.8. Мое ядро будет работать под BOCHS. Я хотел бы напечатать определенный символ в определенной позиции на экране, так что я создал такую функцию:Удивительное явление, когда я вызываю функцию для печати символа
void print_char(char target, int col, int row, unsigned char attribute) {
//attribute controls the colour of the character
char * vidmem = (char *) VIDEO_ADDRESS; //#define VIDEO_ADDRESS 0xb8000
*vidmem = target;
//TODO: add other control statements
}
Я называю эту функцию в моей main
функции, которая является точкой входа моего ядра:
print_char('T', 0, 0, (unsigned char) 0x0f);
Приведенный выше код должен печатать символ «Т» в левом верхнем углу экрана. Он не появляется! После того, как я изменил декларацию print_char
:
void print_char(char target, int col, int row, int attribute)
Или что-то вроде этого:
void print_char(char target, int col, int row)
затем называют это как print_char('T', 0, 0)
После того как я изменить его, все работает! Я действительно смущен этой проблемой. Может ли кто-нибудь объяснить это мне?
Это почти невозможно для нас, чтобы помочь вам с такой неполной информацией. Но когда у вас странные симптомы, подобные этому, это часто является результатом ошибок в коде, вызывающих неопределенное поведение. Ошибка может быть даже не в той части кода, где проявляются симптомы. Но из информации, которую вы предоставили, мы не можем сказать. – kaylum
Я не использовал Bochs в то время, но я помню, что он имеет относительно приличный отладчик сборки. – immibis
Возможно, я просто неправильно читаю код. Но предположим '* vidmem = attribute'; , а 'vidmem' имеет адрес 0xB8000, который записывал бы атрибут в 0xB8000. 0xB8000 - первый символ, 0xB8001 - атрибут первого символа, 0xb8002 - второй символ, а 0xb8003 - атрибут второго символа и так далее. На мой взгляд, этот атрибут, похоже, написан неверным байтом. –