您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 30天自制操作系统日志第2天
操作系统实验日志学号201608010520姓名甘昆禄专业年级班级智能1601实验日期208.09.29实验项目第2天:汇编语言学习与Makefile入门一、实验主要内容1.首先下了一个文本编辑器,真的厉害,我们看看。HTML可以辨别和显示C和C++肯定也行二进制的镜像文件也可以打开修改,这里输入字母二进制文件自动修改了,很可以,不过在第五行再加字母就会出错。2.学寄存器和汇编语言诶我们学计算机的寄存器真的哪里都学过,每个课几乎都重新提一遍,特别电路逻辑已经很细致的讲了结构,系统课讲了CPU寄存器的用法。所以我觉得有点多余,不过巩固下知识也可以。用个例子说寄存器,我们把计算机看做一个机器人,CPU就是大脑,寄存器是大脑里的记忆单元,而内存和硬盘对计算机来说,只是一个柜子,一个存储东西(数据)的大柜子,机器人只能进行数据处理,按照人的指令执行。指令已经固化在大脑CPU内部,但数据存储在柜子里,这个柜子分为许多小格,每个小格都编了一个号,第一个小格叫0号,第二个叫1号,以此类推,每个小格存储一个字节。抽象来讲,是一个一维的线性数组。一个小格是8bit一个字节,2个小格是2个字节,CPU可以操作1个,2个,4个,8个格子,比如AL(1),AX(2),EAX(4),RAX(8)。对CPU来说,内存和硬盘就是一个(数字)地址而已。显存,IO地址,U盘也是地址,存取内存比寄存器慢很多,所以编写程序尽量用寄存器存数,而不是内存地址。CPU的记忆单元-寄存器很少,只有几十上百个,每个寄存器都有一个名字,比如AX,BX,CX,DX,SP,BP,DI,DI等等,因为名正则言顺。寄存器只是一个存储单元,他只能存储东西(数据),我们对他所做的所有操作只有存数据在里面,还有从中取出数据。MOVAX,100就是把数据100存储在AX寄存器中,MOVSS,AX就是把AX中的数据取出来,并放到寄存器SS中。MOV指令对应一个机器指令01码,处理器有一个专门的译码电路逐条把这些01编码翻译为各种控制信号,然后控制其内部的电路完成一个个的运算或者是其它操作。MOVAX,2000H;将16位数据2000H传送到AX寄存器MOVAL,20H;将8位数据20H传送到AL寄存器MOVAX,BX;将BX寄存器的16位数据传送到AX寄存器MOVAL,[2000H];将2000H单元的内容传送到AL寄存器需要注意的是:(1)两个存储单元之间不能直接传送数据,即:MOV指令只允许一个操作数在存储器中。MOV[SI],[2000H];这是错误的(2)MOV指令中立即数不能直接传送给段寄存器(CS、DS、SS、ES)和IP;段寄存器之间不能直接传送。MOVIP,2000H;这是错误的(3)CS和IP不能作为目的操作数。MOVCS,AX;这是错误的(4)MOV指令中立即数不能作目标操作数。MOV2000H,[SI];这是错误的还还还讲了add,CMP,JE等我就不讲了。3.中断诶嘿,这个也是学过的,可能不同系统对应的中断号不同,但机制都是一样的,无非就是通过I/O的硬中断或系统的软中断让CPU暂时停止当前工作,转而去执行对应中断的程序,结束后继续执行原来的工作,这里软中断对应16号中断函数。而这些中断函数在出厂的时候就已经写在了BIOS(基本输入输出系统)程序装在了芯片里。电脑启动后,CPU把BIOS程序调入内存某个地址emmm……是的4.简述汇编程序作用效果主体如下:entry:MOVAX,0MOVSS,AXMOVSP,0x7c00MOVDS,AXMOVES,AXMOVSI,msgputloop:MOVAL,[SI]ADDSI,1CMPAL,0JEfinMOVAH,0x0eMOVBX,15INT0x10JMPputloopfin:HLTJMPfinmsg:DB0x0a,0x0aDBhello,worldDB0x0aDB0RESB0x7dfe-$DB0x55,0xaa前面entry部分就是寄存器的初始化,把程序加载到地址0X7c00(IBM大叔设的),然后放msg(这里是一个数据)地址到寄存器SI里,我们看到msg地址其实就是我们要开始输出的内容。首先是两个换行,然后就到那个字符串,那具体怎么输出看中间putloop。这里是用INT中断一个字符一个字符地输出,所以还用到了判断,当判断对应的字符不是0时,就不断的输出,否则就跳到fin地址,这里的HLT就是作者说的停止,CPU停止工作。我们看,当msg地址不断加1后会出现一个字符是0,诶符合停止输出的条件,这时就跳到了HLT指令,若没有I/O指令(鼠标电脑等),这时CPU是释放的,挺好。那么helloworld就是这么打印出来的,学到这总算是明白了。5.Makefile入门可能作者觉得很多bat文件太烦?诶想想不对,确实程序员们要简洁不然很容易弄乱的,这时候就需要聪明的批处理文件了。.Makefile入门---一个聪明的批处理文件ipl.bin:ipl.nasMakefile../z_tools/nask.exeipl.nasipl.binipl.lstMakeipl.bin;寻找后面两个依赖文件,执行汇编生成目标文件clean:-delipl.bin-delipl.lst;删除生成两个文件Makefile就很方便,把很多文件汇聚成了一个,文件、操作都简单了很多直接一个makerun就行了而且也不怕什么错误,无论怎样makeimg和makerun都不会错。二、遇到的问题及解决方法第二天主要还是理解和知识点吧,总的操作上并没有什么问题。1、输出显示的时候有点困惑,没有完全了解汇编代码是,不知道输出是怎样的形式,是瞬间一次同时输出,还是像数码管扫描输出。后来明白是一个字符一个字符的输出,知道命令结束。解决方法:主要是CMP指令理解错误了,以为是AL里地址为0时跳转,后来经老师提醒是对比对应的字符,当字符为0时跳转,我转回去看msg地址内容是看见0才恍然大悟。三、程序设计创新点1、为了确认我的猜测对不对,我对ipl.nas进行了修改,如下:这次我把CMP判断变成了1,结果不仅输出了helloworld,还输出了我后面的内容,直到比较到1.改为2后出现了乱码,程序差点崩(下次不试了),证明猜想正确四、实验心得体会总的来说这节对于有基础的我们并不难,汇编和计算机组成我们都有了解,虽然知识点多,但是学到新的东西还是挺少的。有INT指令吧,以前没学,关于控制显卡的中断的函数,挺有意思的。还有HTL,CPU停止指令。再有就是一些硬盘启动区、块的知识吧,还有Makefile也挺好玩的,感觉没那么简单这个批处理的没有后缀的文件。
本文标题:30天自制操作系统日志第2天
链接地址:https://www.777doc.com/doc-6028325 .html