学习操作系统原理最好的方法是自己写一个简单的操作系统。


在上一讲中我们介绍了屏幕显示的原理,本讲我们来实战一下。

一、向屏幕输出一个字符mbr4.asm

mbr4.asm中的代码如下:

;将屏幕第一行的第一个字符显示为‘G’。
mov ah,0x07 ;黑底白字
mov al,'G' ;G的ASCII码是0x47,此时ax的值为0x0747。
mov bx,0xb800
mov es,bx
mov [es:0],ax ;文本模式显存地址从0xb8000开始。 stop: ;标号
hlt
jmp stop times 510-($-$$) db 0 ;将从上条指令结束到最后2个字节前的空余字节全部置为0。
db 0x55,0xaa

上面代码中的注释比较详细,结合之前介绍过的内容,大家应该能看懂。下面我们来演示一下。

首先我们回顾一下上节课QEMU中默认显示的内容:

从上面截图中可以看到,QEMU中默认显示的第一行第一个字符是‘S’。

下面我们编译运行mbr4.asm。

从上面这个截图可以看到QEMU第一行第一个字符已经变为了字符‘G’,这是我们第一次向屏幕输出字符。

二、将字符显示到屏幕的任意位置mbr5.asm

在默认的文本模式中,一屏能显示25行80列,共2000个字符。每个字符占用2个显存地址,2000个字符共占用4000个显存地址。所以第一屏的显存地址范围是(0xb8000+0)~(0xb8000+4000)。每行显示80个字符,也就是每行对应160个显存地址。在实际使用中,我们需要能将字符输出到屏幕的任意位置。比如上面的例子中,我们将字符输出到了QEMU本来就有字符的地方,这样混在一起不好。我们看到第二行是空白的,我们下面将字符输出到第二行。

mbr5.asm的代码如下:

mov ax,0xb800
mov es,ax
mov ah,0x07
mov al,'G'
mov [es:160],ax ;将字符'G'显示在屏幕第二行第一个字符的位置 stop:
hlt
jmp stop times 510-($-$$) db 0
db 0x55,0xaa

编译运行截图如下:

从上面截图可以看到,我们将字符‘G’显示在了QEMU第二行第一个字符的位置。

三、向屏幕显示字符串mbr6.asm

mbr6.asm的代码如下:

mov ax,0xb800
mov es,ax ;在屏幕第2行显示字符串“GrapeOS"
mov ah,0x07 ;ah中的值一直保持不变
mov al,'G'
mov [es:160],ax
mov al,'r'
mov [es:162],ax ;每个字符对应显存中的2个字节,依次递增2个字节。
mov al,'a'
mov [es:164],ax
mov al,'p'
mov [es:166],ax
mov al,'e'
mov [es:168],ax
mov al,'O'
mov [es:170],ax
mov al,'S'
mov [es:172],ax stop:
hlt
jmp stop times 510-($-$$) db 0
db 0x55,0xaa

编译运行截图如下:

从上面截图中可以看到,我成功的在QEMU屏幕第二行显示出了字符串“GrapeOS”。


本讲视频版地址:https://www.bilibili.com/video/BV1VY411v7y2/

本教程代码和资料:https://gitee.com/jackchengyujia/grapeos-course

GrapeOS操作系统QQ群:643474045

最新文章

  1. Flex帮助文档ASDoc
  2. javascript 自定义类型 属性,方法
  3. javaWeb 在jsp中 使用自定义标签输出访问者IP
  4. 将网站部署到windows2003 iis6之后,出现asp.net程序页面无法访问情况
  5. SqlServer数据库的一些方法的用途
  6. cssText设置css样式
  7. Gson解析复杂JSON对象
  8. Swift - 九宫格图片缩放总结样例
  9. HC - 05 bluetooth module settings in Linux using CuteCom
  10. Android Paint Xfermode 学习小结
  11. Node.js:EventEmitter
  12. Object-C知识点 (一) 常用知识点
  13. APPLE-SA-2019-3-25-1 iOS 12.2
  14. 百度编辑器UEditor 点击上传图片选择框会延迟几秒才会显示 反应很慢(转)
  15. Python应用——自定义函数:分割PDF文件函数
  16. 修复bug及修复过程
  17. tmux的复制粘贴
  18. word中怎样设置页码包含总页数
  19. 微信小程序——时间戳的转换及调用
  20. CentOS7.5搭建Solr7.4.0集群服务

热门文章

  1. 第七章 mysql的备份与恢复
  2. C#定时任务(Timer)
  3. pythonn全栈学习笔记--logging模块学习(四)
  4. 利用matlab求解函数微分
  5. Day12-面向对象初识
  6. go结构体打印格式化成json
  7. 【已解决】xlwings库合并单元格,不报错,不执行
  8. git 报错 incorrect username or password
  9. 如何申请ios证书
  10. sdio/mmc/sd笔记