编写主引导扇区代码

来源:互联网 发布:套利程序化交易软件 编辑:程序博客网 时间:2024/05/16 13:55

一、

读取的主引导扇区数据有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


1 0
原创粉丝点击