Write your own operating system Day(1)
工具准备:
VirtualBox.exe是一个免费的轻巧的虚拟机
Bz.exe是二进制编辑器
NASM则是用来编译汇编语言的,具体使用方法自行百度
HZK16.fnt 中文GB2312的二进制点阵文件
QEMU软盘模拟器 加载BIOS程序到时候会用到
开发平台:windows
编写语言:C 和 汇编
操作系统开发中的困难
现在市面上众多的C编译器都是以开发Windows或Linux上的应用程序为前提而设计的,几乎从来没有人想过要用它们来开发其他的软件, 比如自己的操作系统。本次使用的也是Windows版的gcc为基础稍加改造而做成的,与gcc几乎没什么不同。或许也有为开发操作系统 而设计的C编译器,不过就算有,恐怕也只有开发操作系统的公司才会买,所以当然会很贵。这次我们用不了这么高价的软件。
因为这些原因, 我们只能靠开发应用程序用的C编译器想方设法编写出一个操作系统来。这实际上是在硬来,所以当中就会有很多不方便的地方。
就比如说printf{ “ hello\n” );吧,这个函数总是出现在C语言教科书的第一章,但我们现在就连它也无法使用。为什么呢?因为printf“这个函数是以操作系统提供的功能为前提编写的, 而我们最开始的操作系统可是什么功能都没有。因此,如果我们硬要执行这个函数的话,CPU会发生 一般保护性异常,直接罢工(蓝屏啦)。刚开始的时候不仅是printf, 几乎所有的函数都无法使用。
顺便插一句,在开发操作系统时不会受到限制的语言大概就只有汇编语言了。还是汇编语 言最厉害。
首先先下载个BZ工具Bz.exe打开然后开始嗨了:记得文件另存为helloos.img
配置bat文件信息略过一万字,然后启动QEMU加载编写的img文件
汇编语言中的MOV可以简单理解为“赋值”
“MOV SS,AX”就相当于“SS=AX;”
代表性的寄存器8个:
AX-accumulator,累加寄存器
CX一counter,计数寄存器
DX一一data,数据寄存器
BX一base,基址寄存器
SP-stack pointer,栈指针寄存器
BP-一-base pointer,基址指针寄存器
SI一-source index,源变址寄存器
DI一--destination index,目的变址寄存器
另外八个寄存器
AL-------累加寄存器低位accumulator low
CL-------记数寄存器低位counter low
DL-------数据寄存器低位data low
BL-------基址寄存器低位base low
AH-------累加寄存器高位accumulator high
CH-------记数寄存器高位counter high
DH------数据寄存器高位data high
BH-------基址寄存器高位base high
AX,CX,DX,BX ...CPU寄存器好久之前都是8位加X(extend)扩展成16位寄存器了。
EAX,ECX,EDX,EBX,ESI,ESP,EBP,EDI... 在16位寄存器前面加个E就是32位寄存器了,就是32位的CPU,只能存储32字节数据
段寄存器:
BS一一附加段寄存器(extra segment)
CS一一代码段寄存器(code segment )
SS一一栈段寄存器(stack segment )
DS一一数据段寄存器(data segment)
FS一一没有名称(segment part 2 )
GS一一没有名称(segment part 3 )