|
1 | 1 | 1 ; hello-os |
2 | 2 | 2 ; TAB=4 |
3 | 3 | 3 |
4 | | - 4 ORG 0x7c00 ;指明程序的装载地址 |
| 4 | + 4 CYLS EQU 10 ;声明常数,EQU 相当与C中的#define |
5 | 5 | 5 |
6 | | - 6 ; 以下的记述用于标准FAT12格式的软盘 |
| 6 | + 6 ORG 0x7c00 ;指明程序的装载地址 |
7 | 7 | 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