Как напечатать строку в защищенном режиме в c

Я новичок в OS Deving, и мне удалось создать загрузчик, а затем ядро. Я успешно перешел в защищенный режим и передал управление ядру. Я могу писать отдельные символы, но строка печати не работает. Это моя printString () функция.

void printString(char * message[]){
 int i;
 for(i = 0; message[i] != '\0'; i++)
 {
     print(message[i]);
 }
}

И функция My print Character здесь

void print(char *character){
unsigned char *vidmem = (unsigned char *) VIDEO_ADDRESS;
int offset;   //Variable which hold the offset where we want to print our character
offset =  GetCursor(); //Setting our offset to current cursor position

  vidmem[offset+1] = character;
  vidmem[offset+2] = 0x0f;

SetCursor(offset+2);    
}

и это вызов функции

printString("manoj");

Пожалуйста, помогите мне, я новичок в разработке ОС


person Manoj Singh Negi    schedule 11.01.2014    source источник
comment
Что происходит, когда вы вызываете printString? Совсем ничего?   -  person Dougvj    schedule 11.01.2014
comment
Это дает неожиданные результаты   -  person Manoj Singh Negi    schedule 12.01.2014
comment
Где находится VIDEO_ADDRESS?   -  person Adrian Collado    schedule 28.02.2014


Ответы (2)


Я бы рекомендовал отслеживать координаты X и Y как (статические) глобальные переменные и использовать их для смещения в память. Кроме того, это должны быть не offset+1 и offset+2, а offset и offset+1. Это в дополнение к тому, что сказал тангр в своем ответе.

Хороший учебник по печати на экране можно найти по адресу http://www.jamesmolloy.co.uk/tutorial_html/3.-The%20Screen.html — он подробно описывает, как печатать. Это также хорошее место для начала изучения OSDev наряду с форумами OSDev по адресу http://forum.osdev.org/index.php.

person Adrian Collado    schedule 28.02.2014

С вашими функциями что-то не так

Во-первых, ваша функция print принимает указатель на символ, который выглядит так, как будто вам нужен сам символ.

Во-вторых, ваша функция printString на самом деле принимает pointer to pointer to char, а это не то, что вам нужно, если вы вызываете функцию printString как printString("Hello World");.

Ваш компилятор должен был предупредить вас об этом.

Ваш код должен выглядеть примерно так

void printString(char * message){
  // ...
}

void print(char character){
  // ...
  vidmem[offset+1] = character;
  // ...  
}
person tangrs    schedule 12.01.2014
comment
Привет, тангры, я ценю вашу помощь, но ваше решение не работает - person Manoj Singh Negi; 12.01.2014
comment
Вы должны быть более конкретными. Что случается? - person tangrs; 12.01.2014
comment
Может быть много других вещей, которые могут пойти не так. Правильно ли настроен ваш набор инструментов для доступа к буквальному пулу? (Т.е. утверждать, что *(volatile char*)"A" == 'A';). Действительно ли print вызывают? Правильно ли записывается видеопамять? Ваша функция SetCursor работает правильно? Периферийное видеоустройство инициализировано правильно? Означает ли нахождение в защищенном режиме, что вы не можете получить доступ к видеопамяти таким образом? - person tangrs; 13.01.2014
comment
мой setcursor() работает правильно все правильно я не знаю что не так - person Manoj Singh Negi; 15.01.2014