MBR的详细分析
; ; 为直观起见,下面的地址按实际运行时的地址给出。 ; 0000:061B~0000:062B:对分区表进行初步检验,一旦检测到某分区表项状态字节大于等于80h,就通过(当 ; 然,在此之前如果检测到某项分区表的状态字节小于80h,就转错误处理。当然,如果四个分区项的状态字节 ; 都为零,主引导记录就会调用BIOS-ROM的INT 18h,显示"PRESS A KEY TO REBOOT"信息等待你的操作。 0000:061B BEBE07 MOV SI,07BE ;SI指向第一个分区表项,这时CX=0 0000:061E B104 MOV CL,04 ;分区表共四个表项 0000:0620 382C CMP [SI],CH ; 0000:0622 7C09 JL 062D ;大于等于80h转[注意JL指令:(SF xor OF)=1则转] 0000:0624 7515 JNZ 063B ;不为0则[SI]一定小于80h,只能转错误处理了! 0000:0626 83C610 ADD SI,+10 ;为零则检查下一表项 0000:0629 E2F5 LOOP 0620 ;检查下一表项 0000:062B CD18 INT 18 ;四表项的状态字节都为0,则系统只好调用INT 18h了! ; ; 0000:062D~0000:0639:检查剩余的分区表项——状态字节必须为零,否则显示错误信息“分区表无效”然 ; 后当机!拜托,微软搞错没有,怎么用中文提示信息?真TM傻得可爱! ; 这里还有个小BUG,前面放行原则是只要状态字节大于等于80h,那么如果这个字节是诸如A0h、E5h之类数值 ; 呢?嘿嘿,这个引导记录统统认为是有效的可引导分区了! 0000:062D 8B14 MOV DX,[SI] ;为读分区引导记录做准备:磁头号→DH,驱动器号→DL 0000:062F 8BEE MOV BP,SI ;SI→BP,保存可引导分区表项的指针 ; 0000:0631 83C610 ADD SI,+10 ;其余的分区表项还要检查检查的 0000:0634 49 DEC CX ; 0000:0635 7416 JZ 064D ;CX=0则检查顺利通过,转继续 0000:0637 382C CMP [SI],CH ; 0000:0639 74F6 JZ 0631 ;为零,是合法表项,再查下一表项 ; ; 0000:063B~0000:064B:执行错误处理——报告错误信息后当机 0000:063B BE1007 MOV SI,0710 ;错误信息字符串偏移+1→SI
|