自制操作系统日记(7):字符串显示

简介: 上篇中我们在屏幕上画出了界面的大致轮廓,系统有了点模样,本篇继续跟着书籍,让程序中的字符串显示在屏幕上

代码仓库地址:https://github.com/freedom-xiao007/operating-system

简介

上篇中我们在屏幕上画出了界面的大致轮廓,系统有了点模样,本篇继续跟着书籍,让程序中的字符串显示在屏幕上

效果展示

先放最终的效果,可以看到显示了字符串,非常nice,如下图:

image.png

字体制作

以前一直疑惑为啥在桌面中需要字体,打印字符串不都是基本的吗?

到这步才知道在桌面系统中,显示字符已经是图形化的了,是以填充像素的方式显示的字符串

搞自己的字体太麻烦了,我们直接抄《30天自制操作系统》中字体,但根据我们当前的情况编译上有些不同的地方

首先把书中的源txt和两个工具复制到我们的工程中,即

  • hankaku.txt
  • makefont.exe
  • bin2obj.exe

这三个东西也上传仓库中了

接下来的制作字体基本步骤大致如下:

  • 1.将txt编程bin
  • 2.将bin编程obj
  • 3.将obj变成nasm汇编
  • 4.合并到kernel.asm中

一键运行脚本根据当前情况进行相关命令的新增和修改,完整如下,对命令添加了相关的注释:

D:\\software\\NASM\\nasm.exe bootsect.asm -o bootsect.bin -l bootsect.lst
D:\\software\\NASM\\nasm.exe setup.asm -o setup.bin  -l setup.lst

@REM 主函数编译
gcc -m32 -fno-asynchronous-unwind-tables -s -O2 -c -o .\\c\\start.o .\\c\\start.c
D:\\software\\objconv\\objconv.exe -fnasm .\\c\\start.o .\\c\\nasm\\start.asm

@REM 字体文件编译
.\makefont.exe .\hankaku.txt .\hankaku.bin
.\bin2obj.exe .\hankaku.bin .\hankaku.obj _hankaku
D:\\software\\objconv\\objconv.exe -fnasm .\hankaku.obj .\\c\\nasm\\hankaku.asm

@REM 处理生成的nasm不合理的的地方
D:\\software\\python3\\python.exe E:\\code\\python\\self\\tools\\tools\\objconv2nasm_clearn.py

@REM 合并文件,编译运行
copy /B head.asm+.\\c\\clean\\start.asm+func.asm+.\\c\\clean\\hankaku.asm kernel.asm
D:\\software\\NASM\\nasm.exe kernel.asm -o kernel.bin -l kernel.lst
copy /B bootsect.bin+setup.bin+kernel.bin  os.iso
D:\\software\\Bochs-2.7\\bochs -q -f D:\\software\\Bochs-2.7\\dlxlinux\\bochsrc_m.bxrc

python脚本进行了相关的变化,以前是读取指定的文件进行处理,目前改为读取/c/nasm下的所有文件,处理后放到/c/clean目录下

对应的完整代码如下:

import os


def clean_nasm_file(file_name, nasm_path, clean_path):
    nasm_file = nasm_path + "\\" + file_name
    clean_file = clean_path + "\\" + file_name
    with open(clean_file, "w") as fw:
        with open(nasm_file, "r") as fr:
            content = fr.readline()
            while content:
                if content.startswith("global") or content.startswith("extern"):
                    content = fr.readline()
                    continue
                content = content.replace("noexecute", "")
                content = content.replace("execute", "")
                fw.write(content)
                content = fr.readline()


if __name__ == "__main__":
    nasm_path = "E:\\code\\other\\self\\operating-system\\c\\nasm"
    clean_path = "E:\\code\\other\\self\\operating-system\\c\\clean"
    files = os.listdir(nasm_path)
    for file in files:
        if not os.path.isdir(file):
            clean_nasm_file(file, nasm_path, clean_path)

这样我们就处理完成了,虽然不想书中说的那样链接,但我们生成nasm汇编后,还是能正常工作的

字符串打印还是编写

需要编写两个函数,一个打印单个字符的,一个打印字符串的

打印字符串的循环调用打印单个字符的即可

新增的相关代码如下:

......
void putfont8(char *vram, int xsize, int x, int y, char c, char *font);
void putfont8_asc(char *vram, int xsize, int x, int y, char c, unsigned char *s);

void start(void)
{
    ......

    putfont8_asc(vram, xsize, 8, 8, COL8_FFFFFF, "Hollo OS!");

    ......
}

void putfont8_asc(char *vram, int xsize, int x, int y, char c,  unsigned char *s)
{
   extern char hankaku[4096];
    /* C语言中,字符串都是以0x00结尾 */
    for (; *s != 0x00; s++) {
    putfont8(vram, xsize, x, y, c, hankaku + *s * 16);
    x += 8;
    }
    return; 
}

void putfont8(char *vram, int xsize, int x, int y, char c,  char *font)
{
    int i;
    char *p, d /* data */;
    for (i = 0; i < 16; i++) {
        p = vram + (y + i) * xsize + x;
        d = font[i];
        if ((d & 0x80) != 0) { p[0] = c; }
        if ((d & 0x40) != 0) { p[1] = c; }
        if ((d & 0x20) != 0) { p[2] = c; }
        if ((d & 0x10) != 0) { p[3] = c; }
        if ((d & 0x08) != 0) { p[4] = c; }
        if ((d & 0x04) != 0) { p[5] = c; }
        if ((d & 0x02) != 0) { p[6] = c; }
        if ((d & 0x01) != 0) { p[7] = c; }
    }
    return;
}

还是比较简单的,照抄即可,接下来就是一键运行,就成功显示文章开头的画面,非常完成

总结

书中其实并没有单独讲字符串显示,而是将字符串显示,键盘处理和鼠标处理混合到一起了

感觉上后面两者还是比较麻烦的,所以这里单独讲字符串显示的抽处理,其他两个放到后面处理

相关文章
|
存储 JSON Unix
30.从入门到精通:Python3 命名空间和作用域 命名空间 作用域 Python3 标准库概览 操作系统接口 文件通配符 命令行参数 错误输出重定向和程序终止 字符串正则匹配 访问 互联网 日期和
30.从入门到精通:Python3 命名空间和作用域 命名空间 作用域 Python3 标准库概览 操作系统接口 文件通配符 命令行参数 错误输出重定向和程序终止 字符串正则匹配 访问 互联网 日期和
|
安全 Linux 数据安全/隐私保护
Vanilla OS:下一代安全 Linux 发行版
【10月更文挑战第30天】
1620 0
Vanilla OS:下一代安全 Linux 发行版
|
11月前
|
Ubuntu Unix Linux
操作系统的最强入门科普(Unix/Linux篇)
下期文章,小枣君会重点聊聊Windows和macOS那条线。敬请关注! 如果大家觉得文章不错,还请帮忙多多转发!谢谢!
|
11月前
|
Web App开发 缓存 Rust
|
弹性计算 自然语言处理 Ubuntu
OS Copilot-操作系统智能助手-Linux新手小白的福音
OS Copilot是由阿里云推出的操作系统智能助手,专为Linux新手设计,支持自然语言问答、辅助命令执行等功能,极大提升了Linux系统的使用效率。用户只需通过简单的命令或自然语言描述问题,OS Copilot即可快速提供解决方案并执行相应操作。例如,查询磁盘使用量等常见任务变得轻松快捷。此外,它还支持从文件读取复杂任务定义,进一步简化了操作流程。虽然在某些模式下可能存在小问题,但总体上大大节省了学习和操作时间,提高了工作效率。
589 2
OS Copilot-操作系统智能助手-Linux新手小白的福音
|
运维 自然语言处理 Ubuntu
OS Copilot-操作系统智能助手-Linux新手小白的福音
OS Copilot 是阿里云推出的一款操作系统智能助手,专为Linux新手设计,支持自然语言问答、辅助命令执行和系统运维调优等功能。通过简单的命令行操作,用户可以快速获取所需信息并执行任务,极大提升了Linux系统的使用效率。安装步骤简单,只需在阿里云服务器上运行几条命令即可完成部署。使用过程中,OS Copilot不仅能帮助查找命令,还能处理文件和复杂场景,显著节省了查找资料的时间。体验中发现,部分输出格式和偶尔出现的英文提示有待优化,但整体非常实用,特别适合Linux初学者。
723 10
|
弹性计算 运维 Ubuntu
os-copilot在Alibaba Cloud Linux镜像下的安装与功能测试
我顺利使用了OS Copilot的 -t -f 功能,我的疑惑是在换行的时候就直接进行提问了,每次只能写一个问题,没法连续换行更有逻辑的输入问题。 我认为 -t 管道 功能有用 ,能解决环境问题的连续性操作。 我认为 -f 管道 功能有用 ,可以单独创建可连续性提问的task问题。 我认为 | 对文件直接理解在新的服务器理解有很大的帮助。 此外,我还有建议 可以在非 co 的环境下也能进行连续性的提问。
374 7
|
存储 运维 安全
深入解析操作系统控制台:阿里云Alibaba Cloud Linux(Alinux)的运维利器
本文将详细介绍阿里云的Alibaba Cloud Linux操作系统控制台的功能和优势。
586 6
|
安全 大数据 Linux
云上体验最佳的服务器操作系统 - Alibaba Cloud Linux | 飞天技术沙龙-CentOS 迁移替换专场
本次方案的主题是云上体验最佳的服务器操作系统 - Alibaba Cloud Linux ,从 Alibaba Cloud Linux 的产生背景、产品优势以及云上用户使用它享受的技术红利等方面详细进行了介绍。同时,通过国内某社交平台、某快递企业、某手机客户大数据业务 3 大案例,成功助力客户实现弹性扩容能力提升、性能提升、降本增效。 1. 背景介绍 2. 产品介绍 3. 案例分享
515 1
|
NoSQL Linux PHP
如何在不同操作系统上安装 Redis 服务器,包括 Linux 和 Windows 的具体步骤
本文介绍了如何在不同操作系统上安装 Redis 服务器,包括 Linux 和 Windows 的具体步骤。接着,对比了两种常用的 PHP Redis 客户端扩展:PhpRedis 和 Predis,详细说明了它们的安装方法及优缺点。最后,提供了使用 PhpRedis 和 Predis 在 PHP 中连接 Redis 服务器及进行字符串、列表、集合和哈希等数据类型的基本操作示例。
764 4

热门文章

最新文章

推荐镜像

更多