第五章 编写主引导扇区代码

本章的思路是,在本机上上写一段代码(这些代码的意义是往显存中写一些数据)--》编译成bin文件--》写入到vhd硬盘的引导扇区(即第一扇区,见第四章详述)--》开机从硬盘启动,从而执行了自己写的这段代码。

重点是理解引导扇区的代码是如何被CPU执行的,下面还会分析。

书中源码如下:

         ;注释必须以分号“;”开始, 在源程序编译阶段,编译器将忽略所有注释
		 ;代码清单5-1 
         ;文件名:c05_mbr.asm
         ;文件说明:硬盘主引导扇区代码
         ;创建日期:2011-3-31 21:15 
		 ;功能: 标号 number 处的汇编地址是 0x012E=302
         
         mov ax,0xb800                 ;指向缓存的逻辑地址
         mov es,ax

         ;以下显示字符串"Label offset:"
         mov byte [es:0x00],'L'
         mov byte [es:0x01],0x07		;颜色设置
         mov byte [es:0x02],'a'
         mov byte [es:0x03],0x07
         mov byte [es:0x04],'b'
         mov byte [es:0x05],0x07
         mov byte [es:0x06],'e'
         mov byte [es:0x07],0x07
         mov byte [es:0x08],'l'
         mov byte [es:0x09],0x07
         mov byte [es:0x0a],' '
         mov byte [es:0x0b],0x07
         mov byte [es:0x0c],"o"
         mov byte [es:0x0d],0x07
         mov byte [es:0x0e],'f'
         mov byte [es:0x0f],0x07
         mov byte [es:0x10],'f'
         mov byte [es:0x11],0x07
         mov byte [es:0x12],'s'
         mov byte [es:0x13],0x07
         mov byte [es:0x14],'e'
         mov byte [es:0x15],0x07
         mov byte [es:0x16],'t'
         mov byte [es:0x17],0x07
         mov byte [es:0x18],':'
         mov byte [es:0x19],0x07

         mov ax,number                 ;取得标号number的偏移地址
         mov bx,10

         ;设置数据段的基地址
         mov cx,cs
         mov ds,cx

         ;求个位上的数字
         mov dx,0
         div bx
         mov [0x7c00+number+0x00],dl   ;保存个位上的数字, dx存的是余数,实际上是存在了dl上

         ;求十位上的数字
         xor dx,dx
         div bx
         mov [0x7c00+number+0x01],dl   ;保存十位上的数字

         ;求百位上的数字
         xor dx,dx
         div bx
         mov [0x7c00+number+0x02],dl   ;保存百位上的数字

         ;求千位上的数字
         xor dx,dx
         div bx
         mov [0x7c00+number+0x03],dl   ;保存千位上的数字

         ;求万位上的数字 
         xor dx,dx
         div bx
         mov [0x7c00+number+0x04],dl   ;保存万位上的数字

         ;以下用十进制显示标号的偏移地址
         mov al,[0x7c00+number+0x04]
         add al,0x30
         mov [es:0x1a],al
         mov byte [es:0x1b],0x04
         
         mov al,[0x7c00+number+0x03]
         add al,0x30
         mov [es:0x1c],al
         mov byte [es:0x1d],0x04
         
         mov al,[0x7c00+number+0x02]
         add al,0x30
         mov [es:0x1e],al
         mov byte [es:0x1f],0x04

         mov al,[0x7c00+number+0x01]
         add al,0x30
         mov [es:0x20],al
         mov byte [es:0x21],0x04

         mov al,[0x7c00+number+0x00]
         add al,0x30
         mov [es:0x22],al
         mov byte [es:0x23],0x04
         
         mov byte [es:0x24],'D'
         mov byte [es:0x25],0x07
          
   infi: jmp near infi                 ;无限循环,否则cs:ip会指向102行而引起错误
      
  number db 0,0,0,0,0
  
  times 203 db 0
            db 0x55,0xaa


实验结果:



过程分析:

1)

处理器加电或者复位之后,如果硬盘是首选的启动设备,那么, ROM-BIOS将试图读取硬盘的 0 0 1 扇区。传统上,这就是主引导扇区(Main Boot Sector,MBR)。

2)

读取的主引导扇区数据有 512 字节, ROM-BIOS 程序将它加载到逻辑地址0x0000:0x7c00处,也就是物理地址0x07c00 处,然后判断它是否有效。

3)

一个有效的主引导扇区,其最后两字节应当是 0x550xAAROM-BIOS 程序首先检测这两个标志,如果主引导扇区有效, 则以一个段间转移指令jmp 0x0000:0x7c00 跳到那里继续执行, 此时cs:ip=0x0000:0x7c00。

4)

执行自己写的代码(具体见代码注释)。




















  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值