⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 00000003.htm

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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -