30天自制操作系统笔记(第三天)

这几天边看操作系统原理,边看着这本书实践,30天这本书真的写的非常不错,学过汇编再看这本书有一种从理论到实践的感觉,虽然里面的汇编用的不多(当然要是用的太多这本书厚度又要加一倍了)。

好了,废话不多说,直接进入今天内容。

首先关于地址的问题,在用光盘引导系统的情况下(也就是本书描述的),启动区装载地址是0x7c00;这个启动区通常是装在光盘第一个扇区里的,这个扇区大小是512B(1B=8b),用16进制表示也就是0x0200,启动区的作用,自然是加载其他扇区。

加载其他扇区,那加载到哪里呢,这时你就不能再加载到第一个扇区的后面了,不然内存管理多混乱啊,自然要先看看哪里有空,本书将其装载到0x8000之后。

此时查看img文件的二进制代码(img其实可以看作软盘),发现系统文件名写在0x002600之后,文件内容写在0x004200之后位置。

因此可以计算出操作系统主程序在0x4200+0x8000=0xc200之后的内存空间。

这里我其实有一个问题,既然已经知道这些程序的装载地址,为何还要在程序前面写上ORG 0x....呢?

网上相关的资料说,ORG是对编译器下的指令,告诉他要装载到这个地址,所以还是没解释清楚。。。(是不是因为如果不写装载地址的话计算机把软盘中空白内容也装进内存中做了无用功?)

汇编与c语言如何链接的问题:

由于c语言的局限性,有些操作必须要用汇编来写,具体编译过程是先用c文件生成gas文件,再生成nas文件,然后生成obj文件,也就是目标文件,再将目标文件与其他文件链接才变成可执行的机器语言,其实目前知道这个没多大意义,具体看怎么写吧,首先在另一个nas文件中用汇编写出待调用的函数,然后就可以在c文件中引用。

要注意的是,汇编写的函数都是不带参数的,而c语言的参数都是整型格式传入[ESP:4]中,ESP是堆栈段寄存器,因此,第一个数字的存放地址是[ESP+4]~[ESP+7],第二个数字的存放地址是[ESP+8]~[ESP+11],存放顺序是低位放低地址,高位放高地址,在读取的时候是取低地址一个字一个字按需要读取。(c编程时,变量都储存在栈中,其中可能有一定联系。)

 

posted @ 2018-03-07 20:46  kkdf  阅读(194)  评论(0编辑  收藏  举报