《30天自制操作系统》之——第1--2天

时间:2022-02-20 05:54:22

今年的国庆长假真是热闹,各个景区真可谓是人满为患。回趟家真心都不容易,路上各种堵,今天折腾了一天终于算是回到学校了。这个国庆啥都没干,死宅在家看电视、看书、码代码神马的感觉真心不错。假期开始看一本小日本的书《30天自制操作系统》,今天看到了书中内容的第八天,感觉书写的不错。但我只是看书+读代码,并没有自己维护一份代码,看到书中的第八天,前面的东西又忘了,所以今天开始做读书笔记并且自己维护一份代码。亲自敲一遍代码的好处不用多说,再者随书光盘中的代码注释并没有翻译成中文,所以说维护一份带中文注释的代码好处多多!

下面切入正题!

--------------------------------------------------------------------------------------------------------------------------------------------

第零天对什么操作系统、书中将要用到的技术做了介绍,同时给出了各章节的主要内容。

第一天的内容其实没有什么好记录的,但其中的一些概念还是了解一下为妙。

第二天才是后面内容的一个铺垫,程序功能和第一天的一样(让程序在电脑开机的时候自行启动),只不过比第一天的更加容易阅读和理解。下面直接上代码,当然这一天当中一些概念还是需要了解的。

ipl.nas

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
; ipl.nas
; TAB=4 
 
        ORG        0x7c00            ; 程序的装载地址 
 
; 以下的记述用于标准FAT12格式的软盘 
 
        JMP        entry 
         
        DB        0x90 
        DB        "HELLOIPL"         ; 启动区的名称可以是任意的字符(8字符) 
        DW        512                ; 每个扇区的大小 
        DB        1                  ; 簇(cluster)的大小(必须为1个扇区) 
        DW        1                  ; FAT的起始位置(一般从第一个扇区开始) 
        DB        2                  ; FAT的个数(必须为2
        DW        224                ; 根目录的大小(一般设成224项) 
        DW        2880               ; 该磁盘的大小(必须为2880扇区) 
        DB        0xf0               ; 磁盘的种类(必须是0xf0
        DW        9                  ; FAT的长度(必须是9扇区) 
        DW        18                 ; 1个磁道(track)有几个扇区(必须是18
        DW        2                  ; 磁头数(必须是2
        DD        0                  ; 不使用分区,必须是0 
        DD        2880               ; 重写一次磁盘大小 
        DB        0,0,0x29           ; 意义不明,固定 
        DD        0xffffffff         ; (可能是)卷标号码 
        DB        "HELLO-OS   "      ; 磁盘的名称(11字节) 
        DB        "FAT12   "         ; 磁盘格式名称(8字节) 
        RESB    18                   ; 先空出18字节 
         
; 程序核心 
 
entry: 
        MOV        AX,0              ; 初始化寄存器 
        MOV        SS,AX  
        MOV        SP,0x7c00 
        MOV        DS,AX 
        MOV        ES,AX 
 
        MOV        SI,msg 
 
putloop: 
        MOV        AL,[SI] 
        ADD        SI,1               ; 给SI加1 
        CMP        AL,0 
        JE        fin 
        MOV        AH,0x0e            ; 显示一个文字 
        MOV        BX,15              ; 指定字符颜色 
        INT        0x10               ; 调用显卡BIOS 
         
        JMP        putloop 
fin: 
        HLT                           ; 让CPU停止,等待指令 
        JMP        fin                ; 无限循环 
 
msg: 
        DB        0x0a0x0a          ; 换行2次 
        DB        "DUKE OS" 
        DB        0x0a                ; 换行 
        DB        0 
 
        RESB    0x7dfe-$              ; 填写0x00,直到0x07dfe ($代表将要读入的内存地址) 
 
        DB        0x550xaa 
 

随书光盘文件下载:http://download.csdn.net/detail/gaohuaid/8316111