马上开始动手写最小的一个“操作系统”
1.准备的工具
- 具有Window或者Linux的计算机
- 汇编编译器NASM下载地址:http://www.nasm.us/
- VM虚拟机(11.1.3)
- MASM2015当作汇编的编辑器
2.操作系统源码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18org 07c00h ;告诉编译器程序加载到7c00处
mov ax,cs
mov ds,ax
mov es,ax
call DispStr ;调用显示字符串例程
jmp $ ;无限循环
DispStr:
mov ax, BootMessage
mov bp, ax ;ES:BP=串地址
mov cx, 16 ;CX=串长度
mov ax, 01301h ;AH=13,AL=01h
mov bx, 000ch ;页号为0(BH=0)黑底红字(Bl=OCh,高亮)
mov dl, 0
int 10h ;10h号中断
ret
BootMessage: db "His World dwj!"
times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节
dw 0xaa55 ; 结束标志
3编译源码制作img文件(软盘镜像文件)
操作系统要在裸机上跑(没有操作系统的电脑),所以使用VM虚拟机来运行我们写的操作系统,同时又因为现在很多人的电脑都没有光驱了,所以没法制作光盘来做启动盘,这个时候可以用如下命令:1
nasm boot.asm -o boot.img
来生成img文件,这个文件就等同于软盘文件,可以放在虚拟机里跑。具体的例子如图:
(1)首先在MASM上编写汇编源码(各行代码含义后面会讲到):
(2)然后在cmd中,找到boot.asm的位置,如图:
(3)然后输入命令:
1 | nasm boot.asm -o boot.img |
就可以看到,新生成了boot.img
(4)打开虚拟机新建,如下列图:
一路NEXT,直到下图:
然后可以得到一个空白的裸机,用来跑自己写的OS用:
因为我用的.img文件做虚拟软盘,所以需要编辑虚拟机设置:
然后选择自己的boot.img文件在那即可
即可显示Hello World!
是不是有点小激动呢,哈哈。但是,事实上,这个东西还算不上完整的操作系统,只是最简单的引导扇区,但是它和其他软件不同,它是直接在裸机上跑的,已经具备了操作系统的一个特性。
4代码解释
org 07c00h:以为计算机电源被打开时,它会先进行加电自检,然后寻找启动盘,这行代码就是告诉BIOS,一旦发现了引导扇区,就将这段512字节的内容装载到0000:7c00处,然后将控制权交给这段引导代码。到此,计算机不再由BIOS中固有的程序控制,而编程由自己的OS的一部分来控制。
mov ax,cs mov ds,ax
mov es,ax:这三个mov指令,是将ds和es两个段寄存器指向与cs相同的段。
mov ax, BootMessage:把BootMessage中的值的首地址传给寄存器ax(pS:Nasm中,不加[]的标签或者变量都被认为是地址)。
($-$$):开始汇编处,距离本行的相对位置。
dw 0xaa55:计算机只有找到0xaa55为结束,才会认为是软盘启动。