Skip to content

Commit 77fef23

Browse files
committed
day03
1 parent 55f8b93 commit 77fef23

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

102 files changed

+1925
-93
lines changed

day03/01/Makefile

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,43 @@
11
# 添加默认命令
2+
TOOL_PATH := ../../z_tools/
3+
NASK := wine $(TOOL_PATH)nask.exe
4+
5+
6+
7+
8+
9+
os-img = helloos.img
10+
os-sys = haribote.sys
11+
212
default :
313
make img
4-
bootloader : ipl.nas Makefile
5-
nasm -o bootloader -l ipl.lst ipl.nas
6-
helloos.img : bootloader
7-
dd if=bootloader of=helloos.img bs=1
8-
dd if=/dev/zero of=helloos.img bs=512 seek=1 count=2879
14+
ipl.bin : ipl.nas Makefile
15+
# $(NASK) ipl.nas ipl.bin ipl.lst
16+
nasm -o ipl.bin -l ipl.lst ipl.nas
17+
18+
$(os-img) : ipl.bin haribote.sys
19+
dd if=ipl.bin of=$(os-img) bs=1
20+
dd if=/dev/zero of=$(os-img) bs=512 seek=1 count=2879
21+
sudo mount -o loop $(os-img) /mnt
22+
sudo cp $(os-sys) /mnt
23+
sudo umount /mnt
24+
25+
$(os-sys) : haribote.nas
26+
# $(NASK) haribote.nas $(os-sys) haribote.lst
27+
nasm -o $(os-sys) -l haribote.lst haribote.nas
28+
929
img :
10-
make -r helloos.img
11-
run : helloos.img
12-
qemu-system-i386 helloos.img
30+
make -r $(os-img)
31+
32+
run : $(os-img)
33+
qemu-system-i386 -fda $(os-img)
34+
1335
clean :
14-
rm ipl.lst
15-
rm bootloader
36+
rm -f ipl.lst
37+
rm -f ipl.bin
38+
rm -f haribote.lst
39+
rm $(os-sys)
40+
1641
src :
1742
make clean
18-
rm *.img
43+
rm -f *.img

day03/01/haribote.lst

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
1 ;haribote-os
2+
2 ;TAB = 4
3+
3
4+
4 ; 有关BOOT_INFO
5+
5 ORG 0xc400 ; 程序装载到内存的位置
6+
6
7+
7 00000000 B013 mov AL,0x13 ;VGA 显卡,320x200x8 位彩色
8+
8 00000002 B400 mov AH,0x00
9+
9 00000004 CD10 INT 0x10
10+
10
11+
11 fin:
12+
12 HTL
13+
12 ****************** warning: label alone on a line without a colon might be in error
14+
13 00000006 EBFE JMP fin

day03/01/haribote.nas

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
;haribote-os
2+
;TAB = 4
3+
4+
; 有关BOOT_INFO
5+
ORG 0xc400 ; 程序装载到内存的位置
6+
7+
mov AL,0x13 ;VGA 显卡,320x200x8 位彩色
8+
mov AH,0x00
9+
INT 0x10
10+
11+
fin:
12+
HTL
13+
JMP fin

day03/01/haribote.nas.bak

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
;haribote-os
2+
;TAB = 4
3+
4+
; 有关BOOT_INFO
5+
CYLS EQU 0x0ff0 ; 设定启动区
6+
LEDS EQU 0x0ff1
7+
VMODE EQU 0x0ff2 ; 关于颜色数目的信息,颜色的位数
8+
SCRNX EQU 0x0ff4 ; 分辨率的X
9+
SCRNY EQU 0x0ff6 ; 分辨率的Y
10+
VRAM EQU 0x0ff8 ; 图像缓冲区的开始地址
11+
12+
ORG 0xc400 ; 程序装载到内存的位置
13+
14+
mov AL,0x13 ;VGA 显卡,320x200x8 位彩色
15+
mov AH,0x00
16+
INT 0x10
17+
mov BYTE [VMODE], 8 ; 记录画面模式
18+
mov WORD [SCRNX], 320;
19+
mov WORD [SCRNY], 200;
20+
mov DWORD [VRAM], 0x000a0000
21+
22+
; 用BIOS取得键盘上各种欧冠你LED指示灯的状态
23+
mov AH, 0x02
24+
INT 0x16 ; KeyBoard BIOS
25+
mov [LEDS], AL
26+
27+
fin:
28+
HTL
29+
JMP fin

day03/01/haribote.sys

8 Bytes
Binary file not shown.

day03/01/helloos.img

0 Bytes
Binary file not shown.
Binary file not shown.

day03/01/ipl.lst

