30天自制操作系统(day2)

第2天:汇编语言学习与Makefile入门

**一、实验主要内容
1、内容1:**文本编译器notepad++下载。在网上另外找到的编译器,然后在群里进行了分享,网址为https://dl.pconline.com.cn/html_2/1/117/id=10699&pn=0.html。直接选择本地下载,注意设置语言。点击就可以使用,界面如下(太简洁了吧…)
30天自制操作系统(day2)
用他来打开一个nas文件,如helloos3中的helloos.nas看一下:
打开之后可以看到代码部分可以正常显示,但注释部分是日文,可能是因为这款编译器是由日本开发的,不影响使用。
30天自制操作系统(day2)
**2、内容2:**学习相关知识。本次实验的主要核心内容是学习部分汇编指令,helloos.nas中的程序核心部分如下:
30天自制操作系统(day2)
其中entry,putloop,fin,msg用于指定jmp指令的跳转目的地址
这里有部分新指令:
ORG指令:来源于”origin”,这个指令告诉nask,程序要从指定的这个地址(0x7c00)开始,把程序装载带内存中的这个地址。$代表将要读入的内 存地址。
JMP指令:相当于C语言的goto语句,跳转指令。
MOV指令:赋值,”MOV AX,0” 相当于” AX=0; ”,要求源数据和目的数据必须位数相同。
INT指令:软件中断指令,BIOS程序在电脑出厂时组装在主板上的ROM里,里面写入了操作系统开发人员经常用到的程序(各种函数的集合)。INT就是用来调用这些函数的指令,INT后面跟数字,不同的数字可以调用不同的函数。
HLT指令:停止指令,让CPU进入待机状态,任一操作都可以唤醒CPU。
以及部分寄存器的讲解:
16位具有代表性的寄存器,前四个寄存器的X代表拓展(extend)。其次,下面寄存器的排列顺序是按照机器语言中的寄存器的编号排列的。这八个寄存器全部合起来只有十六个字节,CPU把全部的寄存器用上也只能存储十六个字节:
AX—accumulator , 累加寄存器
CX—counter , 计数寄存器(这个我在上节实验课的时候就在创新点部分用到了)
DX—data , 数据寄存器
BX—base , 基址寄存器(用于保护内存)
SP—stack pointer , 栈指针寄存器
BP—base pointer , 基址指针寄存器
SI—source index , 源变址寄存器
DI—destination index , 目的变址寄存器
8个特殊的8位寄存器,实际上就是上面四个拓展寄存器的高八位和低八位罢了,相应的产生了符号拓展指令movs和零拓展指令movz
AL—accumulator low , 累加寄存器低位
CL—counter low , 计数寄存器低位
DL—data low , 数据寄存器低位
BL—base low , 基址寄存器低位
AH—accumulator high , 累加寄存器高位
CH—counter high , 计数寄存器高位
DH—data high , 数据寄存器高位
BH—base high , 基址寄存器高位
当然寄存器还有很多,还是标志位寄存器啦,段寄存器啦,32位寄存器和64位系统的64位寄存器,这里不进行一一描述。

**3、内容3:**指令具体操作和汇编语言。
MOV指令可以指定数据大小,比如说BYTE , WORD , DWORD 等汇编语言保留字。如MOV BYTE [678] ,123 指令是用“678”号地址保存“123”这个数值,1byte就是八位,相当于某八个存储单元存了代表“123”的开或关的电信号。“数据大小 [地址] ”是一个固定的组合,如果是MOV WORD [678],123 就相当于把123当成一个16位的二进制数值,保存在地址678,679这两个位置里。如果是DWORD就是相邻(地址增加方向)的两个字节都保存了123这个数。“BYTE[SI]”如果SI中保存的是789,则BYTE[SI]就是BYTE[789]的意思,所以MOV AL, BYTE[SI] 就是将SI地址的1字节内容读到AL。这个 [SI] 表示内存地址,因为MOV指令的源数据和目的数据位数相同,即AL寄存器可存放位数刚好等于SI的内存地址的位数。
CMP指令是一个比较作用,AL中的数值与0相比,如果AL=0; goto fin; JE指令是结果相等则跳转。
显示字符要跟显卡联系起来,INT 0x10是调用的0x10(16)号函数,在操作系统中控制显卡。查阅BIOS网页得出显示一个字符的格式:
AH=0x0e;
AL=character code;
BH=0;
BL=color code;
返回值:无
注意:beep、退格(back space)、CR、LF都会被当做控制字符处理
值得注意的是,BL中放入了彩色字符码,而我们这里赋值的是给BX,改变了BL的值,作者尝试修改颜色但只能显示白色,实际上的原因是这个窗口不能显示其他颜色字体,我们每次的run都是显示黑底白字,关于怎么显示其他颜色字体,书本后面会有介绍到。
解读fin:前面的HLT指令是让CPU进入待机状态的指令,只要外部发生变化,就会继续执行程序,但其实HLT指令的下一句就是死循环跳转指令,所以不写HLT指令也是可以的。不过耗电太大,考虑到资源问题所以加上HLT。
改写成c语言后就是如下:
Putloop:
AL=BYTE[SI];
SI=SI+1;
If( AL==0 ) { goto fin; }
AH=0x0e;
BX=15;
INT 0x10;
goto putloop;
Fin:
HLT;
goto fin;

