这是写于2007年的日志,现发布出来,供有需要的参考。
目的:通过修改MBR代码,实现在电脑开机的时候,选择不同硬盘分区上的操作系统。
实现方法:需要一个安装程序,该安装程序实现提取硬盘分区信息,并将操作系统信息写入到启动代码里,然后将修改后的代码写入到硬盘的0磁头0磁道2到3扇区内。
对MBR的修改(下面代码不包含对MBR的修改):探测到Ctrl或alt或shit按下时,将自定义选择与启动代码从0磁头0磁道2到3扇区里读出,加载到内存0000:7C00处执行。
以下为自定义的启动代码(0磁头0磁道2到3扇区):加载之后,将自身从0000:7C00处搬到0000:0600处运行,根据选择的启动分区的参数,将启动分区的第一扇区读取到0000:7C00处,然后跳转到0000:7C00处启动相应的操作系统。
如果是linux操作系统的话,需要将linux操作系统的启动管理器安装到某个分区上,而不能安装到MBR(该启动管理器安装后,会破坏原始的MBR,会导致linux启动不了)。
[780]启动条数(1-N)(通过安装程序,将启动分区信息与提示信息写入到这里。)
[781]当前显示行
[782]当前所选择的行
[783]字串显示颜色
[900]欢迎信息起始地址
电脑[940]操作说明起始地址
[990]读盘错误提示起始地址
:7C00 FC CLD
:7C01 BE007C MOV SI,7C00
:7C04 BF0006 MOV DI,0600
:7C07 B90004 MOV CX,0400
:7C0A F3 REPZ
:7C0B A4 MOVSB (搬动自身到0000:0600处)
:7C0C E9008A JMP 060F(跳转到新地址运行)
:060F B81200 MOV AX,0012
:0612 CD10 INT 10(将显示更改到采色模式)
:0614 BE0009 MOV SI,0900
:0617 B002 MOV AL,02
:0619 A28307 MOV [0783],AL
:061C E8F700 CALL 0716
:061F B001 MOV AL,01
:0621 A28107 MOV [0781],AL
:0624 A28207 MOV [0782],AL
:0627 E8A600 CALL 06D0
:062A BA0119 MOV DX,1901
:062D B402 MOV AH,02
:062F B700 MOV BH,00
:0631 CD10 INT 10
:0633 BE4009 MOV SI,0940
:0636 B00E MOV AL,0E
:0638 A28307 MOV [0783],AL
:063B E8D800 CALL 0716
:063E B400 MOV AH,00
:0640 CD16 INT 16
:0642 80FC48 CMP AH,48#up
:0645 740C JZ 0653
:0647 80FC50 CMP AH,50#down
:064A 741D JZ 0669
:064C 80FC1C CMP AH,1C#enter
:064F 7431 JZ 0682
:0651 EBEB JMP 063E
:0653 A08207 MOV AL,[0782]
:0656 3C01 CMP AL,01
:0658 7404 JZ 065E
:065A FEC8 DEC AL
:065C EB03 JMP 0661
:065E A08007 MOV AL,[0780]
:0661 A28207 MOV [0782],AL
:0664 E86900 CALL 06D0
:0667 EBD5 JMP 063E
:0669 A08207 MOV AL,[0782]
:066C 8A1E8007 MOV BL,[0780]
:0670 38D8 CMP AL,BL
:0672 7404 JZ 0678
:0674 FEC0 INC AL
:0676 EB02 JMP 067A
:0678 B001 MOV AL,01
:067A A28207 MOV [0782],AL
:067D E85000 CALL 06D0
:0680 EBBC JMP 063E
:0682 A08207 MOV AL,[0782]
:0685 FEC8 DEC AL
:0687 B110 MOV CL,10
:0689 F6E1 MUL CL
:068B 05000A ADD AX,0A00
:068E 89C6 MOV SI,AX
:0690 B442 MOV AH,42
:0692 B280 MOV DL,80
:0694 CD13 INT 13
:0696 80FC00 CMP AH,00
:0699 7402 JZ 069D
:069B 7503 JNZ 06A0
:069D E96075 JMP 7C00
:06A0 BA0114 MOV DX,1401
:06A3 B402 MOV AH,02
:06A5 B700 MOV BH,00
:06A7 CD10 INT 10
:06A9 BE9009 MOV SI,0990
:06AC B004 MOV AL,04
:06AE A28307 MOV [0783],AL
:06B1 E86200 CALL 0716
:06B4 EB88 JMP 063E
:06D0 A08107 MOV AL,[0781]
:06D3 3A068007 CMP AL,[0780]
:06D7 7606 JBE 06DF
:06D9 B001 MOV AL,01
:06DB A28107 MOV [0781],AL
:06DE C3 RET
:06DF 0401 ADD AL,01#第2行
:06E1 88C6 MOV DH,AL
:06E3 B220 MOV DL,20
:06E5 B402 MOV AH,02
:06E7 B700 MOV BH,00
:06E9 CD10 INT 10
:06EB A08107 MOV AL,[0781]
:06EE 3A068207 CMP AL,[0782]
:06F2 7504 JNZ 06F8
:06F4 B305 MOV BL,05
:06F6 EB02 JMP 06FA
:06F8 B308 MOV BL,08
:06FA 881E8307 MOV [0783],BL
:06FE FEC8 DEC AL
:0700 B110 MOV CL,10
:0702 F6E1 MUL CL
:0704 059007 ADD AX,0790
:0707 89C6 MOV SI,AX
:0709 E80A00 CALL 0716
:070C A08107 MOV AL,[0781]
:070F FEC0 INC AL
:0711 A28107 MOV [0781],AL
:0714 EBBA JMP 06D0
:0716 AC LODSB
:0717 3C00 CMP AL,00
:0719 740A JZ 0725
:071B B40E MOV AH,0E
:071D 8A1E8307 MOV BL,[0783]
:0721 CD10 INT 10
:0723 EBF1 JMP 0716
:0725 C3 RET