实现自己的操作系统 第一部分

本文介绍在实模式下通过软盘加载文件系统的实现过程,包括函数调用、代码自我搬移、fat区及根目录区拷贝到内存等关键技术点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1-1

实现了一个简单的函数调用。

重点是里面对栈的应用。

call返回时调用ret,后面有一个数字,代表调用时有多少字节数据入栈。 

1-2

实现了代码的自我搬移。

include不能放在文件开头,因为程序执行时是从第一行开始。(可能能够重定位,目前未知)

搬移后标记的内存地址都需要重新调整。

当使用短跳转或短call调用的时候,标号不需要调整,因为这里的操作数的间接地址,即两个地址之间的差;当是长跳转或长call调用的时候,操作数是绝对值,需要调整。

访问堆栈的间接寻址中只能使用bp做偏移。

任何时候不要往cs中写东西,要不然程序会崩溃。

1-3

将软盘fat区和根目录区拷贝到内存。

当前内存使用情况:
9000:0000--9000:01ff boot代码,总长512
9000:0200--9000:13ff fat内容,总长1200h
9000:1400--9000:2fff 根目录内容,总长1c00h

fat2文件系统中,前3个字节是跳转指令,后面59字节是磁盘参数,然后是448字节代码区,最后0xaa55引导标记。

现在的问题是编译出的代码过长,只剩下167字节代码段。

下一步考虑使用宏定义代替短函数调用,进一步压缩代码。

1-4

将DispStr改为宏定义之后,成功的将代码压缩了22字节。

包含macro的头文件必须放在文件开头,所以宏定义应该单独放在一个文件中。

loop使用的也是相对偏移量。

使用loop的时候,cx的值就是循环次数,没有加一或减一的偏移。 

1-5

当前内存使用情况:
9000:0000--9000:01ff boot代码,总长512
9000:0200--9000:13ff fat内容,总长1200h
9000:1400--9000:2fff 根目录内容,总长1c00h

已经能够找到LOADER.COM文件。

保存在fat2文件系统中文件名都将自动被转换成大写。

在实模式下返回DOS的方法:
%macro RETURNDOS 0 ;这里的0必须要写
 mov ax, 4c00h
 int 21h
%endmacro

下一步:
加载loader.com
之后内存内容应该为:
9000:0000--9000:01ff boot代码,总长512
9000:0200--9000:13ff fat内容
9000:1400--9000:2fff 根目录内容,总长1c00h
9000:3000--9000:fc00 loader.com

1-6

加载loader.com
此时内存内容为:
9000:0000--9000:01ff boot代码,总长512
9000:0200--9000:13ff fat内容,总长1200h,即4608字节
9000:1400--9000:2fff 根目录内容,总长1c00h
9000:3000--9000:fc00 loader.com,总长0cc00h,即52224字节

 

 

最终会跳转到9000:3000 

代码地址:

http://d.download.youkuaiyun.com/filedown2008/aHR0cDovL2RsMi5jc2RuLm5ldC9kb3duNC8yMDA4MDMzMC8zMDIxMzU0MTgyMi56aXA=!398454

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值