汇编、连接与执行程序
汇编、连接与执行程序的基本过程可以这样大致地叙述:用汇编语言进行编码的符号指令称为源程序;用汇编程序把源程序翻译成机器码,称为目标程序;用连接程序完成对目标程序的机器寻址,生成可执行模块。可执行模块存储在磁盘上,当我们需要它执行的时候就把它加载到内存中执行。
下面是对这三个过程更为详细的分析:
1. 汇编步骤。汇编程序把源代码转换成机器码,若源代码有错误则显示出错信息。若没有错误,汇编程序为数据段中的每个数据项和代码段中的每条指令计算偏移值;汇编程序还要在所产生的.OBJ模块前面直接建立一个首部(header),首部的一部分包含不确定的地址信息。最终产生中间的.OBJ文件。
2. 连接步骤。连接程序完成以下任务:确定由汇编程序遗留下来的不确定的地址;如果需要,可以把一个以上分别汇编的模块组合成一个可执行程序;产生.EXE模块并用专门的指令把它初始化,以便它为了执行而接着被装入。
3. 执行程序。这是最后一步,我们要装入准备执行的程序。装入程序知道程序将要装入到内存的哪个地方,所以它能解决首部仍无法确定的任何余下的地址。装入程序略去首部并在程序装入内存之前直接建立程序段前缀(PSP)。
对于最后一步执行程序,下面有更详细的说明(以EXE可执行程序为例):
在要求系统把.EXE程序从磁盘装入内存时,装入程序进行以下步骤:
1. 从磁盘上取.EXE文件;
2. 在可用内存的一个段边界上,构造一个256字节的程序段前缀(PSP);
3. 紧随PSP的下一地址,把程序装入内存;
4. 把PSP地址装入DS和ES寄存器;
5. 把代码段地址装入CS寄存器并把IP寄存器设置成代码段中第一条指令的偏移值(通常是0);
6. 把堆栈段地址装入SS寄存器并把SP寄存器的值设置成堆栈的大小;
7. 传送控制给要执行的程序,通常从代码的第一条指令开始。
关于程序段前缀和装入程序:
装入程序:装入程序可处理所有的与指定的基地址或起始地址有关的可重定位的地址。装入程序使得可执行代码更加灵活,但是装入处理通常是在后台(作为操作环境的一部分)或与连接相联合时才发生,装入程序极少会是实际的独立程序。
程序段前缀:在程序所占内存空间的前256个字节中,系统会为程序创建程序的前缀(PSP)的数据区,DOS要利用PSP来和被加载程序进行通信;PSP内有程序返回、程序文件名等信息。