Lines changed: 115 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,80 +1,120 @@
11
1 ; hello-os
22
2 ; TAB=4
33
3
4-
4 ORG 0x7c00 ;指明程序的装载地址
4+
4 CYLS EQU 10 ;声明常数,EQU 相当与C中的#define
55
5
6-
6 ; 以下的记述用于标准FAT12格式的软盘
6+
6 ORG 0x7c00 ;指明程序的装载地址
77
7
8-
8 00000000 EB4E JMP entry
9-
9 00000002 90 db 0x90
10-
10 00000003 48415249424F5445 db "HARIBOTE"
11-
11 0000000B 0002 dw 512
12-
12 0000000D 01 db 1
13-
13 0000000E 0100 dw 1
14-
14 00000010 02 db 2
15-
15 00000011 E000 dw 224
16-
16 00000013 400B dw 2880
17-
17 00000015 F0 db 0xf0
18-
18 00000016 0900 dw 9
19-
19 00000018 1200 dw 18
20-
20 0000001A 0200 dw 2
21-
21 0000001C 00000000 dd 0
22-
22 00000020 400B0000 dd 2880
23-
23 00000024 000029 db 0,0,0x29
24-
24 00000027 FFFFFFFF dd 0xffffffff
25-
25 0000002B 48415249424F54454F- db "HARIBOTEOS "
26-
25 00000034 5320
27-
26 00000036 4641543332202020 db "FAT32 "
28-
27 0000003E <res 00000012> resb 18
29-
27 ****************** warning: uninitialized space declared in .text section: zeroing
30-
28
31-
29 ;程序核心
32-
30 entry: ;0x7c50
33-
31 00000050 B80000 mov AX,0 ; 初始化寄存器
34-
32 00000053 8ED0 mov SS,AX
35-
33 00000055 BC007C mov SP,0x7c00
36-
34 00000058 8ED8 mov DS,AX
37-
35 0000005A 8EC0 mov ES,AX
38-
36
39-
37 ; 读盘时的参数
40-
38 0000005C B82008 mov AX,0x0820
41-
39 0000005F 8EC0 mov ES,AX
42-
40 00000061 B500 mov CH,0 ; 柱面 0
43-
41 00000063 B600 mov DH,0 ; 磁头 0
44-
42 00000065 B102 mov CL,2 ; 扇区 2
45-
43
46-
44 ; 读盘指令
47-
45 00000067 B402 mov AH,0x02 ; 读盘指令
48-
46 00000069 B001 mov AL,1 ; 1个扇区
49-
47 0000006B BB0000 mov BX,0
50-
48 0000006E B200 mov DL,0x00 ; A驱动器
51-
49 00000070 CD13 INT 0x13 ; 调用磁盘BIOS
52-
50 00000072 7200 JC error
53-
51
54-
52 error:
55-
53 00000074 BE[8B00] mov SI,msg
56-
54
57-
55 putloop:
58-
56 00000077 8A04 mov AL,[SI]
59-
57 00000079 83C601 add SI,1
60-
58 0000007C 3C00 cmp AL,0
61-
59
62-
60 0000007E 7408 je fin
63-
61 00000080 B40E mov AH,0x0e ;显示一个文字
64-
62 00000082 B300 mov BL,0 ;指定字符颜色
65-
63 00000084 CD10 INT 0x10 ;调用显卡BIOS
66-
64 00000086 EBEF jmp putloop
67-
65
68-
66 fin:
69-
67 00000088 F4 HLT ;让CPU停止,等待指令
70-
68 00000089 EBFD jmp fin
71-
69
72-
70 msg: ;0x7c74
73-
71 0000008B 0A0A DB 0x0a, 0x0a ;换行两次
74-
72 0000008D 48454C4C4F2C20776F- db "HELLO, world"
75-
72 00000096 726C64
76-
73 00000099 0A db 0x0a ;换行
77-
74 0000009A 00 db 0
78-
75
79-
76 0000009B 00<rept> times 510-($-$$) db 0
80-
77 000001FE 55AA db 0x55,0xaa
8+
8 ; 以下的记述用于标准FAT12格式的软盘
9+
9
10+
10 00000000 EB4E JMP entry
11+
11 00000002 90 db 0x90
12+
12 00000003 48415249424F5445 db "HARIBOTE"
13+
13 0000000B 0002 dw 512
14+
14 0000000D 01 db 1
15+
15 0000000E 0100 dw 1
16+
16 00000010 02 db 2
17+
17 00000011 E000 dw 224
18+
18 00000013 400B dw 2880
19+
19 00000015 F0 db 0xf0
20+
20 00000016 0900 dw 9
21+
21 00000018 1200 dw 18
22+
22 0000001A 0200 dw 2
23+
23 0000001C 00000000 dd 0
24+
24 00000020 400B0000 dd 2880
25+
25 00000024 000029 db 0,0,0x29
26+
26 00000027 FFFFFFFF dd 0xffffffff
27+
27 0000002B 48415249424F54454F- db "HARIBOTEOS "
28+
27 00000034 5320
29+
28 00000036 4641543332202020 db "FAT32 "
30+
29 0000003E <res 00000012> resb 18
31+
29 ****************** warning: uninitialized space declared in .text section: zeroing
32+
30
33+
31 ;程序核心
34+
32 entry: ;0x7c50
35+
33 00000050 B80000 mov AX,0 ; 初始化寄存器
36+
34 00000053 8ED0 mov SS,AX
37+
35 00000055 8ED8 mov DS,AX
38+
36 00000057 8EC0 mov ES,AX
39+
37
40+
38 00000059 BC007C mov SP,0x7c00
41+
39
42+
40 ; 读盘时的参数
43+
41 0000005C B82008 mov AX,0x0820
44+
42 0000005F 8EC0 mov ES,AX
45+
43 00000061 B500 mov CH,0 ; 柱面 0
46+
44 00000063 B600 mov DH,0 ; 磁头 0
47+
45 00000065 B102 mov CL,2 ; 扇区 2
48+
46
49+
47 readloop:
50+
48 ;试错
51+
49 00000067 BE0000 mov SI,0 ; 记录失败次数的寄存器
52+
50
53+
51 retry:
54+
52 ; 读盘指令
55+
53 0000006A B402 mov AH,0x02 ; 读盘指令
56+
54 0000006C B001 mov AL,1 ; 1个扇区
57+
55 0000006E BB0000 mov BX,0
58+
56 00000071 B200 mov DL,0x00 ; A驱动器
59+
57 00000073 CD13 INT 0x13 ; 调用磁盘BIOS
60+
58 00000075 7310 JNC next ; Jump if not carry,进位符为0,即没有出错,跳转
61+
59 00000077 83C601 ADD SI,1
62+
60 0000007A 83FE05 CMP SI,5
63+
61 0000007D 7332 JAE error ; JAE : Jump if above or equal
64+
62
65+
63 ; 复位磁盘状态
66+
64 0000007F B400 mov AH,0x00
67+
65 00000081 B200 mov DL,0x00 ; A 驱动器
68+
66 00000083 CD13 INT 0x13
69+
67 00000085 EBE3 JMP retry
70+
68
71+
69 next:
72+
70 00000087 8CC0 mov AX,ES ; 把内存地址后移0x20,读取下一个扇区,需要ES+0x20 ,CL +1
73+
71 00000089 83C020 add AX,0x0020
74+
72 0000008C 8EC0 mov ES,AX ; 没有Add ES,0x20指令,需要借助AX实现
75+
73 0000008E 80C101 add CL,1 ; 向CL中+1
76+
74 00000091 80F912 CMP CL,18 ; CL 扇区
77+
75 00000094 76D1 JBE readloop ; CL<=18 跳转至readloop
78+
76 00000096 B101 mov CL,1
79+
77 00000098 80C601 add DH,1
80+
78 0000009B 80FE02 cmp DH,2 ;读取磁头2
81+
79 0000009E 72C7 JB readloop ; 如果<2 ,则跳转至readloop
82+
80 000000A0 B600 mov DH,0 ; 读取新的柱面了
83+
81 000000A2 80C501 add CH,1 ; CH 柱面
84+
82 000000A5 80FD0A cmp CH,CYLS
85+
83 000000A8 72BD JB readloop ; 如果CH < CYLS,则跳转到readloop
86+
84
87+
85 000000AA 882EF00F mov [0x0ff0],CH ; 将CYLS的值写入到0x0ff0这个地址,4080
88+
86
89+
87 ;将程序跳到系统文件的开始出,具体的查看笔记文件
90+
88 000000AE E9(00C4) JMP 0xc400
91+
89
92+
90
93+
91
94+
92 error:
95+
93 000000B1 BE[C900] mov SI,msg
96+
94
97+
95 putloop:
98+
96 000000B4 8A04 mov AL,[SI]
99+
97 000000B6 83C601 add SI,1
100+
98 000000B9 3C00 cmp AL,0
101+
99
102+
100 000000BB 7409 je fin
103+
101 000000BD B40E mov AH,0x0e ;显示一个文字
104+
102 000000BF BB0F00 mov BX,15 ;指定字符颜色
105+
103 000000C2 CD10 INT 0x10 ;调用显卡BIOS
106+
104 000000C4 EBEE jmp putloop
107+
105
108+
106 fin:
109+
107 000000C6 F4 HLT ;让CPU停止,等待指令
110+
108 000000C7 EBFD jmp fin
111+
109
112+
110 msg: ;0x7c74
113+
111 000000C9 0A0A DB 0x0a, 0x0a ;换行两次
114+
112 000000CB 6C6F6164206572726F- db "load error"
115+
112 000000D4 72
116+
113 000000D5 0A db 0x0a ;换行
117+
114 000000D6 00 db 0
118+
115
119+
116 000000D7 00<rept> times 510-($-$$) db 0
120+
117 000001FE 55AA db 0x55,0xaa

0 commit comments

Comments
 (0)