您的位置:首页 > 编程语言

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

2011-08-31 17:18 218 查看
上接系统引导 - 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: