当前位置: 首页 > article >正文

02-从零开始编写操作系统 - BIOS 中断与屏幕显示

引导打印 - BIOS 中断与屏幕显示从零开始编写操作系统 - 第二章开始之前你可能需要 Google 了解的概念interrupt, BIOS, ISR, IVT, int 0x10, cpu-registers目的使用 BIOS 中断在屏幕上打印字符和字符串 支持一下如果这个教程对你有帮助欢迎到 GitHub 项目点个 star 支持⭐ github.com/nexa1024/os-tutorial你的 star 是我继续更新的动力谢谢 理论知识在学习本章代码之前建议先阅读以下理论知识文档内容中断机制详解 →什么是中断、硬件/软件中断、ISR、IVTCPU 寄存器指南 →用大白话讲解寄存器AX、BX、CX、DX、SI、DI…BIOS INT 0x10 - 视频中断显示单个字符mov ah, 0x0e ; BIOS 显示字符功能 mov al, A ; 字符 A int 0x10 ; 调用 BIOS 中断寄存器约定寄存器值说明ah0x0e功能号在TTY模式下显示字符alASCII 字符要显示的字符int 0x10-调用 BIOS 视频中断代码示例示例 1打印 “Hello OS!”文件boot_print_hello.asm; 功能: 屏幕显示 Hello OS! ; 编译: nasm -f bin boot_print_hello.asm -o boot_print_hello.bin ; 运行: qemu-system-x86_64 boot_print_hello.bin ; 打印字符 ; BIOS INT 0x10 功能 0x0E: 在 TTY 模式下显示字符 ; ah 功能号 0x0e, al 要显示的字符 mov ah, 0x0e ; 设置 BIOS 功能号为 0x0e (显示字符) mov al, H ; 将字符 H 放入 al 寄存器 int 0x10 ; 调用 BIOS 中断 0x10执行打印 mov al, e ; 打印 e (ah 还是 0x0e不需要重复设置) int 0x10 mov al, l ; 打印第一个 l int 0x10 mov al, l ; 打印第二个 l int 0x10 mov al, o ; 打印 o int 0x10 mov al, ; 打印空格 int 0x10 mov al, O ; 打印 O int 0x10 mov al, S ; 打印 S int 0x10 mov al, ! ; 打印 ! int 0x10 ; 程序结束 jmp $ ; 跳转到当前行无限循环程序停在这里 ; 引导扇区填充 ; BIOS 要求引导扇区必须是 512 字节且最后两字节是 0xaa55 times 510-($-$$) db 0 ; 用 0 填充剩余空间直到 510 字节 ; $ 当前地址, $$ 节起始地址 ; 510-($-$$) 计算需要填充的字节数 dw 0xaa55 ; 写入引导扇区魔数小端序55 aa编译与运行nasm-f bin boot_print_hello.asm-o boot_print_hello.bin qemu-system-x86_64 boot_print_hello.bin示例 2使用循环打印字符串文件boot_print_loop.asm; 功能: 使用循环打印字符串 ; 编译: nasm -f bin boot_print_loop.asm -o boot_print_loop.bin ; 运行: qemu-system-x86_64 boot_print_loop.bin ; 初始化 mov si, message ; 将字符串地址存入 si 寄存器源索引寄存器 ; si 常用于指向字符串或数组的当前位置 ; 打印循环 print_loop: mov al, [si] ; 从 si 指向的内存地址读取一个字符到 al ; [] 表示内存访问[si] 是si 地址处的内容 cmp al, 0 ; 比较 al 和 0 ; 我们用 0 (NULL) 作为字符串结尾标记 je end_print ; 如果 al 0跳转到 end_printje Jump if Equal ; 打印当前字符 mov ah, 0x0e ; 设置 BIOS 显示字符功能 int 0x10 ; 调用中断打印 al 中的字符 ; 移动到下一个字符 inc si ; si 寄存器加 1指向下一个字符 ; inc increment加 1 jmp print_loop ; 跳回 print_loop继续处理下一个字符 ; jmp jump无条件跳转 ; 程序结束 end_print: jmp $ ; 无限循环程序结束 ; 数据段 message: db Hello from OS!, 0 ; db define byte定义字节 ; 定义字符串 Hello from OS!结尾的 0 是字符串结束符 ; 引导扇区填充 times 510-($-$$) db 0 dw 0xaa55示例 3打印换行文件boot_print_newline.asm; 功能: 打印多行文本处理换行符 ; 编译: nasm -f bin boot_print_newline.asm -o boot_print_newline.bin ; 运行: qemu-system-x86_64 boot_print_newline.bin ; 初始化 mov si, message ; si 指向字符串地址 ; 打印循环 print_loop: mov al, [si] ; 读取当前字符 cmp al, 0 ; 检查是否为字符串结尾 je end_print ; 如果是 0结束打印 ; 检查是否是换行符 cmp al, 10 ; 检查 al 是否等于 10 (LF 换行符) jne print_char ; 如果不是换行符跳转到 print_char ; jne Jump if Not Equal ; 处理换行先回车(CR)再换行(LF) ; 在文本终端中换行需要两个字符 ; CR (13) 回到行首 ; LF (10) 移到下一行 mov ah, 0x0e ; 设置 BIOS 显示功能 mov al, 13 ; 打印 CR (回车) int 0x10 mov al, 10 ; 打印 LF (换行) int 0x10 inc si ; 跳过原始字符串中的换行符 jmp print_loop ; 继续循环 ; 打印普通字符 print_char: mov ah, 0x0e ; 设置 BIOS 显示功能 int 0x10 ; 打印 al 中的字符 inc si ; 移动到下一个字符 jmp print_loop ; 继续循环 ; 程序结束 end_print: jmp $ ; 无限循环 ; 数据段 message: db Line 1, 10, Line 2, 10, Line 3, 0 ; 10 是换行符(LF)的 ASCII 值 ; 字符串会在打印时被换行处理 ; 引导扇区填充 times 510-($-$$) db 0 dw 0xaa55常见 BIOS 中断中断号功能用途int 0x10视频服务显示字符、设置光标int 0x13磁盘服务读写磁盘扇区int 0x16键盘服务读取键盘输入int 0x19引导加载重新引导系统ASCII 表速查字符十六进制字符十六进制‘0’-‘9’0x30-0x39‘A’-‘Z’0x41-0x5A‘a’-‘z’0x61-0x7A空格0x20换行(LF)0x0A回车(CR)0x0D编译与运行Windows 平台# 编译nasm-f bin 文件名.asm-o 文件名.bin# 运行qemu-system-x86_64 文件名.bin# 无图形模式qemu-system-x86_64-nographic 文件名.binLinux/Mac 平台# 编译nasm-fbin文件名.asm-o文件名.bin# 运行qemu文件名.bin预期结果QEMU 窗口打开后屏幕左上角显示Hello OS!常见问题Q: 为什么字符显示在光标位置A:INT 0x10 功能 0x0E 会自动将光标移动到下一个位置。Q: 如何显示换行A:需要先输出回车(CR, 0x0D)再输出换行(LF, 0x0A)。Q: 支持哪些字符A:支持 ASCII 字符集0x00-0xFF。Q: int 指令是硬件中断还是软件中断A:是软件中断由程序主动触发。练习尝试打印你的名字编写一个子程序来打印字符串实现打印数字的功能代码文件列表文件描述boot_print_hello.asm基础示例逐字符打印 “Hello OS!”boot_print_loop.asm进阶示例使用循环打印字符串boot_print_newline.asm高级示例打印多行文本换行处理汇编指令说明寄存器寄存器全称用途axAccumulator累加器通用寄存器ahHigh byte of AXax 的高 8 位alLow byte of AXax 的低 8 位siSource Index源索引寄存器常用于字符串操作指令指令全称说明movMove数据传送intInterrupt调用中断cmpCompare比较两个值jeJump if Equal相等则跳转jneJump if Not Equal不相等则跳转jmpJump无条件跳转incIncrement加 1dbDefine Byte定义字节特殊符号符号说明$当前地址$$当前节起始地址times重复指令[]内存访问下一章在下一章中我们将学习如何读取 BIOS 内存信息参考资源中断机制详解os-tutorial 原仓库os-tutorial 中文版INT 10h - Wikipedia

