Chinaunix首页 | 论坛 | 博客
  • 博客访问: 113547
  • 博文数量: 23
  • 博客积分: 975
  • 博客等级: 准尉
  • 技术积分: 262
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-19 00:54
文章分类
文章存档

2011年(2)

2010年(3)

2008年(18)

我的朋友

分类:

2008-07-19 02:26:23

一、           实验目的

熟悉系统引导的过程,加强汇编程序设计能力。

二、           实验内容

用汇编语言,设计一个多重引导程序,安装在一个装有多个操作系统的硬盘里,在计算机启动的时候,能让用户选择要启动的系统。

三、           具体实现

系统启动的时候,自动把磁盘主引导扇区载入内存的7c00h处,然后检测该扇区末尾是否55AA,如果是,则跳转到7c00h处执行。

主引导区代码的任务:把操作系统所在分区的引导扇区载入7c00h,并跳转到该处执行。

引导程序被载入7c00h处后,首先把自身复制到600h处(该段地址为空闲内存),然后跳转到“搬家”之后的位置执行。然后,获取用户要启动的分区号(14),查找分区表,把该分区的第一扇区载入7c00h处。最后,跳转到7c00h处执行。即完成了引导。

引导程序编译成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,7c00h

       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

      

;读分区引导扇到7c00h

       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,7c00h

       mov cx,[si+2]

       mov dh,[si+1]

       mov dl,80h

       int    13h

      

;跳到7c00h执行,引导结束jmp 7c00h

       db    0eah

       dw   7c00h,0

 

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调用)。

文件:附件.rar
大小:1KB
下载:下载
阅读(1593) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~