计算机电源打开时,会先进行加点自检(POST),然后寻找启动盘,如果选择是从软盘驱动,计算机就会检查软盘的0面0磁道1扇区,如果它以0xaa55结束,则bios则认为它是一个引导扇区。这一段代码总共为512字节。
一旦bios发现来引导扇区,就会将这512字节的内容装载到内存中0000:7c00去,然后跳转到这个位置将控制权彻底交给这段引导代码。
编写bios
文件名boot.asm
org 07c00h ;告诉编译器将程序加载到7c00h处
mov ax,cs ;cs=0的复制过去ax=0,ds=0,es=0
mov ds,ax
mov es,ax
call Disptr ;调用显示字符串到寄存器
jmp $ ;无限循环
Disptr:
mov ax,BootMessage ;将BootMessage的地址传给ax
mov bp,ax ;再传给bp
mov cx,16 ;因为要用到int10h中断,要先给各种寄存器赋值,cx表示显示字符串的长度
mov ax,01301h ;AH=13在teletype模式下显示字符串,al=01h表示只显示字符串
mov bx,000ch ;bh表示页号,bl=0ch表示显示属性高亮
mov dl,0 ;dh、dl表示显示的行、列
int 10h ;bios 中断显示
ret
BootMessage: db "Hello OS world!"
times 510-($-$$) db 0 ;填充剩下的空间,使生成的二进制代码恰好为512字节,$表示当前行,$$表示一个节的开始地址
dw 0xaa55 ;结束标志,bios识别引导扇区的标志
编译命令:
nasm编译文件
nasm boot.asm -o boot.bin
bximage 创建一个软盘
dd=if=boot.bin of=a.img bs=512 count=1 conv=notrunc
启动qemu虚拟机
bochs -f bochsrc