操作系统与IPL放在一起后,操作系统就是个整理信息的,真正操作整个操作系统的是IPL,像我们把IPL放入操作系统,接下来把程序放入IPL——IPL与程序
1.haribote.nas(一个简单小程序的未编译文件)
tip:作者将操作系统更名为纸娃娃系统(haribote),就像是专门为这个小程序设计的操作系统的意思
- 一开始只是个简单程序,由IPL(用汇编语言编写了基本的读写磁盘方法)将磁盘内容读入内存后跳入(JMP haribote小程序的起始地址),ORG haribote小程序物理地址 以加载程序。
- 后来在小程序中保存显示器信息,以及指定显示器在内存多个位置中的哪个位置。在为进入32位系统而做准备,我们电脑启动前键盘鼠标会闪一下,我觉的应该就是这个时候在保存一些外设信息,然后才进入的32位/64位系统。
- haribote.nas原内容更名为asmhead.nas,然后加了100行为了调用c语言的汇编代码,进入32位后分为汇编部分和c语言部分,操作系统在做完asmhead.nas指定的事情后,就跑去调用c语言程序,汇编部分是指nasfunc.nas。 c语言部分叫做bootpack.c,经过编译bootpack.nas得到的本来应该是映像文件,但这里又更名为.obj目标文件,因为这是个特殊的机器语言文件,不完整的,c语言的作者以及意识到了c语言的局限性,必须要汇编语言来编写其中一部分,需要link链接汇编语言编写的文件后才能形成真正的机器语言文件,链接完后就是obj2bim,bim2hrb,前者是形成一个完整的二进制映像文件,后者是根据操作系统的不同进行添加额外信息,比如说加上文件头或者压缩等,最后再写进映像文件,形成我们新的haribote.sys。包含程序的操作系统完整的映像文件,不要把haribote.sys当成haribote.nas编译得来的,一个是小程序,一个是操作系统,这里很容易搞混,原作作者应该也没考虑到这种情况。
- 想要用汇编语言编写的文件链接c语言文件,前者.nas要使用nask目标文件模式,c语言.c要在程序中设置一个函数去调用函数在汇编语言中的名字,在编写为.obj,然后两者链接link就行了。
2.haribote.sys(原helloos.img)
3.asmhead.nas(原haribote.nas)
- haribote.nas更名生成,加了100行调用c语言的汇编语言。
4.nasfunc.nas(汇编语言部分——目标文件)
- c语言链接的目标文件
- asmhead.nas–>.c–nasfunc.nas
编写c语言所不能实现的功能。 - 注意在32位系统中,寄存器间接寻址,基本上没有不能使用的寄存器,不像16位中只有BX,BP,DI,SI,但是这不代表着在汇编语言中就可以放飞自我了,要注意汇编语言中能自由使用的寄存器只有EAX、ECX、EDX,其他的寄存器在c语言中记录着重要数值,不能写,只能读,。
- 汇编在后边多加一句,INSTREST,声明是给486用的,而不是8086那种古老的16位系统。
- Intel家谱: 8086->80186->286 (16bit )—>386(32bit )->486->Pentium->PentiumPro->PentiumII->PentiumIII->Pentium4
- 汇编语言文件会将从Link链接的目标文件那儿接受到的参数依次放入[ESP+4].[ESP+8].[ESP+12].[ESP+16]
- _io_hlt;主机睡眠
- _write_mem8:(加"__"前缀说明这个是汇编语言文件中的编写的函数名,去掉前缀就是在c语言中调用的,像是前边这个要在c语言文件中使用就这样write_mem(1,2)) 编写了寄存器间接寻址方法,只有两个参数,所以只放了[ESP+4]和[ESP+8]
5.bootpack.c(c语言部分)
- 调用nasfunc.nas中的函数方法,实现c语言中所不能实现的功能___于是调用了汇编语言部分。
- io_hlt;原作者太喜欢汇编语言中的HLT待机功能了,非要编入进来。。
- write_mem8;实现寄存器间接寻址。