电脑在启动时,在BIOS启动自检后,检查并将引导扇区加载到7c00h处,跳转到7c00h开始执行代码。
建议先看完本文,再选择安装。
org 07c00h ; 告诉编译器将程序加载到7c00h处
mov ax, cs ; 取代码段段地址,此时应该为0
mov ds, ax ; 让数据段与代码段地址指向相同地址
mov es, ax ; 让附加段es与代码段地址指向相同地址
call DispStr ; 调用DispStr例程
jmp $ ; 无限循环,$ 表示编译后当前行指令地址
DispStr: ; 例程DispStr,显示一行字符串
mov ax, BootMessage ; 取字符串首地址
mov bp, ax ; CPU使用ES:BP寻址字符串
mov cx, 16 ; 将字符串长度放入 CX
mov ax, 01301h ; AH = 13h表示输出字符串 AL = 01h写模式,01h表示字符串
; 中仅包含字符,不包括字符属性,写完更新光标位置
mov bx, 000ch ; BH = 0h页数为0 BL表示字符串属性,0CH表示黑底红字
mov dl, 0 ; 显示位置,DH表示行,DL表示列
int 10h ; 调用BOIS中断10H
ret
BootMessage: db "Hello, MN world!" ; 定义字符串 db表示define byte
times 510-($-$$) db 0 ; 填充剩余空间 $$表示该程序所在section的开始地址
; 此处为7c00h
dw 0xaa55 ; 扇区结束标志,如果已0xAA55结束,BIOS认为是一个合法
; 的引导扇区,dw表示define word
引导扇区长度一般长度为512字节。
上述的代码编译后生成512字节大小的二进制文件。编译命令:
nasm boot.asm -o boot.bin
-rw-r--r--. 1 root root 1474560 Sep 9 13:56 Finix.img
使用两种方式来运行它,分别使用Virtualbox和Bochs来运行。
使用Virtualbox 5.0.2新建一个类型和版本都为Other类型的系统,内存32M,硬盘1G就足够用了。然后配置从软盘启动:
接着设置软盘的加载上述的Finix.img文件。
接着启动系统,运行结果:
安装Boch 2.6.8。然后在Finix.img文件同目录新建一个文件Finix.bxrc,接着将如下内容写入到Finix.bxrc中:
###############################################################
# bochsrc.bxrc file for Finix.
###############################################################
# how much memory the emulated machine will have
megs: 32
# filename of ROM images
romimage: file=$BXSHARE/BIOS-bochs-latest
vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest
# what disk images will be used
floppya: 1_44=Finix.IMG, status=inserted
# choose the boot disk.
boot: a
# where do we send log messages?
log: bochsout.txt
# disable the mouse, since Finix is text only
mouse: enabled=0
# enable key mapping, using US layout as default.
keyboard: keymap=$BXSHARE/keymaps/x11-pc-us.map
虽然显示了很多其他的信息,但我们知道上面的代码已经可以运行了。
如果配置过程出现了问题可以参考:http://blog.csdn.net/furzoom/article/details/52484413
于渊《自己动手写操作系统》
Writing 16-bit Code http://web.mit.edu/gnu/doc/html/as_18.html#SEC209
BIOS INT 10H调用 http://www.ctyme.com/intr/int-10.htm
Wiki INT 10H https://en.wikipedia.org/wiki/INT_10H
INT 10H 的13H参数说明 http://blog.csdn.net/pdcxs007/article/details/43378229
关于INT 10H 13H的更多应用 http://www.cnblogs.com/ljf9201314/archive/2008/07/21/1247653.html
INT 10H 13H说明 http://www.itzhai.com/assembly-int-10h-description.html