【操作系统】优化MBR程序:让MBR调用显存吧

一.显存、显卡以及显示器的概述

        显卡用于连接CPU和显示器,我们调用显示器时,其实就是利用显卡提供的IO接口间接地对显示器进行操作,所以显卡也称之为显示适配器。接下来我们将优化之前写的MBR程序(参考:【操作系统】BIOS与MBR之间的过渡实践),使我们的程序通过直接操作显卡来输出,显卡给我们的输入接口有显存和端口,而本文中主要用到显存。

        如果看过我之前发过的文章(参考:【操作系统】BIOS开机自检)就可以知道,内存布局中关于显存地址分布如下:

        显卡支持三种模式:文本模式、黑白图形模式以及彩色图形模式,本文中我们将使用文本模式,以实现类似Linux控制台风格的字符界面。从起始地址0XB800到C7FFF这片32KB大小的内存区域用于文本显示,我们只需要把要显示在显示器上的字符直接输入到0XB800开始的显存中,显存有了数据,会直接将数据搬到显示器屏幕上,至于数据怎么搬到屏幕上的不用我们了解,我们只要保证写入的数据符合格式就好了。

         由于在文本模式下,字符不仅可以显示黑白颜色,也可以打印出彩色,所以每个显示在屏幕上的字符都由2个连续的字节表示,一个字节存储ASCII码的数据,另一个字节存储字符的属性:

        在屏幕上每个字符的低字节是字符的ASCII码,高字节属于字符的属性信息,其中低4位是字符前景色,高4位是字符背景色,颜色由RGB三色调和,第11位和第15位分别控制亮度位以及是否闪烁(1为高亮/闪烁,0为正常/不闪)。

二.改进MBR并解析

        有了上面的知识,我们就可以通过改编之前的MBR程序来调用显存了,代码如下:

        我们保留原先的MBR程序滚屏的操作,将通过BIOS输出改成通过显存输出。我们重点来分析第9~10行,以及第19~32行代码,其他代码在另外一篇文章已经解析过了,不再次赘述。

  • 第9~10

        在第一节我们已经知道,内存地址0XB8000为显存的文本模式,在实模式下,内存的访址方式是“段基址×16+段内偏移地址”,所以我们直接在段寄存器gs(通过通用寄存器ax中转,原因已在上一篇文章说明,不再赘述)中存入0xb800即可。在此有个小知识点:在进行内存访址时,CPU将ds作为默认的段基址寄存器,如果不用CPU默认寄存器,我们就需要自行指定具体的段基址寄存器,而这个行为叫做“段跨越前缀”。

 9         mov ax,0xb80010         mov gs,ax
  • 第19~32

        我们直接拿前面两段作为例子,后面的都是大同小异:

        “mov  byte [gs:0x00] ‘1’”是以gs为段基址寄存器,以0为偏移地址起始的内存中,写入大小为1byte大小的字符为”1”的ASCII码,当然,如果你对ACSII码十分熟悉,也可以写成“mov  byte [gs:0x00] 0x31”。

         而第二行则是字符的属性,具体参数可以参照上文中所提及的。

三.运行

         代码编写完成后,我们保存一下代码(本文保存文件名为A.S),并且使用nasm对代码进行编译:

nasm  –o  A.bin  A.S

        此时,我们就可以开始运行调试了,我们需要用到之前写过的一篇文章(【操作系统】Bochs安装和配置)里面的两个东西:

  •         使用Bximage工具生成的空白镜像(本文文件名为test.img),大小随意,大于512个字节即可
  •         Bochs模拟硬件环境的配置文件(文章中文件名为boch.disk)

        我们首先将生成的A.bin文件写入到空白镜像中:

dd  if=./A.bin  of=./test.img  bs=512  count=1  conv=notrunc

        上述代码的具体参数可以自行百度,不再次赘述,将代码写入到镜像后,我们再将镜像文件加入到Bochs的模拟硬件环境配置文件中,根据文章中所描述的,我们直接将新生成的镜像写入配置文件的以下位置即可:

        保存一下修改后的配置文件,我们开始运行Bochs模拟器进行模拟操作:

./Bochs  –f   boch.disk(你自己的硬件配置文件名)

         运行成功后,会显示以下信息,并且默认为【6】:

        此时我们再按一次回车,即可开始模拟:

        我们在控制台中输入“c”(具体含义请查看上面所说的文章),继续往下运行,就能看到弹出的窗口中出现了我们所要的字符串:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/340404.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法】基础算法001之双指针

👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 🌝每一个不曾起舞的日子,都是对生命的辜负 目录 前言 1.数组分块&#xf…

数字孪生+可视化技术 构建智慧新能源汽车充电站监管平台

前言 充电基础设施为电动汽车提供充换电服务,是重要的交通能源融合类基础设施。近年来,随着新能源汽车产业快速发展,我国充电基础设施持续增长,已建成世界上数量最多、服务范围最广、品种类型最全的充电基础设施体系。着眼未来新…

基于css实现动画效果

介绍 本文将会基于css&#xff0c;实现各种动画效果&#xff0c;接下来会从简单几个例子入手。 案例 三颗球 <!DOCTYPE html> <html lang"en"><head><meta charset"utf-8" /><title>React App</title><style>…

Unity编辑器扩展(外挂)

每日一句:未来的样子藏在现在的努力里 目录 什么是编译器开发 C#特性[System.Serializable] 特殊目录 命名空间 /*检视器属性控制*/ //添加变量悬浮提示文字 //给数值设定范围&#xff08;最小0&#xff0c;最大150&#xff09; //指定输入框&#xff0c;拥有5行 //默认…

js逆向第15例:猿人学第14题备而后动-勿使有变

文章目录 一、前言二、定位关键参数2.1 mz=如何得到?2.2 m=如何得到?2.3 变量c和e怎么来的?2.4 变量aa和bb怎么来的?2.5 函数E是什么?2.6 函数m5和函数gee是什么?三、代码实现四、参考文献一、前言 任务十四:抓取这5页的数字,计算加和并提交结果 此题难度还是很大,整…

工程送样!手把手教你用好广和通RedCap模组FG131FG132系列

2024年1月&#xff0c;广和通RedCap模组FG131&FG132系列已进入工程送样阶段&#xff0c;可为终端客户提供样片。广和通RedCap模组系列满足不同终端对5G速率、功耗、尺寸、成本的需求&#xff0c;全面助力RedCap技术的行业应用。 FG131&FG132系列基于骁龙X35 5G调制解调…

网络传输(TCP)

前言 我们tcpdump抓包时会看到除报文数据外&#xff0c;前面还有一段其他的数据&#xff0c;这段数据分为两部分&#xff0c;ip包头&#xff08;一般20字节&#xff09;和tcp包头&#xff08;一般20字节&#xff09;&#xff0c;一般这两个头长度和为40&#xff0c;我们直接跳…

一些很实用的技巧提高自动化测试覆盖率

自动化测试一直是测试人员的核心技能&#xff0c;也是测试的重要手段之一。尤其是在今年所谓的互联网寒冬的行情下&#xff0c;各大企业对测试人员的技术水平要求的很高&#xff0c;而测试人员的技术水平主要集中在三大自动化测试领域&#xff0c;再加测试辅助脚本的编写&#…

零样本学习研究方向sci四区期刊总结

APPLIED OPTICS sci 四区 非OA 出版商:OPTICA 期刊官方网站: http://www.opticsinfobase.org/ao/home.cfm 期刊投稿网址: http://www.opticsinfobase.org/ao/journal/ao/author.cfm#submit 虽然有zsl的名字但是这是全息图像专刊&#xff0c;跟我的方向应该不是太相关。 MO…

对git中tag, branch的重新理解

1. 问题背景 项目中之前一个tag&#xff08;v1.0&#xff09;打错了&#xff0c;想删除它&#xff0c;但我们从此tag v1.0中迁出新建分支Branch_v1.0,在此分支下修复了bug&#xff0c;想重新打一个tag v1.0&#xff0c;原来的tag v1.0可以删除掉吗&#xff1f; 错误的理解&am…

基于Python的影视数据智能分析系统开发

1. 前言 数据分析与可视化是当今数据分析的发展方向&#xff0c;大数据时代&#xff0c;数据资源具有海量特征&#xff0c;数据分析和可视化主要通过Python数据分析来实现。 基于Python的数据分析可视化和技术实现是目前Python数据分析的主要目的&#xff0c;Python可以为数据…

从零学Java Set集合

Java Set集合 文章目录 Java Set集合1 Set 集合2 Set实现类2.1 HashSet【重点】2.2 LinkedHashSet2.3 TreeSet 3 Comparator 自定义比较器 1 Set 集合 特点&#xff1a;无序无下标、元素不可重复。 方法&#xff1a;全部继承自Collection中的方法。 常用方法&#xff1a; publ…