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

深入解析C++反汇编:从obj文件到汇编代码的转换实践 本文深入解析了C++反汇编的核心实践,重点探讨如何利用objconv工具将目标文件(.obj)转换为可读的汇编代码。通过具体示例,文章揭示了C++函数调用、类内存布局、虚函数机制等高级特性在底层的实现原理,帮助开发者进行深度调试与性能优化,是理解编译器行为与提升代码效率的实用指南。 阅读详情

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

简介

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

效果展示

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

在这里插入图片描述

字体制作

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

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

搞自己的字体太麻烦了,我们直接抄《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;
}

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

总结

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

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

Hermes Memory:构建可执行、可追溯的AI语义日记系统 AI记忆不是简单缓存对话,而是对用户工作事实的语义化建模与结构化沉淀。其核心原理在于将长期知识(Memory)与短期上下文(Session)解耦,通过冻结式系统提示注入保障确定性,借助SQLite全息日志实现无损回溯。这种设计赋予AI‘履行承诺’的能力,而非被动复述——技术价值体现在行动驱动、版本可控、人机共识三方面。典型应用场景包括自动化部署校验、故障根因追溯、团队认知同步等工程实践。本文聚焦Hermes Memory机制,详解语义记忆体、双轨存储、Git化管理及实战避坑。 阅读详情

相关推荐

基于Java的日记应用程序开发:Journal-App完整实现

Journal-App是一款专注于用户情感记录与日记管理的Java桌面应用程序。随着现代人对心理健康与情绪表达的重视不断提升,日记类应用逐渐从传统的纸质记录转向数字化、个性化与安全化。Journal-App正是在这一背景下诞生,旨在为用户提供一个简洁、安全、可扩展的日记记录平台。应用不仅支持基本的文本编辑与分类管理,还融合了数据加密、本地存储与未来云同步等核心功能。本章将为读者梳理Journal-App的开发动机、目标用户群体及其在情感表达工具中的定位,为后续技术实现与架构设计打下坚实基础。

weixin_28913879的博客 794

自制操作系统10:绘制字体 - 使用字库

参考:https://blog.youkuaiyun.com/tyler_download/article/details/52636761https://www.bilibili.com/video/BV1VJ41157wq?p=10https://github.com/wycl16514/os-kernel-draw-ascii-chars 原理是按像素绘图,不过分辨率比较低的VGA模式下,怎么绘制都有锯齿的感觉,太粗糙,聊胜于无吧,谁让我们自己做呢,只能糙点,凑合着。 这个操作系统就是一个玩具,学习原理为主。 8

hb_zxl的专栏 446

超级PHP多用户日记本系统设计与实现

本文还有配套的精品资源,点击获取 简介:《糖果日记本多用户php日记本 SUPER-1》是一款多用户在线日记记录平台,基于PHP开发,提供了用户个人日记的存储与管理,支持多用户独立账号。文章详细介绍了系统的开发涉及到的技术要点,包括PHP编程、MySQL数据库管理、用户认证与授权、前端界面设计、安全性考虑、性能优化、系统的可扩展性和维护性等。 1. PHP语言基础...

weixin_33628677的博客 878

linux执行文件汇编,如何在Linux中反汇编二进制可执行文件以获取汇编代码?

Agner Fog的反汇编者objconv非常好。它将为反汇编输出添加注释以解决性能问题(例如,来自16位立即常量指令的可怕LCP停顿)。objconv -fyasm a.out /dev/stdout | less(它不识别-作为stdout的简写,并且默认输出到与输入文件类似名称的文件,并加上.asm。)它还为代码添加了分支目标。其他反汇编程序通常只使用数字目标来反汇编跳转指令,并且不要在分...

weixin_29790467的博客 321

DataBindingLab.zip

我觉得这个还可以!!

ComboLboxWithTT.zip

[原创]在ComboBox下拉菜单里创建Tooltips

自制操作系统日记(8):变量显示

上篇中,我们显示了静态的字符串在桌面上,本篇进一步探索,能将定义的整型变量的值显示在桌面上

github_35735591的博客 741

串操作基本演示(数据结构)

