如何在c中以受保护模式打印字符串

时间:2014-01-11 14:44:55

标签: operating-system printf osdev vga protected-mode

我是os Deving的首发,并设法创建一个bootloader然后一个kernel.I cam成功跳转到保护模式并将控件转移到kernel.I能够写单个字符但打印字符串不起作用。这是我的printString()函数。

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

我的打印角色功能就在这里

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");

请帮助我,我是os deving的首发

2 个答案:

答案 0 :(得分:1)

我建议将X和Y坐标跟踪为(静态)全局变量,并将它们用于偏移到内存中。此外,它不应该是offset+1offset+2,而应是offsetoffset+1。这是唐老师在答案中所说的。

可以在http://www.jamesmolloy.co.uk/tutorial_html/3.-The%20Screen.html找到学习如何打印到屏幕的好教程 - 他详细介绍了如何打印东西。它也是开始学习OSDev以及http://forum.osdev.org/index.php的OSDev论坛的好地方。

答案 1 :(得分:0)

你的功能有几个问题

首先,你的print函数会获取一个指向你想要角色本身的角色的指针。

其次,如果你正在调用像printString这样的pointer to pointer to char函数,那么printString函数实际上正在使用printString("Hello World");这不是你想要的。

你的编译器应该警告你这些。

您的代码看起来应该是这样的

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

void print(char character){
  // ...
  vidmem[offset+1] = character;
  // ...  
}