操作系统实验第二天:汇编语言学习与Makefile入门

一、实验主要内容
内容1:文本编辑器Notepad++下载
在网络上搜索Notepad软件进行下载,安装之后随便打开一个nas文件,如下:
操作系统实验第二天:汇编语言学习与Makefile入门

可以看到正常打开文本(注释是日文应该是因为日本开发的)

内容2:代码中的指令讲解
helloos中的核心代码
操作系统实验第二天:汇编语言学习与Makefile入门

课本上对helloos.nas节选代码涉及到的一些指令进行了讲解,进行一下简单的总结。
ORG指令:ORG 0x7c00 把程序装载到指定地址,至于为什么是0x7c00,因为最开始规定的就是这个数字,然后大家都依次为前提开发各种操作系统。
JMP指令:JMP putloop 相当于C中的goto,来自于jump,意为跳转
在书本里涉及到了JMP entry,写成JMP 0x7c50也没有问题。这里的entry本来就是这个数字,在汇编语言中所有的标号都只是简单的数字而已,比如msg就是0x7c74.
MOV指令:MOV SS,AX 将AX的值赋值给SS(和我们学的计算机汇编不太一样,反了过来)
如果是MOV AL ,[SI]的形式,加上这个括号之后的话那一就变成了内存地址,即将SI位置的内存字节赋值给AL,除此之外,还有三个英文词汇:BYTE、WORD、DWORD,使用形式如下:
MOV BYTE [678] ,123,即把内存678的地址存储数字123,如果是WORD,则是内存678,679都做出反应,存储数字0000000001111011,678存储低八位,679存储高八位。
而如果使用MOV AL,[SI]这种形式时,其实是省略了保留字的,原来应该是MOV AL,BYTE [SI],在省略的时候,就是默认源数据和目的数据位数相同。
ADD指令:ADD是加法指令,ADD SI,1意思即为SI=SI+1.
CMP指令:CMP就是比较指令,CMP AL,0相当于if(AL==0)
JE指令:条件跳转指令之一,就是根据比较的结果决定跳转或不跳转。假如:
CMP AL,0
JE fin
就相当于 if(AL == 0) {goto fin;}(fin相当于结束的意思)
INT指令:INT是软件中断指令,暂时将之看作一个函数调用。在BIOS中有很多位系统开发人员准备的各种函数的集合,而INT就是用来调用这些函数的指令。INT 后面跟上不同的数字,就调用不同的函数,假如INT 0X10,功能就是控制显卡。
HLT指令:这是让CPU停止动作的指令。这里并不是彻底的停止,只是进入一个待机状态,按下键盘或者移动鼠标都可以让CPU继续执行程序。

内容3:寄存器总结:
CPU中有一种名为寄存器的存储电路,在机器语言中就相当于一个变量。以下是8个具有代表性的寄存器
AX—累加寄存器
CX—计数寄存器
DX—数据寄存器
BX—基址寄存器
SP—栈指针寄存器
BP—基址指针寄存器
SI—源变址寄存器
DI—目的变址寄存器
上述寄存器均为16位寄存器,每个寄存器的名字很清楚的象征着它们本身的意义,在使用的过程中按照含义来进行使用也可以更简便。这几个寄存器的排列顺序也确实就是按照他们的编号写下来的。
此外,还有八个8位寄存器
AH/AL 、CH/CL 、DH/DL 、BH/BL,这八个寄存器其实也就是对应了上述前四个寄存器的高八位和低八位。
如果是32位寄存器的话,则是在上述八个代表性寄存器前加上大写字母E,即
EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI
除了上述寄存器之外,还有几个段寄存器(均为16位)
ES—附加段寄存器(extra segment)
CS—代码段寄存器(code segment)
SS—栈段寄存器(stack segment)
DS—数据段寄存器(data segment)
还有两个没有名称的寄存器:FS,GS。

内容4:制作启动区
由于以后还要开发,所以先只用nask制作512字节的启动区,剩下的部分我们用磁盘映像管理工具做。
因为启动区只需要最初的512字节,所以把helloos.nas的后半部分截掉了,文件名也改为ipl.nas。将asm.bat中的输出文件名也改为ipl.bin
另外还增加了一个makeimg.bat,这个文件是以ipl.bin为基础,制作helloos.img的批处理文件,这样,这样的话可以简化输入步骤。
最后只需要按顺序输入asm 、makeimg 、run即可,
结果如下:
操作系统实验第二天:汇编语言学习与Makefile入门

内容5:Makefile入门
Makefile就像是一个非常聪明的批处理文件。
生成方法很简单,我个人是先新建一个txt文件,将需要写入的内容输入之后,将扩展名删除,这样就生成了我们需要的Makefile文件。如下:
操作系统实验第二天:汇编语言学习与Makefile入门

将tolset中的z_new_w文件夹中的make.bat复制到helloos4中,用!cons打开一个命令行窗口,输入“make -r ipl.bin”,再输入make -r helloos.img,这样就生成了我们需要的两个文件。而如果我们将ipl.bin和helloos.img都删除之后,直接输入make -r helloos.img,会发现还是直接生成了两个文件,说明make在试图生成helloos.img未果时,就去寻找如何生成ipl.bin并将之生成,然后再完成这个任务,这就显现出了Makefile的聪明。
如下:
操作系统实验第二天:汇编语言学习与Makefile入门

并且在修改ipl.nas的信息之后,Makefile文件还可以分辨出是不是文件有修改,要不要重新输出文件。
为了每次输入的省事,在Makefile中添加如下内容

操作系统实验第二天:汇编语言学习与Makefile入门

这样的话,其它所有的bat文件都不需要了,只需要输入make run,就会直接进行所有操作,如下:
操作系统实验第二天:汇编语言学习与Makefile入门

实验内容描述完毕。

二、遇到的问题及解决方法
1、描述问题1
在进行helloos4部分,关于删除两个文件然后直接输入make -r helloos.img部分时,出现了make指令不明确的情况。
解决方法:发现是自己看书不认真,没有将make.bat文件复制粘贴过来。粘贴过来之后也就没有了这个错误提示。
2、描述问题2
但是在解决完上述问题后有出现了文件找不到的问题。
解决方法:发现又是自己没有认真看书,前面的makefile其实是需要的,自己以为只是一个教学而已。所以在把helloos5中的makefile文件移过去之后,问题得到了解决,程序可以正常运行。
三、程序设计创新点
1、描述创新点1
将命令设置为.PHONY目标,这样可以避免出现make 之后的指令与文件名重名的情况
操作系统实验第二天:汇编语言学习与Makefile入门

就像这样,这样的话,比如有clean文件,如下将原来的run.bat修改为clean.bat,执行的依旧是对应的指令,而不是run:
操作系统实验第二天:汇编语言学习与Makefile入门

2、描述创新点2

代码中可以通过修改每次ADD的值来改变输出,比如隔一位输出一下,或者隔两位输出一下。也可以通过设置新的变量,配合SI的值进行倒序的输出。