30天自制操作系统——第2天实验总结

实验日期实验项目
2020.10.10第2天 汇编语言学习和Makefile入门

一、实验主要内容

1、 内容1 汇编指令制作映像文件

(1).内容概要

  • 实验内容:了解常见的汇编指令的含义,学会使用MOV,DB,ORG等指令;熟悉常用的寄存器的作用和用法,能够将汇编指令编写的代码制成映像文件,并成功运行。
  • 实验重点:汇编语言的基础入门,会使用MOV,JMP,ADD,CMP,JE,HLT等指令,掌握一些寄存器的使用,如存放地址的寄存器BX,BP,SI,DI以及内存的介绍和作用。

(2).关键代码分析

  • FAT12软盘的代码固定,在第1天的实验中已经进行了分析,这里不做展示。
  • 程序核心代码分析
ORG指令:告诉编译器,把这些机器语言指令装载到内存中的哪个地址。
entry部分
		MOV		AX,0	   ; 初始化寄存器
		MOV		SS,AX      ;初始化段寄存器
		MOV		SP,0x7c00  ;0x7c00表示程序的装载地址
		MOV		DS,AX     ;段寄存器DS,DS是一个默认的段寄存器。MOV CX [DS:1234]  等价于 MOV CX [1234][DS:1234]表示DS*16+1234,所以开始DS必须初始化为0
		MOV		ES,AX
		MOV		SI,msg    ;将输出信息存放的标号赋值给SI,msg可以看做是一个标号,代表的是一个地址信息

在entry部分中涉及到了常见的寄存器,总结如下

	AX——累加寄存器       CX——计数寄存器
	DX——数据寄存器       BX——基址寄存器
	SP——栈指针寄存器     BP——基址指针寄存器
	SI——源变址寄存器     DI——目的变址寄存器
	段寄存器
	ES——附加段寄存器     CS——代码段寄存器
	SS——栈段寄存器       DS——数据段寄存器
	FS——没有名称         GS——没有名称

可以存放地址的寄存器:BX,BP,SI,DI
寄存器AX,CX,DX,BX可以分为高8位和低8位表示,以AX为例,AX的高8位表示为AH,低8位表示为AL。

putloop部分
		MOV	AL,[SI]         ;取内存中地址为SI对应的一个字节的信息给AL
		ADD		SI,1	    ; SI加1
		CMP		AL,0        ;将AL和0进行比较,并设置标志位
		JE		fin         ; 如果AL为0,说明已经全部显示,跳转到fin对应的地址处执行
		MOV	AH,0x0e	        ; 显示一个字符
		MOV	BX,16		    ; 指定字符颜色
		INT		0x10		; 中断调用显卡BIOS
		JMP		putloop     ;循环执行

在putloop部分中进行数据传送的格式为MOV 目的操作数,源操作数,其中目的和源操作数的为内存地址时,固定格式为数据大小 [地址],表示从指定内存地址中取出多少字节的数据。

fin部分
		HLT						; 使得CPU进入待机状态,等待命令。HLT表示让CPU进入待机状态,当有外部操作时,CPU从待机状态苏醒,继续执行程序。
		JMP		fin				; 无限循环
msg部分
DB		0x0a, 0x0a		; 换行
		DB		"hello, world"  ;显示信息的内容
		DB		0x0a			; 换行
		DB		0
		RESB	0x7dfe-$		; 启动装载地址加上启动区大小得到0x7dfe,$表示前面占用的字节数
		DB		0x55, 0xaa  ;启动盘的结束标志

2、 内容2 启动区和磁盘映像文件分开制作

(1).内容概要

  • 实验内容:使用nask制作512字节的启动区,剩下部分使用磁盘映像管理工具来制作。
  • 实验重点:启动区和磁盘映像文件制作的步骤和方法。
    启动区的制作步骤
	在原有helloos.nas的基础上只保留512个字节的部分,其余部分删除,即DB 0x55 0xaa以后的内容删除,并将文件命名为ipl.nas。
磁盘映像文件的制作步骤
	a.	使用笔者的edimg.exe工具将启动区的汇编代码转化为机器代码ipl.bin,并输出ipl.lst列表文件(ipl.lst可以用来确认每个指令是如何翻译成机器指令的)
	b.	以机器代码ipl.bin为基础,制作helloos.img。首先读入一个空的磁盘映像文件,将ipl.bin写入这个空的磁盘映像文件的开头,最后生成helloos.img文件。

(2).关键代码分析

  • ipl.nas文件的代码内容和内容1的代码基本一致,这里不做过多分析。
  • asm文件分析
..\z_tools\nask.exe ipl.nas ipl.bin ipl.lst

…表示返回上一级目录,在z_tools的文件夹中利用nask.exe工具将ipl.bin文件上生成ipl.bin

  • Makeimg文件分析
..\z_tools\edimg.exe   imgin:../z_tools/fdimg0at.tek   wbinimg src:ipl.bin len:512 from:0 to:0   imgout:helloos.img

在z_tools的文件夹中利用edimg.exe工具,读入一个空磁盘映像文件fdimg0at.tek,wbinimg src:ipl.bin len:512 from:0 to:0 表示将大小为512字节的ipl.bin文件的从第0个字节到第0个字节之外的内容写入fdimg0at.tek,最后生成helloos.img。

3、 内容3 使用Makefile文件实现

(1).内容概要

  • 实验内容: 了解Makefile文件的使用格式,学会使用Makefile文件和make.exe工具制作磁盘映像文件。
  • 实验重点:Makefile文件的编写和实现;make.exe工具的使用,对于已经存在的文件,生成会提示已经生成过;对于不同的文件会提示重新生成。

Makefile文件就是其实就是将多个批处理指令合到一起,只结合make.exe使用就可以实现自动的执行程序指令或者是执行某些指令。Makefile文件格式如下:

	target:dependency
	(tab)command
其中target表示需要生成的目标文件;dependency表示生成目标文件所需要的依赖文件;command表示生成目标文件的编译规则命令行

(2).关键代码分析

  • ipl.nas文件的代码内容和内容1,2的代码基本一致,这里不做过多分析。
  • make.bat文件分析
..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9

返回到上一级z_tools中使用make.exe工具,其中%1 %2 %3 %4 %5 %6 %7 %8 %9表示传入参数的数据,这里传入参数有9个,对应到Makefile文件中就是有9条指令。

  • Makefile文件分析
ipl.bin: ipl.nas Makefile
    ../z_tools/nask.exe ipl.nas ipl.bin ipl.lst

helloos.img:ipl.bin Makefile
    ../z_tools/edimg.exe imgin:../z_tools/fdimg0at.tek \
        wbinimg src:ipl.bin len:512 from:0 to:0  imgout:helloos.img

这部分代码是制作磁盘映像文件的指令。第1行的表示如果ipl.nas和Makefile文件都在,则执行下面的指令生成ipl.bin文件。同理第4行代码表示如果ipl.bin和Makefile文件都在,则执行下面的指令生成helloos.img文件。

#生成映像文件
img:
    ../z_tools/make.exe -r helloos.img
#生成启动区对于的二进制文件
asm:
    ../z_tools/nask.exe ipl.nas ipl.bin ipl.lst
install:
    ../z_tools/imgtol.com w a: helloos.img
#运行程序
run:
    ../z_tools/make.exe img
    copy helloos.img ..\z_tools\qemu\fdimage0.bin
    ../z_tools/make.exe -C ../z_tools/qemu
#删除文件
clean:
    -del ipl.bin
    -del ipl.lst
#调用clean指令清除除了源文件之外的所有文件
src_only:
    ../z_tools/make.exe clean
    -del helloos.img

二、遇到的问题及解决方法

1、 描述问题1

  • 问题描述

执行make –r hellood.img时,没有任何显示,且cmd终端一致在输出make –r hellood.img。
在这里插入图片描述

  • 解决方法

对照教材修改Makefile和make.bat文件中的内容。修改后,程序不再显示这个错误。

2、 描述问题2

  • 问题描述

输入make命令时(使用make指令时,没有带参数时,默认执行最前面的指令,这里将make run写在最前面的指令里边了),显示找不到系统文件。
在这里插入图片描述

  • 解决方法

在default里边加上make img,首先生成helloos.img 映像文件,或者在run里边加上…/z_tools/make.exe img生成helloos.img。这个错误的出现也提醒我们,在执行对应指令时,应该看所需的文件是否已经存在,如果不存在,make.exe可以自己根据执行前的指令事前生成吗?如果不能,则需要手动加入生成。

三、程序设计创新点

1、 描述创新点1,关键代码及结果截图

  • 创新点1

使用Makefile文件简化执行过程,源程序执行需要首先输入make img生成helloos.img,再执行make run运行。现在写一个default在Makefile文件的最前面,其内容包含了make img和make run,这样在执行的时候只需要输入make即可完成执行程序。

  • 关键代码
default :
    make img
    make run

make img表示使用make.exe去读取Makefile中img的内容,并执行,这里作用是生成映像文件。make run表示使用make.exe去读取Makefile中run中的内容,并执行,这里的作用是使用qemu软件模拟执行这个程序。
其余代码部分和内容3一致

  • 结果截图
    在这里插入图片描述

2、 描述创新点2,关键代码及结果截图

  • 创新点2

在生成/删除文件后,在终端使用dir显示当前文件夹的文件,看是否生成/删除成功;使用Makefile文件中的命令用记事本打开汇编代码文件ipl。

  • 关键代码
default :
    make img
    make run
    dir
    start "" "./ipl.txt"
    make clear_all_wg
    dir

make img和make run与创新点1一致。dir是显示当前文件夹下的所有文件信息, start是打开当前路径下的ipl.txt文件,make clear_all_wg是清空所有除了源代码以外的所有文件。
其余代码部分和内容3一致

  • 结果截图
    在这里插入图片描述在这里插入图片描述

四、实验心得体会

  • 本次实验是自制操作系统的第2天,主要以第1天的例子为例,介绍汇编语言的相关指令和寄存器的知识,并讲解了一个十分好用的工具Makefile文件。由于之前学会计算机系统已经有了汇编语言的一定基础,在阅读教材的时候比较容易理解。学会了使用Makefile,Makefile文件的好处就是减少了批处理文件的个数,将所有批处理命令集中到一起,只需要调用make.exe即可使用多个命令。
  • 在这次实验中创新只是将程序的执行变得更加简洁,使用Makefile打开ipl的汇编文件,同时也启示我是否可以使用Makefile用特定软件打开特定的文件,这一点暂时还没有实现。从这里可以看出Makefile的作用还是蛮多的,可以进一步去学习和发现。实验进行到第2天,还是比较简单的基础知识的介绍,做完第2天的内容后,大致浏览了第3,4天的内容,可以导入C语言,并设计图形界面,对后续的实验也是越来越期待了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值