引言
学习到现在,我们已经进入到汇编开发的10%了,回顾我们之前讲述的知识,还有一些比较零散的知识点需要给大家补充一下。这些知识点严格上来说,学与不学并不会影响到我们后续的汇编开发学习,但是了解了会增加我们对底层开发的理解和认知,总体来说还是有些许帮助的。
那么,本片博文中,我们将主要讲解以下知识点:
1、程序的装载
2、内存中的安全空间
现在就让我们开始学习吧~
装载程序
还记得我们学习的第一个汇编源程序 s1.exe吗?我们是如何执行它的呢?
我们是在DOSBox虚拟的DOS系统一个黑窗口里,直接输入 s1.exe 进行了执行:如下图:

那么我们就可以说,是这个“黑窗口”完成了 s1.exe 可执行程序的装载、运行工作。那么,这个黑窗口的真身是什么呢?
操作系统的外壳
众所周知,一个操作系统是由多个功能模块组成的庞大复杂的软件系统,本质上来说是由一个个子程序组成的复合程序。任何一个操作系统都需要对外界开放一个可操作可处理的接口,接口由一个单独的程序进行管理,这程序被称为shell(外壳),用户通过这个程序便可以操作计算机系统进行工作。我们现在的Windows10系统,大家都熟悉的命令提示符就是它的shell程序。
DOS系统内也有对应的shell程序:command.com,这个程序在DOS中称为命令解释器,也就是我们上面寻找的“黑窗口”真身。
DOS系统启动时,先完成一些重要的初始化工作,然后便会启动command.com,command.com运行后便会开启一个背景黑色的窗口,窗口内显示出由当前盘符和当前路径组成的提示符,比如上面图片中的“C:\>”,然后等待用户的输入。
用户可以输入所要执行的命令,比如 cd、dir等,这些命令会由command去执行,command执行完成后,会显示出执行结果,并再次显示出当前盘符和当前路径组成的提示符,等待用户的再次输入。例如我们执行 dir,如下图所示:

现在我们说执行程序的过程。如果用户想执行一个程序,则需要输入该程序的可执行文件名,command首先根据文件名找到可执行文件,然后将这个可执行文件中的程序加载进内存中,并设置 CS:IP 指向程序的入口。由于 CS:IP 已经被修改为程序的入口,所以command程序便会暂停运行,CPU便开始运行刚才被加载进内存中的程序。程序运行结束后,返回到command程序,command便再次显示出当前盘符和当前路径组成的提示符,等待用户的再次输入。
整体流程如下:

图中的流程相信小伙伴们都会看的很清楚了,那么现在我们可以准确的说,是又command.com完成了 s1.exe 可执行程序的装载、运行工作。
程序加载过程
下面我们就来看看DOS系统中 .exe文件中的程序的加载过程。在说这个之前,我们先聊一个有趣的现象。
我们已经学过了使用Debug加载程序,并对其进行调试和追踪,就是不知道大家有没有注意到,Debug在没有加载程序的时候,相比较Debug加载了程序的时候,此时的寄存器会发生了什么变化呢?
如下图所示,这是Debug没有加载程序的时候:

这个则是Debug加载了程序的时候:

本文详细讲述了汇编开发中程序的装载过程,重点介绍了DOS系统中.exe文件加载机制,Debug工具的作用,内存中的安全空间及其重要性,包括PSP、中断向量表和安全空间的使用。通过实例演示和实验,加深对底层编程的理解。
最低0.47元/天 解锁文章
2727

被折叠的 条评论
为什么被折叠?



