制作IPL

名称

开始字节长度内容参考值
BS_jmpBOOT03一个短跳转指令jmp Label_07c00H nop
BS_OEMName38厂商名'QingFeng'
BPB_BytesPerSec112每扇区字节数(Bytes/Sector)0x200
BPB_SecPerClus131每簇扇区数(Sector/Cluster)0x1
BPB_ResvdSecCnt142Boot记录占用多少扇区ox1
BPB_NumFATs161共有多少FAT表0x2
BPB_RootEntCnt172根目录区文件最大数0xE0
BPB_TotSec16192扇区总数0xB40[2*80*18]
BPB_Media211介质描述符0xF0
BPB_FATSz16222每个FAT表所占扇区数0x9
BPB_SecPerTrk242每磁道扇区数(Sector/track)0x12
BPB_NumHeads262磁头数(面数)0x2
BPB_HiddSec284隐藏扇区数0
BPB_TotSec32324如果BPB_TotSec16=0,则由这里给出扇区数0
BS_DrvNum361INT 13H的驱动器号0
BS_Reserved1371保留,未使用0
BS_BootSig381扩展引导标记(29h)0x29
BS_VolID394卷序列号0
BS_VolLab4311卷标'QingFeng'
BS_FileSysType548文件系统类型'FAT12'
引导代码及其他内容62448引导代码及其他数据引导代码(剩余空间用0填充)
结束标志0xAA555102第510字节为0x55,第511字节为0xAA0xAA55

                      FAT12软盘引导扇区格式表格

    把软盘上的第1个扇区(C0-H0-S1 即柱面0,磁头0,扇区1)称为引导扇区,也要知道启动区(引导扇区)内容在内存中的装载地址:0x00007c00-0x00007dff(512字节)。

  1 CYLS    EQU        10                
  2 
  3         ORG        0x7c00            ; 指明程序在内存中的装载地址
  4 
  5 ; 标准FAT12格式的软盘
  6 
  7         JMP        entry            ;短跳转指令 2B
  8         DB        0x90            ;作用等于NOP 1B
  9         DB        "HARIBOTE"        ;厂商名 8B    
 10         DW        512                ;每个扇区的大小(必须是512) 2B
 11         DB        1                ;簇的大小(必须是一个扇区) 1B
 12         DW        1                ;Boot记录占用多少扇区 2B
 13         DB        2                ;FAT表的个数 1B
 14         DW        224                ;根目录区文件最大数 2B
 15         DW        2880            ;扇区总数(即该磁盘大小,必须是2880扇区) 2B
 16         DB        0xf0            ;介质描述符,磁盘的种类(必须是0xf0) 1B
 17         DW        9                ;FAT的长度(每个FAT表所占扇区数,必须是9) 2B
 18         DW        18                ;每磁道扇区数(1个磁道有几个扇区,必须为18) 2B
 19         DW        2                ;磁头数 2B
 20         DD        0                ;隐藏扇区数 4B
 21         DD        2880            ;重写一次磁盘的大小 4B
 22         DB        0,0,0x29        ;INT 13H的驱动器号,保留未使用和扩展引用标记 2B
 23         DD        0xffffffff        ;卷序列号 4B
 24         DB        "HARIBOTEOS "    ;卷标 2B
 25         DB        "FAT12   "        ;文件系统类型 2B
 26         RESB    18                ;空18字节 18B
 27 
 28 ; 程序主体,即引导代码(剩余空间用0填充)
 29 ; 到这里是0x7c50
 30 entry:
 31         MOV        AX,0            ;寄存器初始化
 32         MOV        SS,AX
 33         MOV        SP,0x7c00
 34         MOV        DS,AX
 35 
 36 
 37 ; 读磁盘,第二个扇区读到内存0x0820处
 38         MOV        AX,0x0820
 39         MOV        ES,AX
 40         MOV        CH,0            ; 柱面0
 41         MOV        DH,0            ; 磁头0
 42         MOV        CL,2            ; 扇区2
 43 readloop:
 44         MOV        SI,0            ; 失败次数记录的寄存器
 45 retry:
 46         MOV        AH,0x02            ; AH=0x02 (读盘)
 47         MOV        AL,1            ; AL=处理对象的扇区
 48         MOV        BX,0            ; ES:BX=缓冲地址
 49         MOV        DL,0x00            ; DL=驱动器号
 50         INT        0x13            ; 调用BIOS0x13函数
 51         JNC        next            ; 没出错跳转到next
 52         ADD        SI,1            
 53         CMP        SI,5            
 54         JAE        error            ; SI >= 5 出错次数大于5,跳转
 55         MOV        AH,0x00            ; AH=0x00 (重置驱动器)
 56         MOV        DL,0x00            ; DL=驱动器号
 57         INT        0x13            ; 调用函数0x13
 58         JMP        retry
 59         
 60 ; C0-H0-S2 到C9-H1-S18的读取(读取10个柱面,启动区在C0-H0-S1,所以不读取)
 61 next:
 62         MOV        AX,ES            ; 内存地址后移512字节(1个扇区),ES2*16-ES1*16=0x200(512字节),ES2-ES1=0x20,所以让ES内的值增加0x20;
 63         ADD        AX,0x0020
 64         MOV        ES,AX            ; ADD ES,0x020 
 65         ADD        CL,1            
 66         CMP        CL,18            
 67         JBE        readloop        ; CL <= 18 
 68         MOV        CL,1
 69         ADD        DH,1
 70         CMP        DH,2
 71         JB        readloop        ; DH < 2 
 72         MOV        DH,0
 73         ADD        CH,1
 74         CMP        CH,CYLS
 75         JB        readloop        ; CH < CYLS
 76 
 77 
 78         MOV        [0x0ff0],CH        ; 把CYLS的值写入内存地址0x0ff0中
 79         JMP        0xc200             ; 跳转到文件内容的内存地址
 80 
 81 ; 以下全部是错误处理代码
 82 error:
 83         MOV        SI,msg
 84 putloop:
 85         MOV        AL,[SI]
 86         ADD        SI,1            ; SI寄存器内容(内存地址)+1
 87         CMP        AL,0
 88         JE        fin
 89         MOV        AH,0x0e            
 90         MOV        BX,15            
 91         INT        0x10            
 92         JMP        putloop
 93 fin:
 94         HLT                        
 95         JMP        fin                
 96 msg:
 97         DB        0x0a, 0x0a        
 98         DB        "load error"
 99         DB        0x0a            
100         DB        0
101 
102         RESB    0x7dfe-$        ;510字节前剩余填充0
103 
104         DB        0x55, 0xaa        ;第510字节为0x55,第511字节为0xAA

 

转载于:https://www.cnblogs.com/leod/p/4350385.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值