码迷,mamicode.com
首页 > 其他好文 > 详细

编写主引导扇区代码

时间:2015-08-06 22:31:24      阅读:238      评论:0      收藏:0      [点我收藏+]

标签:注释   汇编   

一、

读取的主引导扇区数据有512字节,ROM-BIOS程序将它加载到逻辑地址0x0000:0x7c00处。

一个有效的主引导扇区,最后两个字节应当是 0x55 和 0xAA。


二、注释

汇编注释


三、在屏幕上显示文字

  显卡和显存

计算机在加电自检之后会初始化到80X25的文本模式。 0xB8000--0xBFFFF这段物理地址是留给显卡的。

  初始化段寄存器

<span style="white-space: pre;">	</span><span style="font-size:18px;">mov ax,0xb800</span>
<span style="font-size:18px; white-space: pre;">	</span><span style="font-size:18px;">mov es,ax</span>


Intel处理器不允许将一个立即数传送到段寄存器。

  显存的访问和ASCII码

屏幕上的每个字符都对应着显存中的两个连续字节,前一个是字符的ASCII码,后面是字符的显示属性。

字符的显示属性分两部分:低4位定义的是前景色,高4位定义的是背景色。色彩由RGB决定,K是闪烁,I是高亮。

KRGBIRGB

  显示字符

<span style="font-size:14px; white-space: pre;">	</span><span style="font-size:18px;">mov byte [es:0x00],'L'</span>

等效于

<span style="white-space:pre">	</span><span style="font-size:18px;">mov byte [es:0x00],0x4c</span>

四、源代码

         
         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   ;保存个位上的数字

         ;求十位上的数字
         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                 ;无限循环
      
  number db 0,0,0,0,0
  
  times 203 db 0
            db 0x55,0xaa


版权声明:本文为博主原创文章,未经博主允许不得转载。

编写主引导扇区代码

标签:注释   汇编   

原文地址:http://blog.csdn.net/qq_20480611/article/details/47322341

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!