本程序为一个串基本操作的演示系统,程序中用堆分配存储表示实现HString串类型的最小操作子集的基础上实现串抽象数据类型的其余基本操作(不使用C语言本身提供的串函数)。演示系统主结构为一个StrHeadList类型的串头表,将各串的头指针依次存放于串头数组StrHead中。CurNum为系统中现有的串的数目,CurNum+1是可为下一个新串头指针分配的位置。取StrHead的元素下标作为对应串的内部名。 (1)赋值,命令标识为‘A’ (2)判相等,命令标识为‘E’ (3)联接,命令标识为‘C’ (4)求长度,命令标识为‘L’ (5)求子串,命令标识为‘S’ (6)子串定位,命令标识为‘I’ (7)串替换,命令标识为‘R’ (8)显示,命令标识为‘P’ (9)删除,命令标识为‘D’ (10)退出,命令标识为‘Q’

自制操作系统日记(5):跳转到C语言执行

在上篇中切换了CPU的64位模式,但后面是失败的,并没有真正切换,也没有相关的验证代码,本篇中终于修正并执行了C代码

github_35735591的博客 549

Inside NAND Flash Memories.中文版. Chatper 2 [2.1-2.2.1]

2.1 Introduction 半导体存储器分类: RAM:Random Access Memories--掉电丢失 ROM:Read Only Memories--只读,出厂时写好;掉电不丢失;不可更改。 NVM:Non-Volatile Memories--电可擦除/写入,并且掉电不丢失。第一类产品为EPROM memory (Erasable Programmable Read...

xuqikang的专栏 3605

常见的十大量化投资策略(附源码)

量化投资策略是利用量化的方法,进行金融市场的分析、判断和交易的策略、算法的总称。著名的量化投资策略有以下10种(注:策略源码模板不能直接用于实盘交易,仅供探讨交流) 01、海龟交易策略 海龟交易策略是一套非常完整的趋势跟随型的自动化交易策略。这个复杂的策略在入场条件、仓位控制、资金管理、止损止盈等各个环节,都进行了详细的设计,这基本上可以作为复杂交易策略设计和开发的模板。 海龟交易策略源码:https://www.myquant.cn/docs/python_strategyies/110 0.

小壁虎的春天 2万+

(0)从零开始的操作系统开发日记

ゼロからのOS開発ノート,从零开始的操作系统开发日记其实是个课程设计的坑,打算用于记录学习和开发过程中遇到的一些散点,在着手开干的时候会在github那边开个项目【其实打算博客也直接在那边写,但是我懒得搭博客了,,】 目前主要参考书籍是川合秀实先生的《30天自制操作系统》,关于这本书,一些整理如下: 软盘读盘D3 简单的写显存-图形显示D4 鼠标,键盘驱动D6-D8 内存管理(动态分区+相邻回收)

hiro的博客 6294

Windows服务器SSL漏洞修复实战:如何一键禁用TLS 1.0/1.1避免SWEET32攻击

本文提供了Windows服务器修复SWEET32漏洞的实战指南。通过组策略编辑器,详细讲解如何一键禁用不安全的TLS 1.0/1.1协议,并优化密码套件顺序,以消除由3DES等弱加密算法带来的安全风险。文章还涵盖了应对SQL Server等应用兼容性挑战的解决方案,以及企业级批量部署的脚本化方法,帮助管理员系统性地提升服务器TLS/SSL安全配置。

weixin_29310631的博客 244

操作系统开发日记-day2

汇编入门 DB指令:"data byte"的缩写,意思是往文件里直接写入一字节的指令 RESB指令:"reserve byte"的缩写,如果写成RESB 10意思是我们预约了10个字节。 DD、DW、DB的区别 ;符号的作用是注释,相当于c++的//符号,DB指令的功能也变得更广,可以直接编写字符串。$符号是一个变量,可以告诉我们这一行现在的字符数。 在启动程序中,我们必须要保证第510字节(即第0x1fe)开始的地方是0x55 0xaa,使用$符号的话就可以直接计算出需要多少个字节来放0x00。 上

weixin_45394002的博客 693

Cloudflare SaaS 优选IP实战:提升大陆访问速度的配置指南

本文详细介绍了如何通过Cloudflare SaaS优选IP提升中国大陆用户访问速度的配置指南。从基础环境准备到IP筛选方法,再到完整配置流程和效果验证,帮助用户突破免费套餐限制,精准优化网络线路,特别适合跨境电商和面向中国大陆用户的网站优化。

weixin_29231027的博客 683

在 SAP 中实现“租赁资产”管理,核心是把 IFRS16/ASC842 等新租赁准则的要求落地到系统

摘要:本文详细介绍了在SAP S/4HANA系统中实现IFRS16/ASC842租赁准则的具体操作流程。主要内容包括:1) 系统前置配置,如激活租赁会计组件、定义租赁类型和会计科目;2) 租赁合同创建与主数据维护;3) 初始确认的会计处理;4) 日常折旧计提和租金支付流程;5) 合同变更与终止管理。通过RE-FX-LM模块与固定资产模块的集成,系统可自动生成使用权资产和租赁负债,支持从合同创建到报表披露的全生命周期管理,确保符合新租赁准则要求。

