开发操作系统:无库实现C语言Print与Clear及Print功能问题排查
解决你的print函数问题与实现clear函数
嗨,咱们一步步拆解你遇到的问题,逐个解决:
一、为什么调用两次print只显示第二个内容?
你的print函数每次都从显存起始地址0xb8000开始写入,第二次调用直接覆盖了第一次的内容!解决思路很简单:用一个全局变量跟踪当前的显存写入位置,而不是每次都从头开始。
二、如何让\n换行命令生效?
当前函数完全没处理转义字符\n,自然不会触发换行。我们需要在遍历字符串时,单独判断\n,并把写入位置跳转到下一行的开头。
修复后的print函数代码
#include <stdint.h> // 全局变量:跟踪当前显存写入位置,初始化为VGA文本模式显存起始地址 char* current_mem = (char*)0xb8000; void print(char* message, int color) { while(*message != 0) { // 单独处理换行符\n if (*message == '\n') { // VGA文本模式默认80列,每个字符占2字节,每行共160字节 uint32_t offset = current_mem - (char*)0xb8000; uint32_t current_line = offset / 160; // 跳转到下一行的起始位置 current_mem = (char*)0xb8000 + (current_line + 1) * 160; message++; continue; } // 处理普通字符的写入 *current_mem = *message; current_mem++; *current_mem = (char)color; current_mem++; message++; } }
修改后,多次调用print会接着上一次的位置继续输出,遇到\n也会正确跳转到下一行开头。
三、不依赖库实现clear函数
clear的本质就是把整个VGA文本模式的显存区域,全部填充为空格(搭配你指定的颜色)。默认VGA文本模式是80列×25行,总共有80*25=2000个字符位置,每个位置占2字节(字符+颜色属性)。
clear函数实现代码
void clear(int color) { char* mem = (char*)0xb8000; // 遍历所有字符位置,填充空格和颜色 for (int i = 0; i < 80*25; i++) { *mem = ' '; // 写入空格字符 mem++; *mem = (char)color; // 写入颜色属性 mem++; } // 重置当前写入位置到显存开头 current_mem = (char*)0xb8000; }
调用这个函数后,整个屏幕会被清空,同时current_mem会重置到起始位置,方便后续的print输出。
小提醒:如果你的系统支持其他分辨率的文本模式,可以根据实际行列数调整80*25这个数值,不过默认VGA文本模式都是80×25的。
内容的提问来源于stack exchange,提问作者user9014687
相关产品推荐
相关产品推荐

