前面的引导程序,只是显示了一个字符串,但它还没执行它的主要任务,即导入操作系统内核。当然这里的操作系统的内核是非常简单的,在这主要是说明导入的过程。下面是引导程序和操作系统内核的代码。
引导程序 myboot.asm 的代码
;;nasm 2.07 汇编
org 7c00H
call welcome ;调用欢迎模块,显示欢迎字符
call loadkernel ;导入操作系统内核
welcome: ;欢迎模块
mov ax,cs ;调用BIOS的10号中断显示字符
mov es,ax
mov bp,hello
mov bx,000ch
mov dx,0005h
mov cx,18
mov ax,1301h
int 10h
ret
loadkernel: ;导入操作系统内核
reset: ;磁盘系统复位
mov ax,0 ;调用BIOS的13号中断使磁盘系统复位
mov dl,0
int 13h
jc reset ;如果复位成功CF=0,如果不成功CF!=0,重新复位
load: ;将操作系统内核导入到内存的es:bx位置,这里是01000h:0h
mov ax,01000h ;这个位置可自己设定
mov es,ax ;这里的操作系统内核是放在软盘的第二个扇区,所以,调用BIOS的13号中断
mov bx,0h ;将操作系统内核从软盘导入到内存
mov cx,0002h
mov dx,0000h
mov ax,0201h
int 13h
jc load ;导入成功,CF=0,不成功CF!=0,则重新导入
jmp 1000h:0000h ;导入成功后,跳到内存的01000h:0h的位置(因已导入了操作系统内核,所以这里放的是内核的代码),
;执行操作系统内核的代码
hello: db 'hello this is boot' ;欢迎的字符
times 510-($-$) db 0 ;补满剩下的空间,最后两个字节为0aa55h表示是引导扇区
dw 0aa55h
操作系统内核 mykernel.asm 的代码
;;nasm 2.07 汇编
org 0h ;在本段的偏移地址为0h的地方载入
call welcome ;调用欢迎模块,表示进入了内核
call input ;调用该内核的功能模块,允许输入字符,并显示出来
welcome: ;欢迎模块,调用BIOS的10h号中断,显示欢迎字符
mov ax,cs
mov es,ax
mov bp,hello
mov bx,000ch
mov dx,0200h
mov cx,28
mov ax,1301h
int 10h
ret
input: ;功能模块,调用BIOS的16h号中断,实现键盘的输入,和字符的显示
mov ax,0b800h
mov ds,ax
mov si,480
s:
mov [si],al
mov ah,0
int 16h
inc si
inc si
jmp s
hello: db 'this is kernel you can input' ; 欢迎字符
times 512-($-$) db 0
下面说一下执行的过程
1.nasm myboot.asm -o myboot.img
2.nasm mykernel.asm -o mykernel.img
3.partcopy mykernel.img 0 200 myboot.img 200 这里目的是,将mykernel.img,无缝接到myboot.img后面
这里的第一个0表示从mykernel.img的0号位置开始复制,第一个200(16进制的200,即表示十进制的512)表示复制的大小,第二个200(也是16进制)表示复制到myboot.img的200h的位置。(因为myboot.img本身就是512个字节的大小,占据的范围是0h-01ffh,那么就可将mykernel.img复制到200h的位置,无缝连接)
4.将myboot.img 装入到虚拟机,启动,我这里用的是VMware。
下面是运行的效果图