首页
社区
课程
招聘
[旧帖] [原创]汇编实现双启动(代码+注解) 0.00雪花
发表于: 2010-4-9 02:58 2061

[旧帖] [原创]汇编实现双启动(代码+注解) 0.00雪花

2010-4-9 02:58
2061
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 用于得到键盘的输入  qq:616403903   交流汇编经验

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
恩,写的不错,正在学汇编,收藏了
2010-4-9 08:08
0
雪    币: 43
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
写的不错,正在学汇编,收藏了
2010-4-9 08:53
0
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
还在学基础的,这个太深的一点
2010-4-9 10:09
0
游客
登录 | 注册 方可回帖
返回
//