30天自制操作系统:第二天 汇编语言学习与Makefile入门


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~~ 明天见


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM