您的位置:首页 > 编程语言

双启动详细实现(代码+注解) 转载于汇编网

2010-10-23 11:22 330 查看
我自己写的双启动详细实现(代码+注解)

A)=========安装双系统:(用Virtual PC)============
步骤:
1先装1个系统
2 把D盘转为主(PQ中设),同时把这个设为主(我是在FDSIK下设的D为A主,在DOS下显示时C:就是显的原来D盘了)
3 安装第2个系统
4 运行自己写的代码

B)============代码写的步骤============
1,先把原系统中MBR,复制到不用扇区
2,再写在写MBR时(注意后4个字节.)选择并跳出 0:7C00送行.好在选择完成后重载原来MBR
3,对于重载的原来MBR 对要启的分区表 头设80H,其它设0.一份在1BE 80H 1CE 0H, 一份在1BE 0H 1CE 80H
4,重启原MBR,根据选择加入80H不同的备份扇。重回0:7C00

C)============代码及解说:============
CODES SEGMENT
ASSUME CS:CODES
;--------安装在扇区的程序,即自己实际运行MBR内容
org 600h;因为要重载引导区,防被盖和便于转出7C00后能正常读取数据
SETUP_START:
mov ax,0
mov ds,ax
mov es,ax
mov si,7c00h
mov di,0600h
mov cx,offset SETUP_END-offset SETUP_START
cld
rep movsb ;将本程序内容从 7C00H 转到 600H
mov bx,offset SETUP_BEGIN
jmp bx ;跳转到复制后到600H后的
msg1 db 'welcome'
SETUP_BEGIN:
mov bp,offset msg1
mov cx,7
mov dx,0
mov bx,0fh
mov al,0
mov ah,13h
int 10h ;显示提示

SETUP_LOOP:
mov ah,0
int 16h
mov ah,0ah
mov bh,0
mov cx,1
int 10h
cmp al,'0'
je p0
cmp al,'1'
je p1
cmp al,'2'
je p2
;3,4分区和1,2格式基本一样,可能很少用哪么多种系统吧,反正我只用2个
jmp SETUP_LOOP ;读取键盘 如果是0 转到原MBR 1转到 1分区为主 2转到2为主
;如果不是0,1,2则回到SETUP_LOOP 继续读键盘
p0: ;读取原MBR
mov bx,7c00h
mov ah,02h
mov al,01h
mov ch,0h
mov cl,3h
mov dh,0h
mov dl,80h
int 13h
jmp bx

p1: ;读取1分区为主扇区入7C00H,即1BE处为80H的分区,要把基它处设为0
mov bx,7c00h ;其它是指的这里的内容 7dbeh 7dceh 7ddeh 7deeh
mov ah,02h
mov al,01h
mov ch,0h
mov cl,4h
mov dh,0h
mov dl,80h
int 13h
jmp bx
p2: ;和P1基本一样
mov bx,7c00h
mov ah,02h
mov al,01h
mov ch,0h
mov cl,5h
mov dh,0h
mov dl,80h
int 13h
jmp bx

SETUP_END:
;--------安装程序-------------
myFan db 512 dup(?);空出1扇 200H 即512 DB来转MBR内容
START:
;**********************************
;移动引导分区
mov ax,cs
mov ds,ax
mov es,ax
mov bx,offset myFan ;设定ES 和 BX为读写扇区用

mov ah,02h
mov al,01h
mov ch,0h
mov cl,1h
mov dh,0h
mov dl,80h
int 13h ;读原来的MBR

mov ah,03h
mov al,01h
mov ch,0h
mov cl,3h
mov dh,0h
mov dl,80h
int 13h ;原MBR写到03H处

mov si,offset SETUP_START
mov di,offset myFan
mov cx,offset SETUP_END-offset SETUP_START
cld
rep movsb ;复制自己将写在MBR数据到自己定义的空间myFan中

mov bx,offset myFan

mov ah,03h
mov al,01h
mov ch,0h
mov cl,1h
mov dh,0h
mov dl,80h
int 13h ;在MBR处写自定义的内容
;;---------修改1扇区为主引导
mov ax,cs
mov ds,ax
mov es,ax
mov bx,offset myFan
mov ah,02h
mov al,01h
mov ch,0h
mov cl,3h
mov dh,0h
mov dl,80h
int 13h ;又和读次存入扇区3处的原MBR

