学习如何在32-bit模式下不借助BIOS的0x10号中断打印字符串

关键字:32-bit保护模式; VGA; 视频存储区域

目标: 学会在32-bit保护模式下打印字符串

理论基础

32-bit保护模式

32-bit保护模式设计的内容非常多,十篇博客也写不完,因此这里只对32-bit保护模式的要点做简单介绍:

1. 32-bit保护模式下可以使用32bit的寄存器和寻址模式
2. 32-bit保护模式下可以使用受保护的存储区域,虚拟内存

其中寻址模式,受保护的存储区域,虚拟内存都依赖于GDT(Global Descriptor Table),即全局描述符表,这是保护模式中非常重要的一个概念和数据结构. 我们在后续的博客中会对GDT做相关介绍,本节的目的只是学习32-bit模式下的字符串打印.

想要详细了解保护模式的读者可以阅读《x86_x64体系探索及编程》(邓志),里面有非常详细的操作系统模式介绍.

VGA显示

显示大小: 25(行) × 80(列)
数据范围:0xB8000 ~ 0xB8000+25×80×2
显示格式:在数据范围内,每2个字节对应显示一个字符,其中偶数地址的字节代表字符(ASCII码值),奇数地址的字节代表字符属性,具体属性有字符颜色(低4bit),字符背景颜色(高4bit),具体颜色如下,参考自Assembly Language Color of Text

hex bin color
0 0000 black
1 0001 blue
2 0010 green
3 0011 cyan
4 0100 red
5 0101 magenta
6 0110 brown
7 0111 light gray
8 1000 dark gray
9 1001 light blue
a 1010 light green
b 1011 light cyan
c 1100 light red
d 1101 light magenta
e 1110 yellow
f 1111 white

源码

本节的源码无法测试,因为我们目前还没有学习创建32-bit保护模式中的GDT,所以这里只给出源码,说明如何在32-bit保护模式下进行打印字符串任务.

; ==============================================================
;           |||      print_string_pm函数说明    |||
; --------------------------------------------------------------
; input: ebx-需要打印的字符串的首地址
; return: 不返回值
; 功能: 打印字符串
; ==============================================================   [bits 32] ; 使用32bit 保护模式; 定义有意义的常量
VIDEO_MEMORY equ 0xB8000
WHITE_ON_BLACK equ 0x0F ; 每个字符的颜色,此为白底黑字print_string_pm:pushamov edx, VIDEO_MEMORYprint_string_pm_loop:mov al, [ebx] ; [ebx]是我们的字符的地址mov ah, WHITE_ON_BLACKcmp al, 0 ; 查看是否是字符串末尾je print_string_pm_donemov [edx], ax ; 将字符+颜色属性写入到视频存储区域add ebx, 1 ; 下一个字符add edx, 2 ; 下一个存储位置jmp print_string_pm_loopprint_string_pm_done:poparet

从0创建一个OS (九) 32-bit模式的打印字符串函数相关推荐

  1. 从0创建一个OS (一) 原文介绍 + 环境搭建

    OS教程--从0创建一个OS 本文为os-tutorial-How to create an OS from scratch!的中文翻译版,旨在为国内OS社区初学者提供入门OS编写教程,文中提供了每一 ...

  2. R语言使用多个数据类型不同的向量数据创建一个dataframe数据对象、使用is.data.frame函数查看数据对象是否是dataframe数据

    R语言使用多个数据类型不同的向量数据创建一个dataframe数据对象.使用is.data.frame函数查看数据对象是否是dataframe数据 目录 R语言使用多个数据类型不同的向量数据创建一个d ...

  3. 从控制台输入一个数字表示某个班学生人数,然后创建一个表示该班级所有学生名字的字符串数组,并使用控制台输入学生名字赋值给数组的每一个元素,最后输出所有学生姓名。

    Java控制台输入字符存储在数组中 题目:** 从控制台输入一个数字表示某个班学生人数,然后创建一个表示该班级所有学生名字的字符串数组,并使用控制台输入学生名字赋值给数组的每一个元素,最后输出所有学生 ...

  4. 创建一个JFrame,可下拉选择显示字符串和图片

    创建一个JFrame,可下拉选择显示字符串和图片 import java.awt.*; import java.awt.event.*; import java.io.*; import javax. ...

  5. Xcode8 + Swift3.0 创建一个app基础框架

    源代码放在github里面github源代码 QQ:26108724 下面这块是添加每一个TabbarItem的方法 下面这一块是添加所有VC到Tabbar里面的代码 import UIKitclas ...

  6. 【Python3.7】就餐人数:在为完成练习 9-1 而编写的程序中,添加一个名为 number_served 的属性,并将其默认值设置为 0。根据这个类创建一个名为 restaurant 的实例

    # [Python3.7]就餐人数:在为完成练习 9-1 而编写的程序中,添加一个名为 number_served的属性,并将其默认值设置为 0.根据这个类创建一个名为 restaurant 的实例: ...

  7. python创建一个类似于国家象棋棋盘的0-1矩阵_NumPy练习题(全中文并附详细讲解)...

    100道 numpy 练习 1. Import the numpy package under the name np (★☆☆)') 导入numpy模块,设置别称为np import numpy a ...

  8. 二叉树 1.0 -- 创建二叉树、遍历二叉树、二叉树常见问题求解

    树的结构主要是为了查找,这个主要是为了搜索,树的结构关注的不是增删查改 树 广义上面的树的结构我们不知道树的一个节点是有几个子节点的,所以这个时候我们需要定义的一种结构就是,一个节点的孩子是可以动态的 ...

  9. java.io,PrintWriter可以用来创建一个文件并向本文文件写入数据

    java.io,PrintWriter可以用来创建一个文件并向本文文件写入数据 PrintWriter(String filename); PrintWriter(File file);<!-- ...

最新文章

  1. Matlab编程与数据类型 -- 分支条件选择语句if/end
  2. Spring工厂注入例子
  3. Linux.Unix.windows的纠结史
  4. Martix工作室考核题 —— 打印九九乘法表
  5. 现代软件工程讲义 目录
  6. Python笔记-flask执行后台程序(非web应用)
  7. nginx tcp代理_nginx 基于tcp/udp代理
  8. 【learn】learn1
  9. 汇编语言软件延时1s
  10. 数据抓取的艺术(三)
  11. 《Python数据挖掘:概念、方法与实践》一1.3 在数据挖掘中使用哪些技术
  12. 委托的Invoke与BeginInvoke
  13. 在CNDS博客中插入Latex公式
  14. 怎么进入本地组策略编辑器
  15. Mybatis源码-cursor(游标)
  16. Win8.1屏幕亮度自动调节关闭方法
  17. 【论文】联邦学习区块链 论文集(一)
  18. 汇纳科技张宏俊:加强布局AI大数据,为实体商业服务
  19. Python 注册表作业制作
  20. 服务器放在北极什么位置,服务器放在北极和深海,是谁给了你勇气?

热门文章

  1. MC开服教程一:简略版使用阿里云部署mc服务器(paper端)
  2. IDEA Out of memory 问题
  3. 微信支付:app端提示微信签名失败,errCode=-2;后台服务端返回成功
  4. scrcpy 使用教程:将安卓设备投屏到 PC 端
  5. 图示管理系统(还书、续借、预约功能)jsp+JavaBean+JDBC+servlet+Dao
  6. SpingMVC 异常总结
  7. 都说它是年度Android机皇,都说它是年度Android机皇三星Note10到底怎么样
  8. 计算机知识选修课有哪些,【计算机专业论文】计算机选修课程特点与问题探究(共1944字)...
  9. M3中断向量表与A7中断向量表对比
  10. Microsoft.Jet.OLEDB.4.0和Microsoft.ACE.OLEDB.12.0的区别