系统引导 - MBR引导代码研究(3)

上接 系统引导 - MBR引导代码研究(2)


readDBR函数:

seg000:7C9B                   ; 读取[bp]指向的DPT描述的磁盘的DBR
seg000:7C9B                    readDBR proc near             
seg000:7C9B BF 05 00          mov     di, 5
seg000:7C9E 8A 56 00          mov     dl, [bp+0]
seg000:7CA1 B4 08             mov     ah, 8
seg000:7CA3 CD 13             int      13h                   ; DISK - DISK - GET CURRENT DRIVE PARAMETERS (XT,AT,XT286,CONV,PS)
seg000:7CA3                                                 ; DL = drive number
seg000:7CA3                                                 ; Return: CF set on error, AH = status code, BL = drive type
seg000:7CA3                                                 ; DL = number of consecutive drives
seg000:7CA3                                                 ; DH = maximum value for head number, ES:DI -> drive parameter
seg000:7CA3                                                 ; CX =        ---CH--- ---CL---
seg000:7CA3                                                 ; cylinder : 76543210 98
seg000:7CA3                                                 ; sector    :             543210
seg000:7CA5 72 23             jb      short read1Sector     ; 将该分DPT描述的分区读入到7C00处
seg000:7CA7 8A C1             mov     al, cl                ; 取每个磁头的磁道数
seg000:7CA9 24 3F             and     al, 3Fh
seg000:7CAB 98                cbw
seg000:7CAC 8A DE             mov     bl, dh                ; 磁头数
seg000:7CAE 8A FC             mov     bh, ah
seg000:7CB0 43                inc     bx
seg000:7CB1 F7 E3             mul     bx                    ; 求磁道总数
seg000:7CB3 8B D1             mov     dx, cx
seg000:7CB5 86 D6             xchg    dl, dh                ; 取每个磁道的扇区数
seg000:7CB7 B1 06             mov     cl, 6
seg000:7CB9 D2 EE             shr     dh, cl
seg000:7CBB 42                inc     dx
seg000:7CBC F7 E2             mul     dx
seg000:7CBE 39 56 0A          cmp      [bp+0Ah], dx          ; 求总的扇区数
seg000:7CC1 77 23             ja      short extMode         ; 与DPT中保存的扇区总数比较
seg000:7CC3 72 05             jb      short read1Sector     ; 将该分DPT描述的分区读入到7C00处
seg000:7CC5 39 46 08          cmp      [bp+8], ax
seg000:7CC8 73 1C             jnb     short extMode         ; 大硬盘,使用扩展功能
seg000:7CCA                    read1Sector:    
seg000:7CCA B8 01 02          mov     ax, 201h  ; 将该分DPT描述的分区读入到7C00处
seg000:7CCD BB 00 7C          mov     bx, 7C00h
seg000:7CD0 8B 4E 02          mov     cx, [bp+2]
seg000:7CD3 8B 56 00          mov     dx, [bp+0]
seg000:7CD6 CD 13             int      13h                   ; DISK - READ SECTORS INTO MEMORY
seg000:7CD6                                                 ; AL = number of sectors to read, CH = track, CL = sector
seg000:7CD6                                                 ; DH = head, DL = drive, ES:BX -> buffer to fill
seg000:7CD6                                                 ; Return: CF set on error, AH = status, AL = number of sectors read
seg000:7CD8 73 51             jnb     short return
seg000:7CDA 4F                dec     di
seg000:7CDB 74 4E             jz      short return
seg000:7CDD 32 E4             xor     ah, ah
seg000:7CDF 8A 56 00          mov     dl, [bp+0]
seg000:7CE2 CD 13             int      13h                   ; DISK - RESET DISK SYSTEM
seg000:7CE2                                                 ; DL = drive (if bit 7 is set both hard disks and floppy disks reset)
seg000:7CE4 EB E4             jmp     short read1Sector     ; 将该分DPT描述的分区读入到7C00处
seg000:7CE6                   ; ---------------------------------------------------------------------------
seg000:7CE6                    extMode:                      
seg000:7CE6 8A 56 00          mov     dl, [bp+0]            ; 大硬盘,使用扩展功能
seg000:7CE9 60                pusha
seg000:7CEA BB AA 55          mov     bx, 55AAh
seg000:7CED B4 41             mov     ah, 41h ; 'A'
seg000:7CEF CD 13             int      13h                   ; DISK -
seg000:7CF1 72 36             jb      short exit            ; 不支持13的扩展功能
seg000:7CF3 81 FB 55 AA       cmp     bx, 0AA55h
seg000:7CF7 75 30             jnz     short exit            ; 读取失败,CF=1
seg000:7CF9 F6 C1 01          test    cl, 1
seg000:7CFC 74 2B             jz      short exit            ; 读取失败,CF=1
seg000:7CFE 61                popa
seg000:7CFF                    loc_7CFF:                     
seg000:7CFF 60                pusha                         ; 用扩展方式读
seg000:7D00 6A 00             push     0
seg000:7D02 6A 00             push     0
seg000:7D04 FF 76 0A          push    word ptr [bp+0Ah]
seg000:7D07 FF 76 08          push    word ptr [bp+8]
seg000:7D0A 6A 00             push     0
seg000:7D0C 68 00 7C          push     7C00h
seg000:7D0F 6A 01             push     1
seg000:7D11 6A 10             push     10h
seg000:7D13 B4 42             mov     ah, 42h ; 'B'
seg000:7D15 8B F4             mov     si, sp
seg000:7D17 CD 13             int      13h                   ; 扩展读
seg000:7D17                                                 ; 入口:DL = 驱动器号 DS:SI = (DAP)
seg000:7D17                                                 ; 出口:CF = 0, AH = 0 成功
seg000:7D17                                                 ;        CF = 1, AH = 错误码
seg000:7D19 61                popa
seg000:7D1A 61                popa
seg000:7D1B 73 0E             jnb     short return
seg000:7D1D 4F                dec     di                    ; 读取失败
seg000:7D1E 74 0B             jz      short return
seg000:7D20 32 E4             xor     ah, ah                ; 复位磁盘再读一次
seg000:7D22 8A 56 00          mov     dl, [bp+0]
seg000:7D25 CD 13             int      13h                   ; DISK - RESET DISK SYSTEM
seg000:7D25                                                 ; DL = drive (if bit 7 is set both hard disks and floppy disks reset)
seg000:7D27 EB D6             jmp     short loc_7CFF        ; 用扩展方式读
seg000:7D29                   ; ---------------------------------------------------------------------------
seg000:7D29                    exit:                         
seg000:7D29 61                popa                          ; 读取失败,CF=1
seg000:7D2A F9                stc
seg000:7D2B                    return:                       
seg000:7D2B C3                retn
seg000:7D2B                    readDBR endp

1.这个函数的作用是将BP指向的DPT所描述的分区的DBR(……)读取并加载到7C00开始的内存里。


MBR引导代码的研究至此结束,下次该是DBR了……


转载自:http://hi.baidu.com/kun_g/home


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值