mov di,1beh
mov myFan[di],80h
mov di,1ceh
mov myFan[di],0h
mov di,1deh
mov myFan[di],0h
mov di,1eeh ;这是设1分区为80H其它为0
mov myFan[di],0h ;设置数据;7dbeh 7dceh 7ddeh 7deeh 1个为80H 其它为0

mov ah,03h
mov al,01h
mov ch,0h
mov cl,4h
mov dh,0h
mov dl,80h
int 13h ;引导1分区写在4中
;;---------修改2扇区为主引导同上
mov ax,cs
mov ds,ax
mov es,ax
mov bx,offset myFan
mov ah,02h
mov al,01h
mov ch,0h
mov cl,3h
mov dh,0h
mov dl,80h
int 13h

mov di,1beh
mov myFan[di],0h
mov di,1ceh
mov myFan[di],80h
mov di,1deh
mov myFan[di],0h
mov di,1eeh
mov myFan[di],0h

mov ah,03h
mov al,01h
mov ch,0h
mov cl,5h
mov dh,0h
mov dl,80h
int 13h
;------安装程序结束
MOV AH,4CH
INT 21H
CODES ENDS
END START

D)============王爽汇编书外必需被充的内容:============
1、硬盘的主引导扇区(隐含扇区)

该扇区主要由两个部分组成:主引导程序和分区信息表。分配如下表:

地址偏移硬盘0道(柱)、0头、1扇区

0000H―――主引导记录及一些数字0

01BEH―――第一分区表(16字节)

01CEH―――第二分区表(16字节)

01DEH―――第三分区表(16字节)

0IEEH―――第四分区表(16字节)

01FEH__55H

01FFH―――AAH

硬盘主引导扇区内容由FDISK.COM创建。整个硬盘空间最多划分为4个分区,可提供4个操作系统共享,每个操作系统占一个分区,如整个硬盘只提供一个操作系统使用,则其它三个分区的长度即所占扇区数为0。在IBM-PC、长城系列及其兼容机上,可通过FDISK.COM来指定各分区的大小和起止的柱面号、扇区号等;分区信息表就是用来保存这些分区信息的。分区信息表由4项组成,每项占16个字节。每一分区信息的各字节内容如下述(第几分区表)(16字节) :

第1字节:为引导标志。如该字节内容为0,表示系统加电或复位自检时,不从这个分区引导操作系统。如果该字节值为80H,则表示系统加电冷启动或热启动时,从这个分区中引导操作系统。在系统冷、热启动时,引导过程会检查分区信息表所有4项中的这个引导标志。DOS的FDISK.COM命令可以置某分区中这个字节值为80H,而置其余分区的这个字节值为0。

第2字节:为本分区起始磁头号。面

第3字节:为本分区起始的扇区号。在这个字节中只有低6位是表示扇区号,而高2位则表示起始柱面号的最高2位。

第4字节:为本分区起始的柱面号。 道

第5字节:为本分区操作系统代码。DOS3.0以下版本,该字节值为01,3.0以上版本该字节值为04,5.0以上版本为06等,当该字节值为
02、03时,则表示该分区的操作系统为XENIX。该字节值为63,表示该分区的操作系统为NIX。该字节值为65,表示该分区的
操作系统为NetWare。

第6字节:本分区结束的磁头号。

第7字节:本分区结束扇区号。其中高2位表示结束柱面号的高2位。

第8字节:本分区结束柱面号。

第9-12字节:在本分区之前已经使用掉的扇区数。

第13-16字节:本分区所使用的扇区数。

硬盘的主引导程序在硬盘的第一扇区中,它是各操作系统的共同部分。它的作用就是查看分区信息表中的4个分区引导标志,当某一分区的引导标志为80H时,主引导程序就把这一分区的第一个扇区(逻辑0扇区)读到内存0000:7C00H处,并从那儿开始执行。主引导程序是属于隐含扇区的,只能用以下两种方法进行读写操作:

E)============还要注意的和我想为个精============
还要了解CMOS下
INT 10H 用于显示我的们字符,INT 13H用于读写扇区 ,
int 16h 用于得到键盘的输入
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: