You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

开发操作系统:无库实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:23:39