博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Write Your Own Operating System Tutorial(中文版) - Lesson 2: 着手我们第一张启动盘
阅读量:2234 次
发布时间:2019-05-09

本文共 1798 字,大约阅读时间需要 5 分钟。

 Lesson 2: 着手我们第一张启动盘

这一课,我们将学习如何在软盘上做一个启动程序。我们将从修改Microsoft DOS Boot Record开始。
对于我们来说,我们想做的是替换掉boot loader的代码而不改动启动扇区的其他数据。如果我们把那些数据修改成无效的东西,DOS和WINDOWS认不出这张盘了。WINDOWS会给出提示信息说这张软盘尚未格式化,于是你将不能访问盘上的文件。但是,我们可以把启动程序的代码改成我们想要的样子,只要我们不去碰其它数据,DOS和Windows仍将能够读写盘上的文件。
我们将留下第一条指令(jmp 0x3E),因为我们需要跳过那些引导记录的数据。所以我们可以从0x3E开始我们的修改。运行DOS的DEBUG程序,把软盘上的第一个扇区加载到以0开始的内存,然后输入:
-u 3E
察看那里的指令。现在我们可以来修改了。输入命令:
-a 3E
来开始加入汇编代码。提示符从连接线变成了我们所在位置的内存地址。输入下面的指令并且回车。
jmp 3E
这条指令将变成机器码放置在内存里,提示符变成了你输入的指令之后的有效内存地址。再输入一个回车退出汇编状态。在我的机器上整个过程看上去像这样:
-a 3E
0AFC:003E jmp 3E
0AFC:0040
-
段地址(我这里是0x0AFC)可能(也将会)和你机器上的不一样。甚至有可能位于DEBUG的不同区。现在输入反汇编命令,来看看你刚才打入的指令。
-u 3E
正如你看到的,第一条指令是我们的跳转指令。这会导致一个死循环。如果我们现在就退出DEBUG,我们做的修改将不会被保存,不过我们可以通过输入下面的命令来把经过我们修改的启动扇区写入磁盘。
-w 0 0 0 1
"write"命令和"load"命令使用相同的语法。它把从内存地址0开始的数据写如磁盘0从第一个扇区开始的地方,总共写一个扇区。在用write命令的时候请千万小心。这个命令可以被用来覆盖磁盘上的数据,从而导致数据损失。
现在,你可以用这张盘来启动了。当你用它启动时,BIOS将把第一个扇区载入内存,并且开始从扇区开始的地方执行命令。这是一条跳转至0x3E的指令。而那里也是跳转到0x3E的指令,于是这将永远继续下去。试一试!用这张盘启动。看上去什么都没有发生,计算机呆坐在那里什么都不干。但是,你崭新的“操作系统”已经在运行了。
好好好,我知道你在说什么,你想要证明你的代码确实在运行而没有把你的计算机搞得一团糟。想要做到那一步,我们将调用BIOS的函数(至少在一开始)。在我写这个的时候,你应该能够在http://users.win.be/W0005997/GI/biosref.html找到一份BIOS函数的小列表。稍长的关于软件中断的列表可以在http://burak1.virtualave.net/Interrup.txt找到。当然你得记住,有些中断是BIOS调用,而有些是MS-DOS调用。后者现在不能使用,因为MS-DOS没有运行。在使用它们之前你将不得不自己实现那些函数。
我们将使用中断0x10的0x0E函数,来在屏幕上写一个字符。寄存器需要设成下面的值。
AH = 0x0E
AL = ASCII code of the character to be printed
BL = color/style of character
 
现在,重复这一课的指令,不过不要像上次那样输入一个跳转指令,这次输入下面的。
-a 3E
0AF6:003E mov ah, 0e
0AF6:0040 mov al, 48
0AF6:0042 mov bl, 07
0AF6:0044 int 10
0AF6:0046 jmp 46
0AF6:0048
-
 
首先我们把AH设为0,AL设成0x48(ASCII中代表‘H’),BL为7(黑屏白字的颜色代码),然后我们调用负责显示控制的中断0x10。像以前一样,最后一条指令产生了一个死循环,所以就在那里结束了。存盘(-w 0 0 0 1)并且试着用它来启动。这次你能在系统挂机前在屏幕上看到字母“h”。
稍许欣赏一下这个。你可以重复输出字符的代码,来输出一个短语,你也可以试试其它的软中断。如果你完成了,继续我们的下一课,我们将使用一个汇编语言编译器,而不再使用DEBUG了。

转载地址:http://bcibb.baihongyu.com/

你可能感兴趣的文章
回答阿里社招面试如何准备,顺便谈谈对于Java程序猿学习当中各个阶段的建议
查看>>
Dubbo分布式服务框架入门(附工程)
查看>>
两年Java开发工作经验面试总结
查看>>
作为Java面试官--谈谈一年来的面试总结
查看>>
两年Java程序员面试经
查看>>
面试心得与总结---BAT、网易、蘑菇街
查看>>
如何面试有2年java工作经验的应聘人员
查看>>
Java实现简单的递归操作
查看>>
面试Java程序员需具备的11个技能
查看>>
HashMap 和 HashTable 到底哪不同 ?
查看>>
Java实现简单的递归操作
查看>>
Struts2工作原理和执行流程图
查看>>
在线预览Word,Excel~
查看>>
hibernate延迟加载(get和load的区别)
查看>>
关于文件拷贝效率问题
查看>>
MyBatis分页插件PageHelper的使用
查看>>
【MyBatis学习01】宏观上把握MyBatis框架
查看>>
【MyBatis学习02】走进MyBatis的世界
查看>>
【MyBatis学习03】原始dao开发方法及其弊端
查看>>
【MyBatis学习04】mapper代理方法开发dao
查看>>