实验日期 | 实验项目 |
---|---|
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语言,并设计图形界面,对后续的实验也是越来越期待了。