30天自制操作系统

汇编语言学习与Makefile入门

第二天的内容仍然不是很多,但相比较第一天来说,在理解方面增大了一点难度,出现了一些理解上的困难点。在这一部分的学习中,体会到了小组合作的高效性,个人无法解决的问题,通过小组成员共同梳理,每个人都可以对该知识点有更高效更深刻的理解。所以在以后的学习中要摒弃之前小组学习无用的观念,积极参与讨论,希望能从中获得更多的知识和学习方法与灵感。另外本次实验中没有什么创新点,希望可以在之后的学习中发现更多的可创新之处,加入自己的思考与实现方法。

介绍文本编辑器

译者推荐文本编辑器:Notepad++
中文设置方法:“Encoding” “Character set” “Chinese” “GB2312(Simplified)”
Tab键对应的字符数可以在菜单下的“Setting” “Preference” “Language Menu/Tab Settings”,默认宽度为4,也可选择用空格代替Tab键。

继续开发

这一部分主要对helloos.nas文件中的程序核心代码进行了注解,具体的解释如下:(详细注解见截图中的文字注释)
30天自制操作系统day02-汇编语言学习与Makefile入门
30天自制操作系统day02-汇编语言学习与Makefile入门
新指令解释:
ORG:“origin”,在开始执行的时候告诉nask,程序要从指定的地址开始,也就是要把程序装载到内存中的指定地址(启动区内容的装载地址:0x7c00-0x7dff);
JMP:”jump”,跳转指令;
“entry:”:标签的声明,用于指定JMP指令的跳转目的地(入口);
MOV:“move”,赋值指令。
ADD:加法指令
CMP:比较指令
JE:条件跳转指令之一,如果比较结果相等,则跳转到指定的地址;而如果比较结果不等,则不跳转,继续执行下一条指令。(jump if equal)
fin:是个标号,表示结束(finish)的意思。
INT:软件中断指令(interrupt),用来调用BIOS中的函数指令。(BIOS是“basic input output system”的缩写,即“基本输入输出系统”,其中包括了一些基本的开发人员会用到的程序)
HLT:让CPU停止动作的指令,但并非彻底停止,而是进入待机状态。如果无HLT指令,CPU会在JMP fin无限循环,所以不写HLT指令也可以,但这样会使CPU无意义的空转,CPU负荷过大,耗费电能,所以加上HLT指令后使CPU处于休眠状态,降低能耗。(halt停止)
寄存器介绍
16位寄存器及其全称:
30天自制操作系统day02-汇编语言学习与Makefile入门
8位寄存器及其全称:
30天自制操作系统day02-汇编语言学习与Makefile入门
段寄存器:
30天自制操作系统day02-汇编语言学习与Makefile入门
32位寄存器:即在16位寄存器前加上E,如EAX,ECX,E取自expand扩展的意思。
以上寄存器的全名均可以说明其本来的意义,每个寄存器都有其各自的优点。几个8位寄存器实际上是前4个16位寄存器的高位和低位,而后4个16位寄存器没有高低位之分。而对于32位寄存器,以EAX为例,AX即为EAX的低16位,低16位用起来十分方便,而如果要使用高16位的话,则需要进行移位操作。
关于标号
在代码中有一句语句,”MOV SI,msg”,即将标号赋值给寄存器,这里就需要对标号的含义进行理解和解释。
在汇编语言中,每个标号都仅仅是单纯的数字。每个标号对应的数字,是由汇编语言编译器根据ORG指令计算出来的。编译器计算出“标号的地方对应的内存地址”就是标号的值。
例如前面的”JUMP entry”指令,因为entry即为0x7c50。“MOV AX,entry”也并不代表将entry下面的程序一起储存到寄存器中,标号仅代表一个单纯的数字储存进去,并无其他特殊的含义。
关于内存
指令中“MOV AL,[SI]”可以发现,SI的外面加上了[],这个记号代表内存。
内存,就是一个超大规模的存储单元“住宅区”。因为CPU的存储能力很差,所以需要另外准备一套存储电路,因此有了在CPU外部的内存。内存可以与CPU之间进行电信号的交换,CPU在执行机器语言时,必须从内存一个命令一个命令的读取程序,顺序执行。
在汇编语言中,用方括号来表示内存地址,例如:
MOV BYTE(8位) [678],123
这条指令即用内存的“678”号地址来保存“123”这个数值(678是一串电信号),如果将BYTE改为WORD,则678旁边的679也会做出反应,一共16位。汇编语言中的书写格式为:数据大小[地址],如果数据大小为WORD(DWORD),则相邻的一个(两个)字节也会成为这个指令的操作对象。这里,相邻指的是地址增加的方向。
也可以用寄存器来指定内存地址,但可以进行这个操作的寄存器只有BX,BP,SI,DI这几个。

先制作启动区

这一部分先开始用nask制作512字节的启动区,剩下的用磁盘映像管理工具来制作。
具体流程:
1、 hello.nas改名成ipl.nas
2、 修改asm.bat,生成ipl.bin和ipl.lst(列表文件)
3、 增加makeimg.bat,以ipl.bin为基础生成hello.img

Makefile入门

Makefile的主要作用是将很多文件汇聚成一个文件,相当于一个批处理文件,具体文件内容及解析如下:
30天自制操作系统day02-汇编语言学习与Makefile入门
ipl.bin行:如果想要制作ipl.bin文件,则需要检查ipl.nas和Makefile这两个文件是否准备好,如果准备好了,则由nask.exe根据ipl.nas生成ipl.bin和ipl.lst两个文件。
helloos.img行:检查ipl.bin和Makefile两个文件是否准备好,如果准备好继续下一行。首先读入一个空白的映像文件fdimg0at.tek,然后再开头写入ipl.bin的内容,长度为512字节,最后输出文件名为helloos.img的文件。
“ipl.nas Makefile”和“ipl.bin Makefile”这种类似的语句作用实际上是检查列出的文件是否准备好,如果准备好则跳转下一行指令进行执行。
30天自制操作系统day02-汇编语言学习与Makefile入门
以上列出的是几种基本命令的写法:
asm:输入“make asm”指令后,生成ipl.bin文件;
img:输入“make img”指令后,生成helloos.img文件;
run:检查有无img,若无则执行img标号对应的处理命令,然后启动模拟器;
install:安装helloos.img文件
以上所有的命令,若执行前发现无helloos.img文件,可先生成该文件,即先执行“make img”指令,再执行当前指令。
30天自制操作系统day02-汇编语言学习与Makefile入门
这是两个另外添加的指令:
make clean:删除helloos.img(最终成果)以及中间生成的文件,彻底清理硬盘;
make src_only:删除源程序外的所有文件。

相关文章: