买了这本书将近一年才开始看- =,最近看完第八天的内容,也就是实现了鼠标的移动。总的来说这本书感觉还是可以,大致上可以了解到一个操作系统是如何搭建。语言幽默风趣,每天的任务量不是特别多并且每天的章节内容明确,由于每个程序我都只是编译现成的代码来看实现效果,所以学完了8天的内容之后,许多概念还是迷迷糊糊,所以今天开始为每一天的内容写文章,总结这本书自己比较模糊的内容,同时也帮助自己梳理一下知识点,也为了之后学习能更畅顺。
第一天:
主要讲述一些工具及其使用,用汇编语言写程序。其中汇编语言指令
DB指令作用是往文件里直接写入一个字节。
DW指令作用是往文件里写入一个字,也即两个字节
DD即double ,也就是四个字节
用法:
DB 0xeb, 0x4e, 0x90, 0x48….
DB “HELLO-OS”
它可以直接写字符串,在写字符串时,汇编语言会自动查找字符串中每一个字符所对应的编码,然后把它们一个字节一个字节地排列起来。
RESB指令作用是用于保留字节。
以下是第一天的一个程序
; hello-os
; TAB=4 用于调整TAB键的宽度
; 以下这段是标准FAT12格式软盘专用的代码
DB 0xeb, 0x4e, 0x90
DB "HELLOIPL" ; 启动区的名称可以是任意的字符串(8字节)
DW 512 ; 每个扇区的大小(必须是512字节)
DB 1 ; 簇的大小(必须为1个扇区)
DW 1 ; FAT的起始位置(一般从第一个扇区开始)
DB 2 ; FAT的个数(必须是2)
DW 224 ; 根目录的大小(一般设为224)
DW 2880 ; 该磁盘的大小(必须是2880扇区)
DB 0xf0 ; 磁盘的种类(必须是0xf0)
DW 9 ; FAT的长度(必须是9扇区)
DW 18 ; 1个磁道有几个扇区(必须是18)
DW 2 ; 磁头数(必须是2)
DD 0 ; 不使用分区,必须是0
DD 2880 ; 重写一次磁盘大小
DB 0,0,0x29
DD 0xffffffff
DB "HELLO-OS " ; 磁盘的名称
DB "FAT12 " ; 磁盘格式名称
RESB 18 ; 保留18个字节
; 程序主体
DB 0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c
DB 0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a
DB 0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09
DB 0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb
DB 0xee, 0xf4, 0xeb, 0xfd
; 信息显示部分
DB 0x0a, 0x0a ; 两个换行
DB "hello, world"
DB 0x0a ; 换行
DB 0
RESB 0x1fe-$ ; 填写0x00,直到0x001fe
DB 0x55, 0xaa
; 以下是启动区以外部分的输出
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
RESB 4600
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
RESB 1469432
在上述的程序中,有几个地方要说明,首先符号;是个注释命令。
还有就是RESB 0x1fe-$,美元符号表示的是这一行现在的字节数。
信息显示部分中最后的命令DB 0x55, 0xaa表示是一个启动区。软盘第一个扇区称为启动区,计算机读写软盘的时候,并不是一个字节一个字节的读写,而是以512字节为一个单位进行读写。一个软盘空间共有1440KB,除以512得2880,也就是一张软盘共有2880个扇区。
那为什么第一个扇区是启动区?因为计算机首先从最初一个扇区开始读盘,然后去检查这个扇区最后两个字节的内容是不是为0x55, 0xaa,若不是则会认为没有所需的启动程序,则会报一个不能启动的错误