金牌架构师 983

操作系统学习日记:Day1 汇编语言

一些os学习总结

seu某学渣的博客 518

36. 在 SAP Integration Suite 里打通入站 HTTP:iFlow 端点鉴权、角色授权与多节点 403 排障实战

本文探讨了SAP Cloud Integration中HTTP入站连接的认证与授权机制。在Cloud Foundry环境下,认证(证明身份)和授权(权限控制)需分开处理:认证可采用Basic、OAuth或mTLS等方式,授权则通过角色实现。文章详细解析了两种主流配置路径:基于IdP用户的Basic认证(需配置Role Collection)和基于OAuth Client/Service Instance的系统调用(通过Service Key管理权限)。特别指出ABAP系统在多节点环境下可能因cookie编码

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 320

操作系统开发日记(1-5天)

一直觉得操作系统是一个很神秘的东西,这学期学习了操作系统原理后萌生了自己编写操作系统的想法,刚好到假期有时间,决定编写一个自己的操作系统。   第一天 开发前的准备         学习FAT12文件格式,使用自己编写的软盘映像启动计算机。          计算机在开机时会从第一个扇区读取软盘,但是只能读取512字节,也就是一个扇区;如果这个扇区最后2字节是0x55AA说明这是启动区,如

hayateの博客 1248

【Davinci开发】:CS接口创建及连接

AUTOSAR SWC之间添加CS-port :详细讲解step

2524

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C++学习日记——字符串拷贝、拼接、比较函数

学习掌握C++之字符串拷贝、拼接、比较函数。

不说二话的自家人的博客 713

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

基于FastAPI与本地AI模型构建隐私优先的语音日记应用

语音识别与自然语言处理技术正深刻改变人机交互方式,其核心原理在于将音频信号转化为文本,并利用大语言模型理解语义。这项技术的价值在于能实现更自然、高效的信息输入与智能处理,尤其适用于笔记、创作、复盘等需要快速记录与整理的场景。本文聚焦于构建一个隐私优先的AI语音日记应用,通过集成Whisper进行本地语音转文本,并利用Llama.cpp等开源大语言模型在本地进行内容分析与摘要生成,确保用户数据全程私密。项目采用FastAPI构建后端服务,结合数据加密技术,为开发者提供了一个融合全栈开发、AI集成与隐私安全实践

cqwmy840702的博客 366

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

windows操作系统应用程序开发日记(1)

WinMain函数的基本框架,窗口定义、窗口创建、消息循环及窗口过程函数 略微学习《VC++深入详解》后,由于自己有健忘的坏习惯,特意发布文章来巩固自己的知识(以及方便自己日后查阅学习) LRESULT CALLBACK WinSunProc( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM l

CNLWW的博客 1766

python菜鸟日记7

1. 如果直接在操作系统中进行命令行操作,那么一般使用的是操作系统所提供的接口函数,而如果想在python中也能够调用操作系统的接口函数来对文件,目录进行操作的话,可以使用os和os.path模块,这些模块可以直接调用操作系统提供的接口函数 2. >>>os.name ,name属性会反映出操作系统的一些信息,如果是posix,说明系统是Linux、Unix或Mac OS X,如果是nt,就

jerry_bai_xi的博客 785

实习日记7.19

项目主用到了cli.NewApp()来获得实例,还用到cli.Flag(StringFlag和boolFlag类型)和cli.Context,cli.Commend没用,给app.Name、Usage、Flags、Before、Action、Run赋值运行,4、语法糖:在编程语言中提供的一种语法结构或语法规则,不改变语言功能,只为了让代码更易读,如自增自减操作符、匿名函数、Lambda表达式、条件与循环语句的简化形式,OSS:是阿里云提供的对象存储服务,类似于 S3,用于存储和访问大规模的非结构化数据。

qq_44794715的博客 848
上一篇: 自制操作系统日记(6):静态桌面初步
下一篇: 自制操作系统日记(8):变量显示
_萧_
博客等级 码龄10年 55粉丝 157原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值