来着日本天才的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,把启动去填满