码迷,mamicode.com
首页 > 其他好文 > 详细

【0x01 初探启动程序】

时间:2016-04-28 20:07:43      阅读:304      评论:0      收藏:0      [点我收藏+]

标签:

来着日本天才的30天自制操作系统

 1 ; df-os
 2 ; TAB=4
 3 
 4         ORG        0x7c00            ;程序装载地址
 5 
 6         JMP        entry
 7         DB        0x90
 8         DB        "DFISHIPL"        ; 8字节启动区名称
 9         DW        512                ; 每个扇区512字节
10         DB        1                ; 簇大小
11         DW        1                ; FAT起始位置
12         DB        2                ; FAT个数
13         DW        224                ; 根目录大小
14         DW        2880            ; 磁盘大小
15         DB        0xf0            ; 磁盘种类
16         DW        9                ; FAT长度
17         DW        18                ; 1个磁道有几个扇区
18         DW        2                ; 磁头数
19         DD        0                ; 不使用分区
20         DD        2880            ; 重写一次磁盘大小
21         DB        0,0,0x29        ; 不明
22         DD        0xffffffff        ; 不明
23         DB        "HELLO-OS   "    ; 磁盘名称
24         DB        "FAT12   "        ; 磁盘格式名称
25         RESB    18                ; 空出18字节
26 
27 
28 
29 entry:
30         MOV        AX,0            
31         MOV        SS,AX
32         MOV        SP,0x7c00        ;SS:SP指向 0:7c00
33         MOV        DS,AX            ;DS:?? 指向 0:??
34 ;读磁盘
35         MOV        AX,0X820
36         MOV        ES,AX            ;ES:BX 为缓冲区地址 
37         MOV        CH,0            ;柱面头0
38         MOV     DH,0            ;磁头0
39         MOV     CL,2            ;扇区2
40         
41         MOV        SI,0            ;记录读取失败的次数
42 retry:        
43         MOV     AH,0X02            ;读盘
44         MOV     AL,1            ;1个扇区
45         MOV     BL,0
46         MOV     DL,0X00            ;A驱动器
47         INT     0X13            ;调用磁盘BIOS
48         JNC        fin                ;未出错就跳到fin
49         ADD        SI,1
50         CMP        SI,5            ;如果读取失败次数大于5 认为读取错误
51         JAE        error
52         ;系统复位
53         MOV        AH,0X00            ;A驱动器
54         MOV        DL,0X00
55         INT        0X13            ;重置驱动器
56         JMP        retry
57 fin:
58         HLT
59         JMP        fin
60 error:
61         MOV     SI,msg
62 putloop:
63         MOV        AL,[SI]            ;读取一个字符    
64         ADD        SI,1            
65         CMP        AL,0            ;字符串读到0 就结束
66         JE        fin
67         MOV        AH,0x0e            
68         MOV        BX,15            
69         INT        0x10            
70         JMP        putloop
71 msg:
72         DB        0x0a, 0x0a
73         DB        " df-os All rights reserved "
74         DB        0x0a, 0x0a
75         DB        " developed by deadfish ~^__^~"
76         DB        0
77 
78         RESB    0x7dfe-$        
79         DB        0x55, 0xaa

程序开始就指明了程序的装载地址0x7c00 具体参考:https://www.douban.com/note/249471773/

简单来说就是:开机的时候,电脑首先执行的是BIOS(基础输入输出)程序,然后BIOS从指定的设备加载数据,

而加载数据的地址已经定死了,就是这个0x7c00。

然后跳到了entry这个地方,entry首先把栈的地址指向了启动区初始地址(对了,entry和指定装载位置中间的那些DB专门史针对FAT12格式软盘,具体不明 - - )

接着entry就进行一系列都盘操作。读取的位置从0x8200开始(启动区是 0x7c00-0x7dff 512个字节,一个扇区)

读磁盘采用int 0x13 参考:https://en.wikipedia.org/wiki/INT_13H

读取成功就进行一个死循环

读取失败就输出最后那些字符串。

最后值得注意的是RESB 那边 就是为了填0,把启动去填满

【0x01 初探启动程序】

标签:

原文地址:http://www.cnblogs.com/driedfish/p/5443852.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!