前言

本文仅作记录用,谨慎参考

实验主要内容

内容1:寄存器介绍以及汇编代码的入门
a) 寄存器介绍
《三十天自制操作系统》第二天
b) AT&T汇编指令与Intel汇编指令的区分
 Intel代码省略了指示大小的后缀,我们看到的指令是mov,而不是movb/movw/movl
 Intel代码省略了寄存器名字前面的’%’符号,用的是AL,而不是%AL;
 Intel代码用不同的方式来描述存储器中位置。例如,是’ DWORD PTR (ebp+8) ‘而不是’ 8(%ebp) ‘;
 在带有多个操作数的指令情况下,列出操作数的顺序相反;
Cmp S1, S2指令,在Intel格式的汇编指令中利用S1-S2的结果与0进行比较来判断是否跳转;而在AT&T格式中利用S2-S1的结果与0进行比较来判断是否跳转。

内容2:制作启动区
a) Helloos3:在Day01 helloos.nas文件的基础上添加该段程序
《三十天自制操作系统》第二天
 程序的装载地址0x7c00是规定;
 有了ORG指令之后$的含义也不再指输出文件的第几个字节,而是代表将要读入的内存地址;
 entry用于指令JMP指令的跳转目的地,entry是0x7c50;
像entry和msg一样,每个标号对应的数字,是由汇编语言编译器根据ORG指令计算出来的。标号的值即为“标号的地方对应的内存地址”;
 只有BX、BP、SI、DI这几个寄存器才可用来指定内存地址,剩下的AX、CX、DX、SP不能用来指定内存地址,因为CPU没有处理这种指令的电路/机器语言;
《三十天自制操作系统》第二天
 MOV指令规则:源数据和目的数据必须位数相同;
 INT 0x10代表调用0x10(即16)号函数;即调用视频显示I/O的函数
 HLT指令是让CPU停止动作的指令(不是彻底停止CPU的动作),而是让CPU进入待机状态
通过利用C语言对这段汇编代码进行模拟,可以发现这段代码实现的功能其实就是将”helloo, world”一个字符一个字符地显示出来。
《三十天自制操作系统》第二天
利用Day01天的操作步骤,可以得到显示结果,此处就不赘述了。
《三十天自制操作系统》第二天
《三十天自制操作系统》第二天
b) Helloos4:将截掉启动区以外部分的输出后得到的文件改名为ipl.nas(启动区只需要最初的512个字节);生成一个asm.bat文件和makeimg.bat文件;利用Day01的方法同样生成install.batrun.bat文件;同理,将tolset\z_new_o文件夹下的两个文件”!cons_9x.bat”、”!cons_nt.bat”复制到helloos4文件夹下面;双击”!cons_nt.bat”打开如下页面,输入”asm”生成ipl.bin文件和ipl.lst文件,输入”makeimg”生成磁盘映像文件helloos.img,再执行”run”命令,则可以得到与方法一相同的结果
《三十天自制操作系统》第二天
《三十天自制操作系统》第二天
c) Helloos5:也就是内容3中利用Makefile文件将指令集合统筹起来的方法;详情请看内容3;

内容3:Makefile入门
Makefile是一个批处理文件,其实我们可以将它理解为一系列指令的集合。
 Makefile的命名规范(以ipl.bin为例)
《三十天自制操作系统》第二天
此处的ipl.bin是目标文件,ipl.nas和Makefile是目标文件所依赖的源文件,下面一行是命令。
从这个规则可以看出:
① 文件的依赖关系,ipl.bin依赖于ipl.nas和Makefile的文件,如果ipl.nas和Makefile的文件日期要比ipl.bin文件日期要新,或是ipl.bin不存在,那么依赖关系发生。
② 如果生成(或更新)ipl.bin文件。也就是下面那行命令,说明了通过打开…/z_tools目录下的nask.exe程序,根据ipl.nas生成ipl.bin和ipl.lst两个文件
 Makefile的编写
《三十天自制操作系统》第二天
其中src,len,imgout,from,to,imgin都是执行edimg.exe的参数
《三十天自制操作系统》第二天
 通过make.exe运行Makefile
将tolset\z_new_o文件夹下的两个文件”!cons_9x.bat”、”!cons_nt.bat”复制到helloos4文件夹下面;双击”!cons_nt.bat”打开如下页面,输入命令即可执行相应指令。
《三十天自制操作系统》第二天
《三十天自制操作系统》第二天
《三十天自制操作系统》第二天
运行make run之后得到的结果与前面运行的结果一致
《三十天自制操作系统》第二天
也可以将…\tolset\z_new_w目录下的make.bat文件复制到helloos5文件夹中,双击即可生成一系列的文件,运行结果与上图一致
《三十天自制操作系统》第二天
其中-r是make命令的一个参数,意思是“禁止make使用任何隐含规则”;”\”用于换行。

遇到的问题以及解决方法

1、 为什么程序的装载地址是0x7c00,难道不能是别的地址吗?
解决方法:谷歌了一下,查询结果如下

  • 我们这里的程序其实就是一个主引导记录(在后面会阐明)
    0x7c00算是一个历史遗留问题,这个地址来自Intel的第一代个人电脑芯片8088,以后的CPU为了保持兼容,一直使用这个地址。那么为什么是0x7c00呢?
  • 1981年8月,IBM公司最早的个人电脑IBM PC 5150上市,就用了这个芯片。当时,搭配的操作系统是86-DOS。这个操作系统需要的内存最少是32KB。我们知道,内存地址从0x0000开始编号,32KB的内存就是0x0000~0x7FFF。
  • 8088芯片本身需要占用0x0000~0x03FF,用来保存各种中断处理程序的储存位置。(主引导记录本身就是中断信号INT 19h的处理程序。)所以,内存只剩下0x0400~0x7FFF可以使用。
  • 为了把尽量多的连续内存留给操作系统,主引导记录就被放到了内存地址的尾部。由于一个扇区是512字节,主引导记录本身也会产生数据,需要另外留出512字节保存。所以,它的预留位置就变成了:0x7FFF - 512 - 512 + 1 = 0x7C00 。0x7C00就是这样来的。

2、 计算机是如何启动的,中断又是什么呢?
解决方法:肯定是谷歌啊!
可以了解到计算机启动大致是一个这样的过程:
① 通电
② 读取ROM里面的BIOS,用来检查硬件
③ 硬件检查通过
④ BIOS根据指定的顺序,检查引导设备的第一个扇区(即主引导记录),加载在内存地址 0x7C00
⑤ 主引导记录把操作权交给操作系统
在计算机科学中,中断(英语:Interrupt)是指处理器接收到来自硬件或软件的信号,提示发生了某个事件,应该被注意,这种情况就称为中断。中断向量表用于查询相应中断服务程序的入口地址。如:
《三十天自制操作系统》第二天
3、 输入命令”make install”时,无法执行
《三十天自制操作系统》第二天
导致该问题的原因是作者提供的16位的应用程序与64位的操作系统不兼容,目前没有找到解决方法。
4、 通过修改BX寄存器中的值无法成功修改显示字符的颜色
《三十天自制操作系统》第二天
详情请见创新点部分

程序设计创新点

  1. 在80 x 25的文本模式下,显存地址为0xB8000~ 0xBFFF;通过修改显存地址的值来达到控制显示文本。
    此模式下每2个内存地址为一组,32位代表一个文字输出: 高地址16位为颜色信息,低地址16位为文字信息,因此我们可以通过修改这段显示地址区域的值,从而来控制屏幕输出文字。
    可以看到无论是利用第二天还是第一天的知识都没有办法让它成功显示。
    《三十天自制操作系统》第二天
    《三十天自制操作系统》第二天
    换个汇编器试试!
    《三十天自制操作系统》第二天
    将color.asm文件复制到NASM汇编器的安装路径下,双击nasmpath.bat后输入”nasm color.asm -o coloros.img”即可生成软盘镜像文件coloros.img

《三十天自制操作系统》第二天
《三十天自制操作系统》第二天
《三十天自制操作系统》第二天
使用虚拟机显示文本!
《三十天自制操作系统》第二天

  1. 通过使用Makefile实现卸载程序
    (1) 新建一个文件夹test02,并将…\tolset\z_tools下的make.exe程序复制到该文件夹下面
    编辑Makefile文件,让它可以执行F:\Game\plansVSzombies\PlantsVsZombies目录下的卸载程序(也可以使用相对路径)
    《三十天自制操作系统》第二天
    《三十天自制操作系统》第二天
    同时在test02文件夹下面新建一个run.bat文件,内容为执行cmd.exe
    《三十天自制操作系统》第二天
    以管理员身份运行run.bat程序,将目录切换至test02所在目录,输入make uninstall即可弹出卸载提示框!
    《三十天自制操作系统》第二天

参考链接如下:
https://baike.baidu.com/item/%E4%B8%AD%E6%96%AD%E5%90%91%E9%87%8F%E8%A1%A8
http://www.ruanyifeng.com/blog/2015/09/0x7c00.html
http://www.ruanyifeng.com/blog/2013/02/booting.html
https://blog.csdn.net/farmwang/article/details/49932771
https://blog.csdn.net/tianmohust/article/details/6280575
http://www.ruanyifeng.com/blog/2015/02/make.html
https://www.nasm.us/pub/nasm/releasebuilds/2.14.03rc2/win64/

相关文章: