-
Notifications
You must be signed in to change notification settings - Fork 0
/
asmhead.lst
219 lines (219 loc) · 14.8 KB
/
asmhead.lst
1
2
3
4
5
6
7
8
9
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
1 00000000 ; haribote-os boot asm
2 00000000 ; TAB=4
3 00000000 ; 内存分布大概
4 00000000 ; 0x0000 0000 ~ 0x000f ffff BIOS、VRAM等 1 MB
5 00000000 ; 0x0010 0000 ~ 0x0026 7fff 用于保存盘的内容 1440 KB
6 00000000 ; 0x0026 8000 ~ 0x0026 f7ff 空 30 KB
7 00000000 ; 0x0026 f800 ~ 0x0026 ffff IDT 2 KB
8 00000000 ; 0x0027 0000 ~ 0x0027 ffff GDT 64 KB
9 00000000 ; 0x0028 0000 ~ 0x002f ffff bootpack.hrb 512 KB
10 00000000 ; 0x0030 0000 ~ 0x003f ffff 栈及其他 1 MB
11 00000000 ; 0x0040 0000 ~
12 00000000 ;
13 00000000 [INSTRSET "i486p"] ; 486指令使用许可
14 00000000
15 00000000
16 = 00000103 VBEMODE EQU 0x103 ; 1024 x 768 x 8bit彩色
17 00000000 ; VBE画面模式设置如下
18 00000000 ; 0x100 : 640 x 400 x 8bit彩色
19 00000000 ; 0x101 : 640 x 480 x 8bit彩色
20 00000000 ; 0x103 : 800 x 600 x 8bit彩色
21 00000000 ; 0x105 : 1024 x 768 x 8bit彩色
22 00000000 ; 0x107 : 1280 x 1024 x 8bit彩色
23 00000000
24 00000000
25 = 00280000 BOTPAK EQU 0x00280000 ; bootpack偺儘乕僪愭
26 = 00100000 DSKCAC EQU 0x00100000 ; 僨傿僗僋僉儍僢僔儏偺応強
27 = 00008000 DSKCAC0 EQU 0x00008000 ; 僨傿僗僋僉儍僢僔儏偺応強乮儕傾儖儌乕僪乯
28 00000000
29 00000000 ; BOOT_INFO娭學
30 = 00000FF0 CYLS EQU 0x0ff0 ; 僽乕僩僙僋僞偑愝掕偡傞
31 = 00000FF1 LEDS EQU 0x0ff1 ;
32 = 00000FF2 VMODE EQU 0x0ff2 ; 怓悢偵娭偡傞忣曬丅壗價僢僩僇儔乕偐丠
33 = 00000FF4 SCRNX EQU 0x0ff4 ; 夝憸搙偺X
34 = 00000FF6 SCRNY EQU 0x0ff6 ; 夝憸搙偺Y
35 = 00000FF8 VRAM EQU 0x0ff8 ; 僌儔僼傿僢僋僶僢僼傽偺奐巒斣抧
36 00000000
37 00000000
38 00000000 ; 执行haribote.sys文件,该文件保存于img映像中的第一个文件
39 00000000 ; 则是FAT12系统中的0x4200起才开始存储文件的
40 00000000 ; 而这段img映像是被加载到0x8000的,
41 00000000 ; 所谓haribote.sys应该是在内存中的0xc200位置
42 ORG 0xc200 ; 该处为磁盘映像的位置
43 0000C200
44 0000C200 ; 确认VBE是否存在
45 0000C200 ; 如果VBE存在的话,AX会变成0x004f,并跳过执行JNE scrn320
46 0000C200
47 0000C200 B8 9000 MOV AX,0x9000
48 0000C203 8E C0 MOV ES,AX
49 0000C205 BF 0000 MOV DI,0
50 0000C208 B8 4F00 MOV AX,0x4f00
51 0000C20B CD 10 INT 0x10
52 0000C20D 3D 004F CMP AX,0x004f
53 0000C210 75 52 JNE scrn320
54 0000C212
55 0000C212 ; 检查VBE的版本
56 0000C212 ; 如果VBE的版本低于2.0,则无法使用高分辨率
57 0000C212
58 0000C212 26 8B 45 04 MOV AX,[ES:DI+4]
59 0000C216 3D 0200 CMP AX,0x0200
60 0000C219 72 49 JB scrn320 ; if (AX < 0x0200) goto scrn320
61 0000C21B
62 0000C21B ; 取得画面的模式信息
63 0000C21B ; 如果AX不等于0x004f则表示不可用
64 0000C21B
65 0000C21B B9 0103 MOV CX,VBEMODE
66 0000C21E B8 4F01 MOV AX,0x4f01
67 0000C221 CD 10 INT 0x10
68 0000C223 3D 004F CMP AX,0x004f
69 0000C226 75 3C JNE scrn320
70 0000C228
71 0000C228 ; 画面模式信息的确认
72 0000C228
73 0000C228 26 80 7D 19 08 CMP BYTE [ES:DI+0x19],8
74 0000C22D 75 35 JNE scrn320
75 0000C22F 26 80 7D 1B 04 CMP BYTE [ES:DI+0x1b],4
76 0000C234 75 2E JNE scrn320
77 0000C236 26 8B 05 MOV AX,[ES:DI+0x00]
78 0000C239 25 0080 AND AX,0x0080
79 0000C23C 74 26 JZ scrn320
80 0000C23E
81 0000C23E ; 画面模式的切换
82 0000C23E
83 0000C23E BB 4103 MOV BX,VBEMODE+0x4000
84 0000C241 B8 4F02 MOV AX,0x4f02
85 0000C244 CD 10 INT 0x10
86 0000C246 C6 06 0FF2 08 MOV BYTE [VMODE],8 ; 记下画面模式
87 0000C24B 26 8B 45 12 MOV AX,[ES:DI+0x12]
88 0000C24F A3 0FF4 MOV [SCRNX],AX
89 0000C252 26 8B 45 14 MOV AX,[ES:DI+0x14]
90 0000C256 A3 0FF6 MOV [SCRNY],AX
91 0000C259 66 26 8B 45 28 MOV EAX,[ES:DI+0x28]
92 0000C25E 66 A3 0FF8 MOV [VRAM],EAX
93 0000C262 EB 20 JMP keystatus
94 0000C264
95 0000C264 ; 低分辨模式
96 0000C264 scrn320:
97 0000C264 B0 13 MOV AL,0x13 ; VGA图、320x200x8bit彩色
98 0000C266 B4 00 MOV AH,0x00
99 0000C268 CD 10 INT 0x10
100 0000C26A C6 06 0FF2 08 MOV BYTE [VMODE],8 ; 记下画面模式
101 0000C26F C7 06 0FF4 0140 MOV WORD [SCRNX],320
102 0000C275 C7 06 0FF6 00C8 MOV WORD [SCRNY],200
103 0000C27B 66 C7 06 0FF8 000A0000 MOV DWORD [VRAM],0x000a0000
104 0000C284
105 0000C284 ; 使用BIOS读取键盘当前的大小写锁状态,
106 0000C284 ; 这是在未进入32位时使用BIOS的
107 0000C284 keystatus:
108 0000C284 B4 02 MOV AH,0x02
109 0000C286 CD 16 INT 0x16 ; keyboard BIOS
110 0000C288 A2 0FF1 MOV [LEDS],AL
111 0000C28B
112 0000C28B ; PIC关闭一切中断
113 0000C28B ; 根据AT兼容机的规格,如果要初始化PIC
114 0000C28B ; 必须在CLI之前进行,否则会挂起
115 0000C28B ; 随后进行PIC的初始化
116 0000C28B
117 0000C28B B0 FF MOV AL,0xff
118 0000C28D E6 21 OUT 0x21,AL ; 禁止PIC0的主中断
119 0000C28F 90 NOP ; 连续进行OUT操作,可能会出现异常
120 0000C290 E6 A1 OUT 0xa1,AL ; 禁止PIC1的主中断
121 0000C292
122 0000C292 FA CLI ; 禁止CPU级别的中断
123 0000C293
124 0000C293 ; 为了让CPU能访问1MB以上的内存空间,设定A20GATE
125 0000C293
126 0000C293 E8 00B5 CALL waitkbdout
127 0000C296 B0 D1 MOV AL,0xd1
128 0000C298 E6 64 OUT 0x64,AL
129 0000C29A E8 00AE CALL waitkbdout
130 0000C29D B0 DF MOV AL,0xdf ; enable A20
131 0000C29F E6 60 OUT 0x60,AL
132 0000C2A1 E8 00A7 CALL waitkbdout
133 0000C2A4
134 0000C2A4 ; 切换到保护模式
135 0000C2A4
136 0000C2A4 0F 01 16 C38A LGDT [GDTR0] ; 设立临时GDT
137 0000C2A9 0F 20 C0 MOV EAX,CR0
138 0000C2AC 66 25 7FFFFFFF AND EAX,0x7fffffff ; 设bit31为0(为了禁止颁)
139 0000C2B2 66 83 C8 01 OR EAX,0x00000001 ; 设bit0 为1(为了切换到保护模式)
140 0000C2B6 0F 22 C0 MOV CR0,EAX
141 0000C2B9 EB 00 JMP pipelineflush ; 管道机制
142 0000C2BB pipelineflush:
143 0000C2BB B8 0008 MOV AX,1*8 ; 可读的段 32bit
144 0000C2BE 8E D8 MOV DS,AX
145 0000C2C0 8E C0 MOV ES,AX
146 0000C2C2 8E E0 MOV FS,AX
147 0000C2C4 8E E8 MOV GS,AX
148 0000C2C6 8E D0 MOV SS,AX
149 0000C2C8
150 0000C2C8 ; bootpack的转送
151 0000C2C8 66 BE 0000C390 MOV ESI,bootpack ; 转送源
152 0000C2CE 66 BF 00280000 MOV EDI,BOTPAK ; 转送目的地
153 0000C2D4 66 B9 00020000 MOV ECX,512*1024/4 ; 转送长度
154 0000C2DA E8 0075 CALL memcpy ; 上面的寄存器设置是作为参数
155 0000C2DD
156 0000C2DD ; 磁盘数据最终传送到它本身的位置上
157 0000C2DD
158 0000C2DD ; 首先从启动区开始
159 0000C2DD 66 BE 00007C00 MOV ESI,0x7c00 ; 传送源
160 0000C2E3 66 BF 00100000 MOV EDI,DSKCAC ; 传送目的地
161 0000C2E9 66 B9 00000080 MOV ECX,512/4 ; 传送长度
162 0000C2EF E8 0060 CALL memcpy ; 启动传送
163 0000C2F2
164 0000C2F2 ; 所有剩下的
165 0000C2F2
166 0000C2F2 66 BE 00008200 MOV ESI,DSKCAC0+512 ; 传送源
167 0000C2F8 66 BF 00100200 MOV EDI,DSKCAC+512 ; 传送目的地
168 0000C2FE 66 B9 00000000 MOV ECX,0
169 0000C304 8A 0E 0FF0 MOV CL,BYTE [CYLS]
170 0000C308 66 69 C9 00001200 IMUL ECX,512*18*2/4 ; 从柱面数变换为字节数/4
171 0000C30F 66 81 E9 00000080 SUB ECX,512/4 ; 减去IPL
172 0000C316 E8 0039 CALL memcpy
173 0000C319
174 0000C319
175 0000C319 ; bootpack的启动
176 0000C319
177 0000C319 66 BB 00280000 MOV EBX,BOTPAK
178 0000C31F 67 66 8B 4B 10 MOV ECX,[EBX+16]
179 0000C324 66 83 C1 03 ADD ECX,3 ; ECX += 3;
180 0000C328 66 C1 E9 02 SHR ECX,2 ; ECX /= 4;
181 0000C32C 74 10 JZ skip ;
182 0000C32E 67 66 8B 73 14 MOV ESI,[EBX+20] ;
183 0000C333 66 01 DE ADD ESI,EBX
184 0000C336 67 66 8B 7B 0C MOV EDI,[EBX+12] ;
185 0000C33B E8 0014 CALL memcpy
186 0000C33E skip:
187 0000C33E 67 66 8B 63 0C MOV ESP,[EBX+12] ; 栈的初始值
188 0000C343 66 EA 0000001B 0010 JMP DWORD 2*8:0x0000001b ; 带段号的,这里的二号就是注程序的
189 0000C34B
190 0000C34B waitkbdout:
191 0000C34B E4 64 IN AL,0x64
192 0000C34D 24 02 AND AL,0x02
193 0000C34F 75 FA JNZ waitkbdout ;
194 0000C351 C3 RET
195 0000C352
196 0000C352
197 0000C352 ; 内存拷贝命令
198 0000C352 memcpy:
199 0000C352 67 66 8B 06 MOV EAX,[ESI]
200 0000C356 66 83 C6 04 ADD ESI,4
201 0000C35A 67 66 89 07 MOV [EDI],EAX
202 0000C35E 66 83 C7 04 ADD EDI,4
203 0000C362 66 83 E9 01 SUB ECX,1
204 0000C366 75 EA JNZ memcpy ; 减法结果不是0,则循环拷贝
205 0000C368 C3 RET
206 0000C369
207 0000C369 00 00 00 00 00 00 00 ALIGNB 16
208 0000C370 GDT0:
209 0000C370 00 00 00 00 00 00 00 00 RESB 8 ; NULL selector
210 0000C378 FFFF 0000 9200 00CF DW 0xffff,0x0000,0x9200,0x00cf ; 可读写的段(segment)32bit
211 0000C380 FFFF 0000 9A28 0047 DW 0xffff,0x0000,0x9a28,0x0047 ; 可读写的段(segment)32bit(bootpack)
212 0000C388
213 0000C388 0000 DW 0
214 0000C38A GDTR0:
215 0000C38A 0017 DW 8*3-1
216 0000C38C 0000C370 DD GDT0
217 0000C390
218 0000C390 ALIGNB 16
219 0000C390 bootpack: