《30天自制操作系统》 day3 小结

来源:互联网 发布:建筑工程资料员软件 编辑:程序博客网 时间:2024/05/22 18:56

前面部分还是正常的汇编编译模式:

JC:jump if carry,如果进位标识(carry flag)是1的话,就跳转。

INIT 0x13 是调用BIOS的0x13号函数。是系统复位。

磁 盘 读 、 写 , 扇 区 校 验 (verify), 以 及 寻 道 (seek)
·AH=0x02 ; ( 读 盘 )
·AH=Ox03; ( 写 盘 )
·AH=Ox04; ( 校 验 )
·AH=OxOc; ( 寻 道 )
·AL=处 理 对 象 的 扇 区 数 ; ( 只 能 同 时 处 理 连 续 的 扇 区 )
·CH = 柱 面 号 &0xff;
·CL =扇 区 号 ( 0 -5位 ) 丨 ( 柱 面 号 & 0 x300 ) > > 2 ;
·DH = 磁 头 号 ,
·DL = 驱 动 器 号 ;
·ES:BX=缓 冲 地 址 ; 〈 校 验 及 寻 道 时 不 使 用 )
·返 回 值 :
·FLACS .CF=0: 没 有 错 误 , AH=O
·FLAGS.CF=1I: 有 错 误 , 锘 误 号 码 存 人 AH 内 ( 与 重 置 (reset) 功 能
我 们 这 次 用 的 是 AH=0 x02 , 哦 , 原 来 是 “ 读 盘 ” 的 意 思 。
一 样 )

FLACS .CF:进位标志
进位标志只能存储1位信息,像这种1位寄存器称之为标志flag。

含有IPL的启动区位于C0-H0-S1(柱面0,磁头0,扇区1的缩写),下一个扇区是C0-H0-S2

缓冲区地址是内存地址,即从软盘中读出的数据在内存的装载位置。
因为BX寄存器只有16位,只能存储64K数据,所以增加了EBX寄存器来表示更大(32位)的内存地址。但未导入EBX之前CPU还没有32位寄存器,所以设计了起辅助作用的段寄存器(segment register)
在使用段寄存器时用ES:BX这种方式来表示,写成“MOV AL, [ES:BX]”,代表ES*16+BX的内存地址。可以理解为先用ES寄存器指定一个大致地址,然后再用BX来指定其中的一个具体地址。一般省略会把DS作为默认的段寄存器,如”MOV CX,[1234]”相当于”MOV CX,[DS:1234]”。因为有这样的默认规定,所以DS必须余弦指定为0,否者地址的值就要加上这个数的16倍,度写道其他地方引起混乱。

0x8000~0x81ff这512字节是留给启动区的,所以一般设置ES=0x0820,BX=0

JNC: jump if not carry 如果进位标志是0就跳转。
JAE:jump if above or equal 大于或等于+时跳转。
JBE:jump if below or equal 小于等于则跳转

VRAM指的显卡内存,也就是用来显示画面的内存。可以向内存一样存储数据,且各个地址都对应着画面上的像素,因此能在画面上绘制出五彩缤纷的图案。

INT 0x10画面模式下“VRAM是0xa0000~0xaffff的64KB”


开始导入C语言部分

在书中,作者用了他的办法将c语言编程机器语言也就是汇编语言:

工具 作用 输入 输出 cc1 gcc以gas汇编语言为基础,输出gas用的源程序 .c .gas gas2nask 把gas变换成nask能翻译的语法 .gas .nas nask 翻译成机器语言,生成目标文件.obj .nas .obj obi2bim 目标文件需与其他文件link才能编程真正可以执行的机器语言,bim是二进制映像文件,是一种代替的形式 .obj .bim bim2hrm 为了能够实际使用,要做成适合本书操作系统要求的形式 .bim .hrb

步骤繁琐是因为使用了gcc这个一个比较基础的编译器,它是以能适应各种不同操作系统位前提设计的,所以对内部没有任何隐藏,特意像这样多生成一些中间文件。仅靠这个 编译器,就可以制作Windows、linux以及OSASK用的可执行文件。

根据以上内容Makefile也做了很大改动,将改动的部分分解成流程图更好理解:
Makefile

作者对hlt这个函数情有独钟啊,于是用汇编语言写了个hlt的实现函数(naskfunc.nas)。因为之后要与bootpack.obj链接,所以也需要编译成目标文件。因此将输出格式设定为WCOFF模式,且设定成32位机器语言模式。

在nask目标文件的模式下,必须设定文件名信息,然后再写明下面程序的函数名。“_”需加载函数名前面,否则就不能很好地与C语言函数链接。需要链接的函数名,都要用GLOBAL指令声明。
然后在c程序里面调用这个函数就可以使用hlt了。

0 0
原创粉丝点击