**4、内容4:**先制作启动区。
把helloos.nas的后半部分(从msg部分后面的DB语句)截掉,保留512个字节,把文件名改成ipl.nas,然后保存。运行!cons_nt.bat后输入asm指令生成以下文件,
30天自制操作系统(day2)
30天自制操作系统(day2)
再用makeimg.bat文件生成helloos.img文件然后运行。(实际上可以直接将helloos4文件夹复制到tolset中)
30天自制操作系统(day2)
30天自制操作系统(day2)
5、makefile入门。
先用记事本输入以下内容,保存之后再把.txt后缀名去掉,就变成了makefile不带拓展名文件。
30天自制操作系统(day2)
30天自制操作系统(day2)
根据书本上解释:
ipl.bin : ipl.nas Makefile——制作ipl.bin之前检查ipl.nas和Makefile文件是否准备好,如果有这两个文件就执行下一行,下面的helloos.img也是一样的写法。
…/z_tools/nas.exe ipl.nas il.bin ipl.lst——打开当前目录(tolset文件夹)下z_tools文件夹下的nask.exe应用程序,在ipl.nas文件的基础上生成ipl.bin和ipl.lst文件
…/z_tools/edimg.exe imgin:…/z_tools/fdimg0at.tek wbinimg src:ipl.bin len:512 from:0 to :0 imgout:helloos.img——打开指定目录下的edimg.exe程序和fdimg0at.tek文件,生成一个长度为512字节的helloos.img文件
\是续行符号。
需要从tolset的z_new_w文件夹中复制make.bat过来制作make.exe。
用!Cons打开一个命令行窗口,输入“make -r ipl.bin”启动make.exe,它首先读取Makefile文件,寻找制作ipl.bin的方法,make.exe找到制作方法之后去执行其中的命令顺利生成ipl.bin
30天自制操作系统(day2)
30天自制操作系统(day2)
然后我们再输入“make -r helloos.img”启动make.exe按照指令执行。
30天自制操作系统(day2)
30天自制操作系统(day2)
如果删除helloos.img和ipl.bin之后输入“make -r helloos.img”命令,make会生成helloos.img文件,其中会先去Makefile寻找ipl.bin的生成方法,生成ipl.bin在生成helloos.img。
30天自制操作系统(day2)
30天自制操作系统(day2)
30天自制操作系统(day2)
如果不删除文件,再输入命令“make -r helloos.img”执行:
30天自制操作系统(day2)
改进:在Makefile文件里加入
img :
…/z_tools/make.exe -r helloos.img
这里img:——是命令名称
…/z_tools/make.exe -r helloos.img——是调用指定路径下的make.exe应用程序,然后执行helloos.img命令,实际上就相当于上面再命令窗口里输入的“make -r helloos.img”命令。
修改之后,我们只需要输入“make img”就可直接生成helloos.img了,此时可以删掉making.bat,再加入下面这些:
30天自制操作系统(day2)
这里asm:、run:、install:——是命令名称
其余的基本上都是打开指定路径下的应用程序来生成一些文件
copy helloos.img …\z_tools\qemu\fdimage0.bin——上次实验在run.bat中的指令,将helloos.img拷贝到指定路径下的fimage0.bin中。
…/z_tools/make.exe -C …/z_tools/qemu——打开执行路径下的make.exe应用程序并执行相应路径下的qemu文件夹里的程序,最终实现在屏幕上打印字符串。
加入之后,“run.bat”、“install.bat”都用不着了,现在只需要在命令窗口输入“make run”它就会首先执行“make img”, 然后再启动模拟器。也就是说,现在如果删除刚刚生成的文件之后,直接输入“make run”就可以显示输出文字啦!什么都没有,然后输入“make run”指令。
30天自制操作系统(day2)
30天自制操作系统(day2)
**二、遇到的问题及解决方法
1、描述问题1:**电子版代码有误。
做实验的时候我用的电子版,发现这里有一个人民币的符号(¥),当时由于不理解代码意思没当回事,但后来一直运行不了,在网上找到相应的教程之后才发现这里出错了。
30天自制操作系统(day2)
解决方法:将这个人民币符号(¥)修改为“\”之后就可以正常运行,这里表示换行符号,太长了写不下,跳到下一行继续写
**2、问题2:**在制作好Makefile文件后编译出现问题。
30天自制操作系统(day2)
解决方法:导致该问题的原因在Makefile文件中,命令行必须要以tab键开头,否则将编译不成功。
三、程序设计创新点
使用makefile打开其他的软件?