在没有库的情况下使用C进行打印和清除
我正在尝试开发一种操作系统。在没有库的情况下使用C进行打印和清除,c,printing,C,Printing,我正在尝试开发一种操作系统。 它可以工作,但我编写的函数“print”有一个错误: 如果我打印两个字符串,则只显示一个字符串,并且命令\n不起作用。 我的问题是: 如何使用命令\n? 和 如何在不使用库的情况下创建函数清除? 这是功能打印: void print(char* message, int color) { char* mem = (char*)(0xb8000); while(*message != 0) { *mem = *message;
它可以工作,但我编写的函数“print”有一个错误:
如果我打印两个字符串,则只显示一个字符串,并且命令
\n
不起作用。我的问题是: 如何使用命令
\n
?和
如何在不使用库的情况下创建函数清除?
这是功能打印:
void print(char* message, int color)
{
char* mem = (char*)(0xb8000);
while(*message != 0)
{
*mem = *message;
mem++;
message++;
*mem = (char*)color;
mem++;
}
}
PS它可以工作,但问题是如果我使用函数print两次(带或不带
\n
仅打印第二部分。要模拟换行,您可能需要在视频内存中写入与当前行中剩余字符相同的空格。因此,您需要记住写入当前行的字符数
这同样适用于滚动。您需要复制内存,以使屏幕上的最后一行再次变为空白。您应该了解打印功能的某些上下文 您应该有一个全局(或静态)变量来记住视频输出内存的最后打印位置 比如: ``` ```
清除时:只需填充整个视频输出内存以清空并重置
last_pos
请不要用粗体呼喊。“…(0xb8000);
“我多久没有看到这个神奇的数字了…:-)您总是从左上角开始编写字符串。您应该编写处理a)的代码光标位置,b)字符,如\n
等…您的问题中缺少基本部分,特别是地址0xb8000处的内容以及格式。作为一个老恐龙,我记得它应该是PC系统在实模式下的屏幕文本缓冲区地址,一个字节代表字符,后一个字节代表颜色。但它过去取决于屏幕大小和可用的颜色。如果没有这些信息,你的问题就很难理解。操作系统比真实模式的屏幕驱动程序更重要。。。
static int last_pos = 0;
void print(char* message, int color)
{
char* mem = (char*)(0xb8000);
mem += last_pos * 2;
while(*message != 0)
{
if(*message == '\n') {
set the mem to next line and calculate the new last_pos
continue;
}
*mem = *message;
mem++;
message++;
*mem = (char*)color;
mem++;
last_pos ++;
if (last_pos >= max_video_buffer) {
move content the buffer to scroll the screen
or
simply reset the last_pos and mem to restart from top-left.
}
}
}