📄 00000003.htm
字号:
<HTML><HEAD> <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>发信人: starw (孤星), 信区: Linux <BR>标 题: MBR代码分析(二) <BR>发信站: BBS 水木清华站 (Sun Nov 21 16:51:35 1999) WWW-POST <BR> <BR>;MBR.ASM
<BR>; MASM MBR
<BR>; LINK MBR
<BR>; EXE2BIN MBR
<BR>
<BR> .MODEL tiny
<BR> .CODE
<BR>
<BR>;设置寄存器及堆栈值
<BR>
<BR> org 0
<BR>Head:
<BR>Start:
<BR> cli
<BR> xor ax,ax
<BR> mov ss,ax
<BR> mov sp,7C00H ;ss:sp=0:7C00H
<BR> mov si,sp
<BR> push ax
<BR> pop es
<BR> push ax
<BR> pop ds ;es=ds=0
<BR> sti
<BR>
<BR>;将程序代码由0:7C00H移动到0:0600H处
<BR>
<BR> cld
<BR> mov di,600H
<BR> mov cx,100H ;100H Words=512 Bytes,即一个扇区大小
<BR> repne movsw
<BR> db 0EAH ;这个是FAR JUMP的机器码
<BR> dw offset Continue+600H, 0000H ;这个是跳转目的地址,即0:061DH
<BR>
<BR>;搜索可引导分区
<BR>
<BR>Continue:
<BR>
<BR> mov si,600H+1BEH ;si指向分区表
<BR> mov bl,4 ;四个分区
<BR>
<BR>FindBoot:
<BR>
<BR> cmp byte ptr[si],80H
<BR> je SaveRec ;读扇区位置
<BR> cmp byte ptr[si],0
<BR> jne Invaild ;无效分区
<BR> add si,10H
<BR> dec bl
<BR> jnz FindBoot
<BR> int 18H ;进入ROM BASIC
<BR>
<BR>;读取引导分区的扇区,柱面号
<BR>
<BR>SaveRec:
<BR>
<BR> mov dx,[si]
<BR> mov cx,[si+2]
<BR> mov bp,si
<BR>
<BR>;检查其余分区表
<BR>
<BR>FindNext:
<BR>
<BR> add si,10H
<BR> dec bl
<BR> jz SetRead
<BR> cmp byte ptr[si],0 ;是否存在非法分区
<BR> je FindNext
<BR>
<BR>Invaild:
<BR>
<BR> mov si,offset ErrMsg1+600H
<BR>
<BR>;字符串输出子程序
<BR>
<BR>PrintStr:
<BR>
<BR> lodsb
<BR> cmp al,0
<BR> je DeadLock
<BR> push si
<BR> mov bx,7
<BR> mov ah,0EH ;输出字符
<BR> int 10H
<BR> pop si
<BR> jmp short PrintStr ;下一字符
<BR>
<BR>DeadLock:
<BR>
<BR> jmp short DeadLock ;无穷循环,也可以写成jmp $
<BR>
<BR>;读引导扇区
<BR>
<BR>SetRead:
<BR>
<BR> mov di,5 ;读取次数
<BR>
<BR>ReadBoot:
<BR>
<BR> mov bx,7C00H
<BR> mov ax,201H
<BR> push di
<BR> int 13H ;cx,dx已经在SaveRec处得到
<BR> pop di
<BR> jnc GoBoot ;成功则启动
<BR> xor ax,ax
<BR> int 13H ;reset驱动器,然后再读取
<BR> dec di
<BR> jnz ReadBoot
<BR>
<BR> mov si,offset ErrMsg2+600H
<BR> jmp short PrintStr 失败输出信息,并进入无穷循环
<BR>
<BR>;检查读入的引导扇区
<BR>
<BR>GoBoot:
<BR>
<BR> mov si,offsetErrMsg3+600H
<BR> mov di,7C00H+1FEH
<BR> cmp word ptr[di],0AA55H
<BR> jne PrintStr ;非AA55标志则输出错误信息
<BR> mov si,bp ;si指向可启动分区
<BR> db 0EAH,0,7CH,0,0 ;跳转至0:7C00H
<BR>
<BR>ErrMsg1 db 'Invaild partition table',0
<BR>ErrMsg2 db 'Error loading operating system',0
<BR>ErrMsg3 db 'Missing operating system',0
<BR>
<BR>Tail:
<BR>
<BR>FillNum equ 1BEH-(Tail-Head) ;计算填0数目
<BR> db FillNum dup(0)
<BR>
<BR>;四个分区表项数据,跟分区情况有关,详细含义另解
<BR>
<BR>PartTable db 80H,1,1,0,4,4,0D1H,2,11H,0,0,0,0FEH,0FFH,0,0
<BR> db 0,0,0C1H,3,5,4,0D1H,0FEH,0FFH,0FFH,0,0,0ACH,53H,0,0
<BR> db 20H dup(0)
<BR>
<BR>ID dw 0AA55H
<BR>
<BR> end start
<BR>
<BR>;如果开始试用org 600H,那么访问数据时就不必加上600H,如mov si,offset <BR>ErrMsg2+600H
<BR>;可写为mov si,offset ErrMsg2,这时就不能用exe2bin得到数据,必须试用debug
<BR>;debug mbr.exe
<BR>;-nmbr.bin
<BR>;-rcx 200
<BR>;-wcs:600
<BR>;-q
<BR> <BR> <BR>-- <BR>※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 202.117.22.34] <BR><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -