硬盘主引导分区表(MBR)反汇编分析

MBR(Main Boot Record)主引导记录区位于硬盘0磁道0柱面1扇区。

BEGIN:
0000:7C00 FA   CLI    关中断
0000:7C01 33C0   XOR AX,AX   设置堆栈段地址为0000
0000:7C03 8ED0   MOV SS,AX
0000:7C05 BC007C MOV SP,7C00   设置堆栈指针为7C00
0000:7C08 8BF4   MOV SI,SP   si=7c00
0000:7C0A 50   PUSH AX  
0000:7C0B 07   POP ES   ES=0000
0000:7C0C 50   PUSH AX  
0000:7C0D 1F   POP DS   DS=0000
0000:7C0E FB   STI    开中断
0000:7C0F FC   CLD    清除方向
0000:7C10 BF0006 MOV DL,O600   DI=0600
0000:7C13 B90001 MOV CX,0100   移动256个word(512bytes)
0000:7C16 F2   REPNZ    把MBR从7c00移动到0600
0000:7C17 A5   MOVSW
0000:7C18 EA1D060000 JMP 0000:061D 跳至0000:061d,及程序的下一条指令
NEW_LOCATION:      AT 0000:0600
0000:061D BEBE07 MOV SI,07BE   指向第一个分区表的首地址
0000:0620 B304   MOV BL,04   分区个数为4
SEARCH_LOOP1:      查找活动分区的代码段
0000:0622 803C80 CMP BYTEPTR[SI],80 是否为活动分区?
0000:0625 740E   JZ FOUND_ACTIVE 是,转,继续查看其它分区
0000:0627 803C00 CMP BYTE PTR[SI],00 是否为非活动分区
0000:062A 751C   JNZ NOT_ACTIVE 不是,跳转,分区表出现异常
0000:062C 83C610 ADD SI,+10   增量表指针加16
0000:062F FECB   DEC BL   减少计数
0000:0631 75EF   JNZ SEARCH_LOOP1 继续检查四个分区中的其他分区
0000:0633 CD18   INT 18   没有找到活动分区,跳至ROM BASIC
FOUND_ACTIVE:      找到了活动分区
0000:0635 8B14   MOV DX,[SI]   保存磁头号、驱动器号到DH、DL
0000:0637 8B4C02 MOV CX,[SI+02] 保存磁道号、扇区号到CH、CL
0000:063A 8BEE   MOV BP,SI   保存当前分区首地址到BP
SEARCH_LOOP2:      继续查看分区保证只有一个活动分区,且其他分区正常
0000:063C 83C610 ADD SI,+10   增量表指针加16
0000:063F FECB   DEC BL   减少计数
0000:0641 741A   JZ READ_BOOT 如果所有分区检查结束,开始引导
0000:0643 803C00 CMP BYTE PTR[SI],00 是否为非活动分区
0000:0646 74F4   JZ SEARCH_LOOP2 是,循环
NOT_ACTIVE:      有不止一个活动分区或有分区异常
0000:0648 BE8B06 MOV SI,068B   SI指向字符串“Invailid partition table”
DISPLAY_MSG:      显示消息循环
0000:064B AC   LODSB    取得消息的字符
0000:064C 3C00   CMP AL,00   判断消息的结尾
0000:064E 740B   JZ HANG   显示错误信息后挂起
0000:0650 56   PUSH SI   保存SI
0000:0651 BB0700 MOV BX,0007   BL=字符颜色,BH=页号
0000:0654 B40E   MOV AH,0E   显示一个字符
0000:0656 CD10   INT 10
0000:0658 5E   POP SI   恢复SI
0000:0659 EBF0   JMP DISPLAY_MSG 循环显示剩下的字符
HANG:       挂起系统
0000:065B JMP HANG     死循环挂起
READ_BOOT:      读活动分区的数据
0000:065D BF0500 MOV DI,005   设置尝试的次数
INT13RTRY:      int13的重试循环
0000:0660 BB0007C MOV BX,7C00   设置读盘缓冲区
0000:0663 B80102 MOV AX,0201   读入一个扇区
0000:0666 57   PUSH DI   保存DI
0000:0667 CD13   INT 13   把扇区读入0000:7c00
0000:0669 SF   POP DI   恢复DI
0000:066A 730C   JNB INT13OK   读扇区操作成功 CF=0
0000:066C 33C0   XOR AX,AX   读盘操作失败,硬盘复位
0000:066E CD13   INT 13
0000:0670 4F   DEC DI   尝试次数减一
0000:0671 75ED   JNZ INT13RTRY 剩余次数不为零,继续尝试
0000:0673 BEA306 MOV SI,06A3   si指向字符串“error loading operation system”
0000:0676 EBD3   JMP DISPLAY_MSG 显示出错信息,并挂起
INT13OK:      int13 出错
0000:0678 BEC2O6 MOV SI,06C2   si指向字符串“missing operation system”
0000:067B BFFE7D MOV DI,7DFE   指向分区结束标志
0000:067E 813D55AA CMP WORD PTR[DI],AA55 标志是否正确
0000:0682 75C7   JNZ DISPLAY_MSG 不正确,显示出错信息,挂起
0000:0684 8BF5   MOV SI,BP   恢复可引导分区首地址与SI
0000:0686 EA007C0000 JMP 0000:7C00 一切正常,转分区引导记录执行

你可能感兴趣的:(c,汇编,活动,search,System,byte)