操作系统开发小试-实模式引导程序

+-----------------------------------------------+
操作系统开发小试-实模式引导程序
+-----------------------------------------------+
+
+1.开发语言:ASM(工具:NASM)
+2.虚拟环境:Virtual PC
+3.应用工具:WinHex Ver11.2
======================================================
org 0x07c00
这条语句将该引导程序装入绝对地址0x7c00处.该引导程序被编译后有512字节,被加载到磁盘的第1扇区中(引导扇区).当PC启动的时候被BIOS加载到地址0x7c00处.

mov ax, cs
mov ds, ax
mov es, ax

这三条语句是初始化段寄存器的:当系统加载引导程序的时候就把程序的装入地址0x7c00放入代码段寄存器cs中.ds,es保存数据段段地址,如果不使用的话,程序就会找不到要显示的字符串(当进行串操作时,段地址是保存在es中).

jmp short beginroot
跳转到标签beginroot处,并从那里开始执行程序代码.

bootmsg db ""START YYOS......"" ;16bytes(0x10)
定义了一个字符串,当程序运行后在屏幕显示该友好字符串.

cls:
mov ax, 0x0600 ;ah=06表示使用INT10的功能6,al=0表示清屏
mov bh, 0 ;bh=0表示使用第0页
mov cx, 0 ;cx=0表示屏幕的左上角
mov dx, 0x174f ;dx=0表示屏幕的右下角
int 0x10 ;调用中断
ret ;函数返回

该块类似一个函数性质,它的作用就是清除屏幕.它调用的是BIOS中断INT10,关于BIOS中断的详细内容我会写一篇详细的文档,请等待.

print:
mov ax, 0x1300 ;ah=0x13表示使用INT10的功能0x13,al=0表示清屏
mov bx, 0x0002 ;bh=0表示使用第0页,bl=2表示字符串的颜色为绿色
mov cx, 0x10 ;cx=10表示显示字符串的长度
mov dx, 0 ;dx=0表示游标的行数列数都为0
int 0x10 ;调用中断
ret ;函数返回

该块类似一个函数性质,它的作用就是在屏幕上显示字符串.它调用的是BIOS中断INT10的功能0x13.

getkey:
mov ah, 0x00
int 0x16
ret
该块类似一个函数性质,它的作用就是暂停,然后按任意键继续.它调用的是BIOS中断INT16的功能0x00.

hello:
call cls
call getkey

beginroot:
call cls
mov bp,bootmsg
call print
call getkey
jmp hello

以上两个模块实现了在显示信息和清屏互相切换的目的,可以按任意键在两者之间切换.mov bp,bootmsg这条语句负责把字符串地址写入bp寄存器中,为下面的语句call print提供参数.

times 510-($-$$) db 0x00
该语句可以把从该位置起到第510字节处的字节全部置为0x00.然后加上下面一条语句生成的2个字节,一共512字节.正好放入磁盘的第一扇区(引导扇区)中.
NASM支持两个特殊符号,即$和$$,它们允许引用当前指令的地址.$指它本身所在源代码行的开始处的地址,$$计算当前段开始处的地址,所以你可以通过($-$$)找出你当前代码在段内的偏移.

dw 0x0aa55
在磁盘的第一扇区的最后两个字节写入0xAA55,以此标志该扇区为引导扇区.否则BIOS不认为该扇区是引导扇区.

下面通过NASM编译器将该程序编译为boot.bin.
NASM boot.asm -o boot.bin
可以查看一下,该文件的大小应该是512个字节.

然后我们要生成一个软盘的镜像文件,这里我们可以通过两种方法来实现.
1.通过Virtual PC的虚拟磁盘向导来生成软盘镜像;
2.通过WinHex来生成一个固定大小(1,474,560 bytes)的文件作为软盘镜像;

现在我们可以利用WinHex工具将生成512字节的boot.bin中的内容复制到软盘镜像文件的起始512字节处.现在我们就做成了一个可引导的软盘镜像.在Virtual PC中将该软盘镜像加载到系统中运行,我们就可以看到我们的成果了.

评论

此博客中的热门博文

如何解决在Delphi2009中添加pas组件的问题

在Delphi中操作Sap对象造成内存增长的原因

杀死团队的七种武器(转)