我想在c中创建一个基本的操作系统,我想制作一个printf 功能。
void printf(char* str){
(unsigned short*) VideoMemory = (unsigned short*) 0xb800;
for(int i = 0; str[i] != '\0'; ++i)
VideoMemory[i] = (VideoMemory[i] & 0xFF00) | str[i];
}
kmain()
{
printf("Hello from kernel.");
}
但是当我编译它时,我得到了这个错误:
kernel.c:3:20:错误:'VideoMemory'未声明(首次在此函数中使用) (unsigned short *)VideoMemory =(unsigned short *)0xb800;
答案 0 :(得分:3)
您似乎瞄准了真实模式的PC BIOS系统。您对VideoMemory
的定义不正确。如果编译器在平面模式下使用32位指针,请尝试以下操作:
void printf(char *str) {
unsigned short *VideoMemory = (unsigned short*)0xb8000UL;
for (int i = 0; str[i] != '\0'; ++i)
VideoMemory[i] = (VideoMemory[i] & 0xFF00) | str[i];
}
void kmain() {
printf("Hello from kernel.");
}
否则,使用16位整数和分段指针,您可能需要使用far
或__far
关键字,例如:
unsigned short far* VideoMemory = (unsigned short far*)0xb8000000UL;
请注意,使用与标准函数不同的语义定义自己的printf
版本是个坏主意。它会在程序员之间造成混淆,编译器可能会执行不正确的优化,例如将printf
调用转换为其他内容。调用此函数kputstr
,直到您可以使用可变参数列表处理格式化,然后将其重命名为kprintf
。