30天自制操作系统学习笔记----day_two

、实验主要内容

  1. 介绍文本编辑器:

重点总结:下载并安装文本编辑器TearPad,默认语言是日文,若想汉化安装汉化包即可,但推荐使用Notepad++,在软件安装时选择简体中文即可。

  1. 继续开发:

重点总结:各种指令及其作用

  1. ORG:这个指令告诉nask,当程序开始执行的时候,把汇编文件中的机器语言装载到内存的某个地址中。需要注意的时候,当有ORG指令的时候,$代表的意思是立即数,亦即将要读入的内存地址。通俗的讲,ORG指令的作用就是告诉nask程序从哪个地址开始执行,然后程序就会被装载到内存的指定地址中(0x7c00)。为什么从0x7c00开始?因为0x7c00是留给系统使用的,如果程序也加载到这些地址上运行会引发系统异常,甚至崩溃。
  2. JMP:相当于c语言的goto语句,在汇编中的作用是无条件跳转到某个地址。

扩展:常用的一些跳转指令

a进位标志CF(Carry Flag)

进位标志CF主要用来反映运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。

使用该标志位的情况有:多字(字节)数的加减运算,无符号数的大小比较运算,移位操作,字(字节)之间移位,专门改变CF值的指令等。

b奇偶标志PF(Parity Flag)

奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0。

利用PF可进行奇偶校验检查,或产生奇偶校验位。在数据传送过程中,为了提供传送的可靠性,如果采用奇偶校验的方法,就可使用该标志位。

c辅助进位标志AF(Auxiliary Carry Flag)

在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:

1)、在字操作时,发生低字节向高字节进位或借位时;
2)、在字节操作时,发生低4位向高4位进位或借位时。

对以上6个运算结果标志位,在一般编程情况下,标志位CF、ZF、SF和OF的使用频率较高,而标志位PF和AF的使用频率较低。

d符号标志SF(Sign Flag)

符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用补码表示法,所以,SF也就反映运算结果的正负号。运算结果为正数时,SF的值为0,否则其值为1。

d溢出标志OF(Overflow Flag)

溢出标志OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。

  1. MOV指令:该指令格式如下: MOV 目的操作数,源操作数。其中目的操作数和源操作数两者不能同为内存地址,亦即不能同时为:MOV [目的操作数],[源操作数],其次就是源操作数和目的操作数为寄存器时,两者的位数要一致,即16位寄存器只能MOV数据给16位的寄存器。
  2. 常用寄存器介绍:

AX――累加器(Accumulator),使用频度最高
BX――基址寄存器(Base Register),常存放存储器地址
CX――计数器(Count Register),常作为计数器
DX――数据寄存器(Data Register),存放数据
SI――源变址寄存器(Source Index),常保存存储单元地址
DI――目的变址寄存器(Destination Index),常保存存储单元地址
BP――基址指针寄存器(Base Pointer),表示堆栈区域中的基地址
SP――堆栈指针寄存器(Stack Pointer),指示堆栈区域的栈顶地址
IP――指令指针寄存器(Instruction Pointer),指示要执行指令所在存储单元的地址。IP寄存器是一个专用寄存器。

以上寄存器均为16位。另外这些寄存器还分为高8和低8位(除BP,SP,SI,DI),分别是AH、AL.....

当机子扩展到32位时,这些寄存器称为EAX、EBX....E可理解位extend。

另外还有段寄存器:

段寄存器一般会很少用到,具体用法不在赘述。关于ADD、SUB\CMP等指令,格式与MOV一致,都是:指令 目的操作数,源操作数。如ADD EAX,1,就相当于EAX+=1。运算得到的结果存入目的操作数。另外CMP的作用主要用是用于条件跳转或者寄存器清0,CMP具体还分为按位比较等等。

  1. 制作启动区:

我们先制作512字节的启动区就好,后续的交给磁盘映像管理工具来完成即可。课本说截取heloos.nas的后半截,这个说法太苟了,后半截的标准是啥?

步骤如下:

  1. 首先在helloos3的基础上创建汇编文件,并命名为ipl.nas。右键选择用NotePad++打开。启动区其实就是我们的程序,所以它的内荣就是输出hello word需要的机器代码,也就是启动区以外的机器代码不用写到启动区。

关键代码:

 

红圈为我自己的理解以及资料查阅得到的。

  1. 改造asm.bat,这个批处理命令的作用主要是编译nas文件,将输出的文件名改为ipl.bin和ipl.list,就可以得到编译过程的相关信息。

修改内容如下:..\z_tools\nask.exe ipl.nas ipl.bin ipl.lst 。指令的意思就是调用nask.exe 通过ipl.nas文件生成ipl.bin 和 ipl.list文件。

  1. 制作映像文件,制作映像文件需要用到ipl.bin文件同时借助作者开发的edimg.exe程序。该程序的原理是:先读入一个空白的映像文件,然后写入ipl.bin文件的内容,组后输出映像文件。将此步骤写成批量处理命令并命名为:makeimg.bat。内容如下:..\z_tools\edimg.exe   imgin:../z_tools/fdimg0at.tek   wbinimg src:ipl.bin len:512 from:0 to:0   imgout:helloos.img。
  2. 测试安装生成的映像文件,用到之前的run.bat命令即可,如果img文件名还是原来的helloos直接使用,否则需要修改对应的文件名,不然会报missing xxxxfile的错误。
  1. Makefile入门:

Makefile其实之前很早就接触过了,在编译我们写的C语言都用到了Makefile,主要是帮我们调用一些系统提供的服务,比如你用pritf函数的时候,Makefile就发挥了巨大的作用。Makefile是批处理文件,可以顺序执行写入的命令,或者执行优先级更高的命令。因此我们可以将上面繁杂的过程写入到Makefile里面,然后在用一个bat命令文件去执行Makefile就可以一键完成编译运行这个过程。

关键代码:

有了这个批处理文件后,启动控制台程序(!cons_nt.bat),输入命令 make -r ipl.bin ,r表示当前是数据读入模式(w为写入,英文read和write的首字母),这个时候make.exe就会启动,先读取Makefile的内容找到制作ipl.bin的方法,制作img文件也是如此,输入相应的img文件名即可(此处是helloos.img),执行原理和步骤与上述一致。执行完上述过程,文件目录会多处以下文件:

执行前:                    执行后:

这些文件都是根据Makefile文件的命令生成的,当删除这些文件后,再次执行上述命令发现文件又被重新生成了。当未删除文件而再次执行上述命令,控制台会输出提示信息:“xxxx已是最新版本”。当生成文件的内容改变时,执行上述命令将会更新ipl.bin和ipl.list以及helloos.img文件,原理就是Makefile生成的文件都自带更新日期,在生成文件前会判断该更新日期,从而决定是否需要更新文件。

编译生成所需的文件需要输入的命令有点长,解决办法:在Makefile里面加入一下命令:

此时只需要在控制台程序输入make img 即可生成所需的img文件。另外添加以下内容:

如此一来,只需输入终极命令:make run ,就可以一键生成所需要的文件。那这样目录下的install.bat和run.bat都可以删除了。

猜你喜欢

转载自blog.csdn.net/weixin_42294984/article/details/83589251