相关文章:

02-从零开始编写操作系统 - BIOS 中断与屏幕显示

引导打印 - BIOS 中断与屏幕显示 从零开始编写操作系统 - 第二章 开始之前你可能需要 Google 了解的概念 interrupt, BIOS, ISR, IVT, int 0x10, cpu-registers 目的 使用 BIOS 中断在屏幕上打印字符和字符串 🌟 支持一下 如果这个教程对你有帮助,欢…...

HAL_NVIC

文章目录一、NVIC简介   NVIC 做什么?二、NVIC模块详解   1、NVIC 寄存器   2、优先级的定义     1.优先级寄存器NVIC_IPRx     2.优先级分组3、NVIC 工作完整流程   4、F103中断向量表     1.内核异常向量(固定,所有 CM…...

免费开源字体 Source Sans 3 完整配置使用教程

免费开源字体 Source Sans 3 完整配置使用教程 【免费下载链接】source-sans Sans serif font family for user interface environments 项目地址: https://gitcode.com/gh_mirrors/so/source-sans Source Sans 3 是由 Adobe 开发的开源无衬线字体家族,专为现…...

企业级管理系统快速入门:RuoYi-Vue-Plus 3天从零到部署实战

企业级管理系统快速入门:RuoYi-Vue-Plus 3天从零到部署实战 【免费下载链接】RuoYi-Vue-Plus 基于RuoYi-Vue集成 LombokMybatis-PlusUndertowknife4jHutoolFeign 重写所有原生业务 定期与RuoYi-Vue同步 项目地址: https://gitcode.com/GitHub_Trending/ru/RuoYi-V…...

D3KeyHelper:如何通过智能操作优化解放暗黑3玩家双手的效率工具

D3KeyHelper:如何通过智能操作优化解放暗黑3玩家双手的效率工具 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper 一、问题场景&#xff1a…...

打卡信奥刷题(3054)用C++实现信奥题 P6747 『MdOI R3』Teleport

P6747 『MdOI R3』Teleport 题目背景 凯瑞甘从帝国的围攻下,击毁了大天使号,乘着雷诺的飞船逃了出来,到了休伯利安号上。 “吉米?”凯瑞甘着急地四处寻找着。 “很抱歉,我们没能救出他”马特霍纳向凯瑞甘走来。 “你丢…...

业绩大增37%,订单超210亿!博泰车联财报释放强信号,龙头未来可期

日前,博泰车联交出了上市后的首份亮眼「成绩单」。财报显示,博泰车联2025年全年实现营收35.1亿元,较上年大幅增长37.26%;过去的几年间,博泰车联的营收规模实现爆发式增长,年复合增长率达44.9%。这种高增长态…...

5个硬核功能的惠普游戏本性能控制工具:OmenSuperHub完全指南

5个硬核功能的惠普游戏本性能控制工具:OmenSuperHub完全指南 【免费下载链接】OmenSuperHub 使用 WMI BIOS控制性能和风扇速度,自动解除DB功耗限制。 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否曾因官方游戏控制软件的臃肿…...

Vin象棋:基于Yolov5的中国象棋智能视觉辅助系统,重新定义数字化对弈体验

Vin象棋:基于Yolov5的中国象棋智能视觉辅助系统,重新定义数字化对弈体验 【免费下载链接】VinXiangQi Xiangqi syncing tool based on Yolov5 / 基于Yolov5的中国象棋连线工具 项目地址: https://gitcode.com/gh_mirrors/vi/VinXiangQi 在数字化对…...

终极文档下载神器:一键获取全网免费文档的完整指南

终极文档下载神器:一键获取全网免费文档的完整指南 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该脚本就是为了解决…...

3个突破让你自由掌控数字阅读:fanqienovel-downloader全攻略

3个突破让你自由掌控数字阅读:fanqienovel-downloader全攻略 【免费下载链接】fanqienovel-downloader 下载番茄小说 项目地址: https://gitcode.com/gh_mirrors/fa/fanqienovel-downloader 如何确保你钟爱的网络小说永不消失? 当你在通勤途中打…...

OpenCore Legacy Patcher深度指南:老旧Intel Mac的系统升级解决方案

OpenCore Legacy Patcher深度指南:老旧Intel Mac的系统升级解决方案 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy Patcher是一…...

TEKLauncher:如何通过三重技术架构重新定义《方舟:生存进化》的游戏管理体验

TEKLauncher:如何通过三重技术架构重新定义《方舟:生存进化》的游戏管理体验 【免费下载链接】TEKLauncher Launcher for ARK: Survival Evolved 项目地址: https://gitcode.com/gh_mirrors/te/TEKLauncher TEKLauncher是一个专为《方舟&#xff…...

社区医院信息平台信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】

💡实话实说:有自己的项目库存,不需要找别人拿货再加价,所以能给到超低价格。摘要 随着信息技术的快速发展,医疗行业对信息化管理的需求日益增长。传统的社区医院管理模式存在信息孤岛、数据冗余、效率低下等问题&#…...

5分钟掌握D3KeyHelper:暗黑3玩家的智能按键助手

5分钟掌握D3KeyHelper:暗黑3玩家的智能按键助手 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper 还在为暗黑破坏神3中复杂的技能循环而手忙…...

告别复杂配置!intv_ai_mk11一键部署,小白也能轻松体验AI写作

告别复杂配置!intv_ai_mk11一键部署,小白也能轻松体验AI写作 1. 为什么选择intv_ai_mk11 在AI技术快速发展的今天,文本生成模型已经成为内容创作、客服问答、文案撰写等多个领域的得力助手。然而,对于大多数非技术背景的用户来说…...

告别B站缓存碎片化:3步智能合并视频的终极解决方案

告别B站缓存碎片化:3步智能合并视频的终极解决方案 【免费下载链接】BilibiliCacheVideoMerge 项目地址: https://gitcode.com/gh_mirrors/bi/BilibiliCacheVideoMerge 你是否曾在高铁上打开B站缓存视频准备消遣时光,却发现播放器卡在开头几秒后…...

Phi-4-mini-reasoning效果对比:与Qwen-Math、DeepSeek-Math在逻辑题上的表现差异

Phi-4-mini-reasoning效果对比:与Qwen-Math、DeepSeek-Math在逻辑题上的表现差异 1. 模型介绍与测试背景 1.1 参测模型概览 本次对比测试聚焦三个专门针对数学和逻辑推理优化的模型: Phi-4-mini-reasoning:微软推出的轻量级推理专用模型&…...

蓄电池与超级电容混合储能并网matlab/simulink仿真模型 (1)混合储能采用低通滤波...

蓄电池与超级电容混合储能并网matlab/simulink仿真模型 (1)混合储能采用低通滤波器进行功率分配,可有效抑制功率波动,并对超级电容的soc进行能量管理,soc较高时多放电,较低时少放电,soc较低时状…...

令牌管理:AI开发中的成本控制与效率优化——Tiktokenizer全维度应用指南

令牌管理:AI开发中的成本控制与效率优化——Tiktokenizer全维度应用指南 【免费下载链接】tiktokenizer Online playground for OpenAPI tokenizers 项目地址: https://gitcode.com/gh_mirrors/ti/tiktokenizer 一、行业痛点分析:AI开发中的隐形成…...

Flac3d6.0源代码(含巷道开挖、支护与充填开采三组代码)直接导入运行版,附汉语注释说明

Flac3d6.0源代码,用于巷道支护,煤层开采和充填,代码可直接导入运行,并有汉语注释说明每句代码含义,适合初学者用来学习。 直接联系。 包含三组代码: (1)巷道开挖:研究巷道…...

OFA-VE惊艳效果:赛博UI中‘逻辑矛盾’红色爆炸动效设计解析

OFA-VE惊艳效果:赛博UI中‘逻辑矛盾’红色爆炸动效设计解析 1. 引言:当AI推理遇见赛博美学 想象一下,你上传了一张图片,并输入一句话描述它。一个系统不仅能判断这句话对不对,还能用一种极具视觉冲击力的方式告诉你&…...

终极指南:如何用LocalVocal为OBS添加本地实时字幕系统

终极指南:如何用LocalVocal为OBS添加本地实时字幕系统 【免费下载链接】obs-localvocal OBS plugin for local speech recognition and captioning using AI 项目地址: https://gitcode.com/gh_mirrors/ob/obs-localvocal 还在为直播或视频录制中的字幕问题烦…...

Qt图形界面开发:Phi-3-mini生成UI代码片段与信号槽连接示例

Qt图形界面开发:Phi-3-mini生成UI代码片段与信号槽连接示例 1. 引言:当AI遇上Qt界面开发 作为一名Qt开发者,你是否经常陷入这样的困境:每次新建一个对话框或窗口,都要重复编写相似的UI初始化代码?特别是当…...

Source Han Serif CN:开源中文字体的技术革命与实践指南

Source Han Serif CN:开源中文字体的技术革命与实践指南 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 价值定位:重新定义专业中文字体标准 在数字设计领域&a…...

ChilloutMix模型实战:从零部署到高效生成AI图像

ChilloutMix模型实战:从零部署到高效生成AI图像 【免费下载链接】chilloutmix_NiPrunedFp32Fix 项目地址: https://ai.gitcode.com/hf_mirrors/emilianJR/chilloutmix_NiPrunedFp32Fix ChilloutMix是一个基于Stable Diffusion架构的AI图像生成模型&#xff…...

Python对象生命周期管理失效了?——从引用计数到分代GC的隐性成本陷阱(附内存热力图诊断工具)

第一章:Python对象生命周期管理失效的典型现象与诊断范式Python 的自动内存管理依赖引用计数、循环垃圾收集器(GC)与弱引用机制协同工作,但当这些机制被意外绕过或干扰时,对象生命周期便可能失控。典型失效现象包括&am…...

实战应用:基于快马ai为全栈项目快速构建集成wsl2开发环境

实战应用:基于快马AI为全栈项目快速构建集成WSL2开发环境 最近在准备一个全栈项目,需要同时开发Python Django后端和Vue.js前端。为了保持开发环境的一致性,我决定使用WSL2来搭建开发环境。下面记录下我的完整配置过程,希望能帮助…...

科学护眼智能提醒:3个维度破解数字时代眼健康难题

科学护眼智能提醒:3个维度破解数字时代眼健康难题 【免费下载链接】ProjectEye 😎 一个基于20-20-20规则的用眼休息提醒Windows软件 项目地址: https://gitcode.com/gh_mirrors/pr/ProjectEye 在数字时代,我们每天面对屏幕的时间急剧增…...

零基础友好:借助快马生成的指导项目轻松完成anaconda安装与初体验

最近在学Python数据分析,被各种环境配置搞得头大。朋友推荐用Anaconda管理环境,但光是安装就卡了半天。后来在InsCode(快马)平台发现了个神器项目,像有个老师手把手教操作,分享下我的学习过程: 为什么选择Anaconda 刚开…...