7C00 33C0 XOR AX,AX ;AX=0
7C02 8ED0 MOV SS,AX ;SS=0
7C04 BC007C MOV SP,7C00 ;SP=7C00
7C07 FB STI ;中断允许
7C08 50 PUSH AX
7C09 07 POP ES ;ES=0
7C0A 50 PUSH AX
7C0B 1F POP DS ;DS=0
7C0C FC CLD ;字符串操作方向:从低到高
7C0D BE1B7C MOV SI,7C1B ;源地址 DS:SI=0000:7C1B
7C10 BF1B06 MOV DI,061B ;目的地址 ES:DI=0000:061B
7C13 50 PUSH AX
7C14 57 PUSH DI
7C15 B9E501 MOV CX,01E5 ;共1E5h个字节
7C18 F3 REPZ
7C19 A4 MOVSB ;将MBR从0000:7C00移动到0000:0600
7C1A CB RETF ;跳转到0000:061B处
PARTITION_SEARCH_LOOP:
061B BEBE07 MOV SI,07BE ;SI指向分区表的开始
061E B104 MOV CL,04 ;循环4次,硬盘最多4个主分区
0620 382C CMP [SI],CH
0622 7C09 JL ACTIVE_PARTITION_FOUND
;分区是活动分区
0624 7515 JNZ INVALID_PARTITION_TABLE
;无效的分区表
0626 83C610 ADD SI,+10 ;每个分区占用16个字节,SI指向下一个分区
0629 E2F5 LOOP PARTITION_SEARCH_LOOP
062B CD18 INT 18 ;分区表搜索完,无活动分区,INT 18h=DISKLESS BOOT HOOK
ACTIVE_PARTITON_FOUND:
062D 8B14 MOV DX,[SI] ;下面的搜索保证只存在一个活动分区,否则分区表无效
062F 8BEE MOV BP,SI ;找到的引导分区标志和开始地址分别存入DX,BP
ONLY_ONE_ACTIVE_PARTITON_SEARCH_LOOP:
0631 83C610 ADD SI,+10
0634 49 DEC CX
0635 7416 JZ GOOD_PARTITION_TABLE ;搜索完毕,剩下的分区中无活动分区,分区表正常
0637 382C CMP [SI],CH
0639 74F6 JZ ONLY_ONE_ACTIVE_PARTITON_SEARCH_LOOP ;如果还有活动分区则继续向下执行
INVALID_PARTITION_TABLE:
063B BE1007 MOV SI,0710 ;SI指向要显示的错误信息处
HANG_MACHINE_LOOP:
063E 4E DEC SI
DISPLAY_ERROR_MESSAGE_LOOP:
063F AC LODSB
0640 3C00 CMP AL,00
0642 74FA JZ HANG_MACHINE_LOOP
;到字符串尾时进入死循环,停止运行
0644 BB0700 MOV BX,0007
0647 B40E MOV AH,0E
0649 CD10 INT 10 ;显示错误信息
DISPLAY_ERROR_MESSAGE_LOOP_ALIAS:
064B EBF2 JMP DISPLAY_ERROR_MESSAGE_LOOP
GOOD_PARTITION_TABLE:
064D 894625 MOV [BP+25],AX
;tmpvar=BP+25处清零,作为临时变量
0650 96 XCHG SI,AX ;SI=0
0651 8A4604 MOV AL,[BP+04]
;读分区类型入AL