分类:
2008-07-19 02:26:23
一、
实验目的
熟悉系统引导的过程,加强汇编程序设计能力。
二、
实验内容
用汇编语言,设计一个多重引导程序,安装在一个装有多个操作系统的硬盘里,在计算机启动的时候,能让用户选择要启动的系统。
三、
具体实现
系统启动的时候,自动把磁盘主引导扇区载入内存的
主引导区代码的任务:把操作系统所在分区的引导扇区载入
引导程序被载入
引导程序编译成exe二进制可执行格式后,要截取代码部分,另存为一个文件,供安装程序读取。这步工作,用UltraEdit32(十六进制编辑器)实现。
安装程序的任务:把引导程序写入到磁盘的主引导扇区。具体为,通过BIOS中断,读出主引导扇区,然后读入引导程序,修改内存中的主引导扇区,最后,写入主引导扇区。
引导程序源代码:
bootdat segment
org 600h ;为了编译得到正确的标号和变量地址
assume cs:bootdat,es:bootdat
cli
xor ax,ax
mov es,ax
mov ds,ax
;自身复制到600h处
mov di,600h
mov si,
mov cx,200h
sti
cld
rep movsb
;跳到转移后的代码执行jmp next
db 0eah
dw $+4,0
next:
;显示信息
lea bp,msg
mov cx,msglen
mov dx,0
mov bh,0
mov al,1
mov bl,7
mov ah,13h
int 10h
;获取用户想要启动的分区号
mov ah,0
int 16h
;读分区引导扇到
mov si,7beh ;600h+1beh=7beh
cmp al,"1"
jz part1
cmp al,"2"
jz part2
cmp al,"3"
jz part3
cmp al,"4"
jz part4
jmp part1
part4:
add si,10h
part3:
add si,10h
part2:
add si,10h
part1:
mov ax,0201h
mov bx,
mov cx,[si+2]
mov dh,[si+1]
mov dl,80h
int 13h
;跳到
db 0eah
dw
msg db "This
is MyBoot program,Ha Ha Ha !",0ah,0dh,"Enter the number of partition
you want to boot(1-4):"
msglen equ $-msg
bootdat ends
end
安装程序源代码:
setup segment
org 100h
assume cs:setup,ds:setup,es:setup,ss:setup
main proc near
;读MBR
readmbr:
mov ah,2
mov al,1
lea bx,buff
mov cx,1
mov dx,80h
int 13h
jc readmbr
;打开文件
openfile:
mov ah,3dh
mov al,0
lea dx,fn
int 21h
jc openfile
mov fnn,ax
;读文件
readfile:
mov ah,3fh
mov cx,446
lea dx,buff
mov bx,fnn
int 21h
jc readfile
;写MBR
writembr:
mov ah,3
mov al,1
lea bx,buff
mov cx,1
mov dx,80h
int 13h
jc writembr
int 20h
fn db "myboot.dat",0
fnn dw ?
buff db 512
dup(?)
main endp
setup ends
end main
四、
实验总结
通过实验,提高了对系统引导的了解,提高了汇编程序设计的能力。程序通过虚拟机VMwre调试通过。此外,程序还有一些不足的地方:
1. 缺乏对分区引导扇区的检测,用户选择的启动分区,可能不是可引导扇区,我的程序,没有对这个进行检测,用户错误的选择,会造成死机。
2. 用户界面不够友好,没有高亮提示,没有倒计时默认启动。
五、
附件
源代码\myboot.asm:引导程序源代码,setup.asm安装程序源代码。
可执行文件\setup.com安装程序(写MBR),myboot.dat引导程序二进制文件(被setup调用)。
|