1.介绍文本编辑器
本小节内容只是编者介绍了一个免费的文本编辑器,因为是日语的缘故,译者向我们推荐了一个可编辑中文的文本编辑器: Notepad++,笔者也正用这个编辑器,放上下载链接:
>>>> Download Notepad++ >>>>
↑Notepad++使用界面
2.继续开发
节选了projects/02_day中的helloos3中的部分内容,原文档中注释用的是日文,所以这里截取了书中的代码片段:
因为是从零开始做一个操作系统,作者对代码中的汇编格式进行了非常详细的介绍。
ORG指令
ORG指令来源于英文"origin",意思是“源头、起点”,它会告诉nask(应该是一个汇编语言编译器)程序要从这个地址开始,也就是要把程序装载到内存的指定地址,这里指定的地址是 0x7c00。(后续再讨论原因)
如果有汇编语言的基础(写过汇编程序),那么对于这条指令应该是非常熟悉,该指令类似于笔者学习时用的masm编译器中的 start 指令。
↑使用masm编译器风格的汇编代码
jmp指令
在CPU中由CS(Code Segment, 代码段寄存器) + IP(Instruction Pointer,指令指针寄存器)来指示它执行的位置。目前只需要知道它是用于改变程序执行位置的即可。
entry标号
标号在书写汇编代码时经常用到,因为程序时常需要完成跳转进行:循环、执行函数都是以转移为基础的,转移也就是改变CS:IP的值,标号可以指明CS:IP需要变更的值,当然了CPU是不认识标号的,只能通过编译程序将标号程序的首地址计算出来。
mov指令
这个指令应该是汇编中最常用的一个了,类似于高级语言中的赋值号,比如:
mov ax, 0 相当于 ax = 0
mov ss, ax 相当于 ss = ax(注意:ax并没有改变,还是原有的数据)
基本寄存器介绍
这里的内容较为基础,介绍了CPU中的各种寄存器。
上述都是16位寄存器,后来的32位寄存器只是在原有寄存器名称前加了字母 ‘E’, 意为 Extend(扩展)
EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI
还有一些段寄存器:
HLT指令
HLT指令源自于英文"Halt", 意思是停止。
HLT是让CPU停止动作的指令,不过并不是彻底地停止(如果要彻底停止CPU的动作,只能切断电源),而是让CPU进入待机状态。只要外部发生变化,比如按下键盘,或是移动鼠标,CPU就会醒过来,继续执行程序。
如上图所示,这里的HLT即使去掉了也不影响(循环还是会无限进行下去),但是CPU会全力以赴地去执行这个循环,非常费电,所以使用HLT让CPU初一睡眠状态是一个不错的选择。
C语言改写后的helloos.nas程序节选
程序的功能是将0:msg的内容循环写入到显卡中(在读到0时停止),当读到0时,程序跳转到fin(final)进入无限循环。“hello world”就是这样显示出来的。
对于ORG从0x7c00的疑惑
为什么必须从0x7c00处开始执行程序呢:
操作系统中的很多内存位置是不能随便使用的,里面可能有各种数据、核心程序段,因此很早之前IBM的大佬们规定了
0x00007c00 - 0x00007dff 这块区域位启动区内容的装载地址,至于为什么要选这个,感兴趣的同学可以查阅当年IBM开发操作系统的历史~
↑截取自原书P73
3.先制作启动区
顺序输入: asm -> makeimg -> run
4.Makefile入门
这部分是对Makefile文档的介绍:Makefile的功能、格式、使用。由于笔者在学习Linux时有接触,在这里放上几篇笔者认为非常不错的博客供大家学习:
跟我一起写 Makefile(一)
跟我一起写 Makefile(二)
感受
今天学的东西都比较基础(笔者在假期自学了汇编语言),主要是对汇编语言的各种寄存器、指令、访问内存的方式进行了介绍,正因如此没有太多自己的想法,都是用的书上的解析,当然了这里还有中断作者没有深入讲解。再就是引入了Makefile,对于大工程来说,这是必不可少的。
再接再厉~
over~~ 明天见