自制操作系统——第三天,从IPL发射出去的程序,链接c语言程序

本文介绍了作者自制操作系统的进程,从IPL读取磁盘内容到内存,再到调用汇编和C语言程序。操作系统命名为Haribote,其核心包括asmhead.nas(汇编部分)、nasfunc.nas(汇编目标文件)和bootpack.c(C语言部分)。在32位系统中,C语言调用汇编函数以实现特定功能,如寄存器间接寻址。汇编代码需注意兼容486及更高型号的CPU。

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

操作系统与IPL放在一起后,操作系统就是个整理信息的,真正操作整个操作系统的是IPL,像我们把IPL放入操作系统,接下来把程序放入IPL——IPL与程序

1.haribote.nas(一个简单小程序的未编译文件)

tip:作者将操作系统更名为纸娃娃系统(haribote),就像是专门为这个小程序设计的操作系统的意思

  1. 一开始只是个简单程序,由IPL(用汇编语言编写了基本的读写磁盘方法)将磁盘内容读入内存后跳入(JMP haribote小程序的起始地址),ORG haribote小程序物理地址 以加载程序。
  2. 后来在小程序中保存显示器信息,以及指定显示器在内存多个位置中的哪个位置。在为进入32位系统而做准备,我们电脑启动前键盘鼠标会闪一下,我觉的应该就是这个时候在保存一些外设信息,然后才进入的32位/64位系统。
  3. 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编译得来的,一个是小程序,一个是操作系统,这里很容易搞混,原作作者应该也没考虑到这种情况
  4. 想要用汇编语言编写的文件链接c语言文件,前者.nas要使用nask目标文件模式,c语言.c要在程序中设置一个函数去调用函数在汇编语言中的名字,在编写为.obj,然后两者链接link就行了。

2.haribote.sys(原helloos.img)

3.asmhead.nas(原haribote.nas)

  1. haribote.nas更名生成,加了100行调用c语言的汇编语言。

4.nasfunc.nas(汇编语言部分——目标文件)

  1. c语言链接的目标文件
  2. asmhead.nas–>.c–nasfunc.nas
    编写c语言所不能实现的功能。
  3. 注意在32位系统中,寄存器间接寻址,基本上没有不能使用的寄存器,不像16位中只有BX,BP,DI,SI,但是这不代表着在汇编语言中就可以放飞自我了,要注意汇编语言中能自由使用的寄存器只有EAX、ECX、EDX,其他的寄存器在c语言中记录着重要数值,不能写,只能读,。
  4. 汇编在后边多加一句,INSTREST,声明是给486用的,而不是8086那种古老的16位系统。
  5. Intel家谱: 8086->80186->286 (16bit )—>386(32bit )->486->Pentium->PentiumPro->PentiumII->PentiumIII->Pentium4
  6. 汇编语言文件会将从Link链接的目标文件那儿接受到的参数依次放入[ESP+4].[ESP+8].[ESP+12].[ESP+16]
  7. _io_hlt;主机睡眠
  8. _write_mem8:(加"__"前缀说明这个是汇编语言文件中的编写的函数名,去掉前缀就是在c语言中调用的,像是前边这个要在c语言文件中使用就这样write_mem(1,2)) 编写了寄存器间接寻址方法,只有两个参数,所以只放了[ESP+4]和[ESP+8]

5.bootpack.c(c语言部分)

  1. 调用nasfunc.nas中的函数方法,实现c语言中所不能实现的功能___于是调用了汇编语言部分。
  2. io_hlt;原作者太喜欢汇编语言中的HLT待机功能了,非要编入进来。。
  3. write_mem8;实现寄存器间接寻址。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值