📄 00000009.htm
字号:
<HTML><HEAD> <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>发信人: reden (鱼 ~ 君子律己以利人), 信区: Linux <BR>标 题: Boot Manager of FreeBSD <BR>发信站: BBS 水木清华站 (Tue Oct 6 20:23:03 1998) WWW-POST <BR> <BR>发信人: arbiter (仲裁者), 信区: FreeBSD
<BR>标 题: Boot Manager
<BR>发信站: 华南网木棉站 (Tue Oct 6 13:17:35 1998), 转信
<BR>
<BR>发信人: Satan (魔头), 信区: BestOS
<BR>标 题: Boot Manager
<BR>发信站: 安徽大学逍遥津站 (Mon Aug 3 16:13:55 1998), 转信
<BR>
<BR>FreeBSD自带的Boot Manager虽然不如Linux的lilo功能强大,但它只需按一个键就可以
<BR>引导,界面直观,所以还是比较适合一些懒人的:-),但是有一个问题就是你如果重新安装
<BR>win95什么的把MBR覆盖掉后,会发现不知道怎么再把Booteasy装上了,sysinstall也不行 <BR>!
<BR>
<BR>为此把Booteasy反汇编出来分析了一把,不料却被这段小代码吸引住了,真是....真是
<BR>太精彩了,使我忍不住要把它贴出来奉献gei大家,让大家一起来享受编程世界的美妙乐趣 <BR>.
<BR>小小的四百多个字节,可以gei你一个简单明了的启动选择界面,它能记住你上次的选择,
<BR>能够认得十四种操作系统,而且能够启动第二硬盘!唯一遗憾的是,它的尺寸放不下起动
<BR>扩展分区的代码.但这也不能阻止它成为一个优秀的Boot Manager.
<BR>
<BR>Booteasy的源码附在后面,安装它你需要在dos下用msas6.11编译一下,也许masm5.x也
<BR>可以,但不要用tasm,因为它自做聪明地在代码里插入了一些nop,而我们的代码里面使
<BR>用了绝对地址来寻址一些变量.然后你需要把生成的exe文件拷到linux或bsd下,用dd
<BR>把其中的代码过虑出来.代码在exe文件里的位置可以通过exe文件头查到,如果你不熟
<BR>悉,可以用十六进制编辑器查找33C0,这是程序的第一条语句.
<BR>
<BR>假如你生成了booteasy.exe,代码在偏移200h处
<BR>dd if=booteasy.exe of=mbr bs=1 count=446 skip=512
<BR>生成的mbr就是booteasy的代码,然后把它放到硬盘的第一个扇区
<BR>dd if=mbr of=/dev/wd0 bs=1 count=446
<BR>在做这步之前最好把你的MBR做个备份
<BR>dd if=/dev/wd0 of=mbr.old bs=1 count=512
<BR>
<BR>重新启动机器,看看是不是好用了?如果你的机器起不来了,可不要来砍我哦~~~
<BR>我自己试的是没问题的,有空再做个简单的安装程序吧.
<BR>本来还想把这个程序用AT&T的汇编语法改写,以便能用as编译,可是Unix在X86机上起
<BR>家就是386,所以编译出的代码多了好些前缀(66h,67h),找了半天也没有找到生成8086
<BR>代码的选项,只得做罢.如果有人能把它完善一下让它可以完全在dos下安装,也是造
<BR>福众生的好事一件:-)
<BR>
<BR>><I>--------------------------------cut here------------------------------<
</I><BR>CODE SEGMENT PUBLIC 'CODE'
<BR> ASSUME CS:CODE,DS:CODE,ES:CODE,SS:CODE
<BR>
<BR>START:
<BR> XOR AX,AX ; 开机boot,booteasy被装入0:7c00h处
<BR> MOV ES,AX
<BR> MOV DS,AX
<BR> MOV SS,AX
<BR> MOV SP,07C00H
<BR> CLD
<BR> MOV SI,SP
<BR> MOV DI,0600H ; 将自身移到0:600h处
<BR> MOV CX,0100H
<BR> DB 0F2H,0A5H ; repnz movsw
<BR> ; 不知道为什么masm6.11不许在movsw前
<BR> ; 加repnz前缀,不过用rep应该也可以...
<BR> DB 0EAH ; jmp 0000:0600h
<BR> DB 060H,06H ; 万恶的鬼子不许我们用直接远跳转,但是人民
<BR> DB 00H,00H ; 的创造力是无穷的...
<BR>_011B:
<BR> MOV DX,BP
<BR> POP AX
<BR> DB 0A2H ; mov [0748],al
<BR> DB 48H,07H ; #$<A HREF="mailto:@$^&$&#$@!这种直接寻址也不可以...
">@$^&$&#$@!这种直接寻址也不可以...
</A> <BR> CMP AL,035H
<BR> JZ _0141 ; 从第二硬盘启动(用"另一个硬盘"比较恰当)
<BR> MOV AH,010H
<BR> MUL AH ; ax=3?0h,?=1,2,3,4
<BR> ADD AX,04AEH ; ax=所选分区表项起始地址
<BR> XCHG SI,AX
<BR> TEST BYTE PTR [SI+04],0FFH ; 无效分区?不知道有什么含义
<BR> JZ _0171
<BR> MOV BYTE PTR [SI],080H ; 激活该分区
<BR> CALL _0213 ; 写回
<BR> MOV DH,[SI+01] ; 分区起始头
<BR> MOV CX,[SI+02] ; 分区起始扇区和起始柱面
<BR> JMP _0149
<BR>_0141:
<BR> CALL _0213
<BR> MOV CX,0001 ; 扇区号从1而不是从0开始
<BR> XOR DL,CL ; dl=80,执行后为81;dl=81,执行后为80
<BR>_0149:
<BR> MOV BX,07C00H ; 装入地址
<BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -