汇编网首页登录博客注册
masmaster的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
文章收藏

[2010-07-25 17:27] .COM程序和.EXE程序

以com或exe为扩展名的程序称为暂留程序(相对于驻留程序而言),它通常被转入到足够容纳程序的内存段中执行。当程序执行完毕,扎用的内存也随之释放。如有必要暂留程序可以把一部分代码保留在内存中,这样的程序叫做内存驻留程序(TSR)。
当程序被加载到内存时,MS-DOS在程序的开始为其创建一个特殊的256字节的信息块,称之为程序段前缀(PSP)。PSP结构:
------------------------------------------------------
偏移    内容
80--ff  用于存放dos命令行的副本,和默认的磁盘传输缓冲
5c--7f  FCB1和FCB2.
3e--5b  MS-DOS保留
2c--2d  当前环境字符的段地址
16--2b  MS-DOS保留
00--15  DOS指针和中断向量
-------------------------------------------------------

COM程序:
COM程序时未经修改的机器语言程序的二进制映像。 DOS会把COM程序加载到最低可用的段地址。并在偏移地址0处创建一个256字节的PSP,代码,数据和堆栈都位于同一物理段(或逻辑段)中。COM程序的最大程度64KB,其中代码占用空间不能超过64KB减去PSP的256字节以及为堆栈保留的两个字节。见图:
-------------------------------------------------------
0000 0100                                      FFFE
-------------------------------------------------------
|PSP|Code segmeng|Date segment                  |stack|
|-----------------------------------------------------|
  |
  V
CS,DS,ES,SS

所有的段寄存器都被设置为指向PSP的基地址,代码段从0100H开始, 数据段紧跟在代码段之后, 栈段在段的最低端。DOS把sp初始化为FFFE 。

要声明一个程序为COM程序, 必须把代码段的起始地址初始化为100H,如:
org 100H
在运行link的时候, 必须使用/T参数。
COM程序的特点是体积小巧,不能用在多任务环境。

EXE程序:
EXE程序由EXE文件头和紧跟其后的可转载程序模块组成。 后面的可装载程序模块才是程序本身。程序头并不装入内存。它只包含一些MS-DOS加载和执行程序时的信息。
MS-DOS加载EXE程序时在最低可用地址创建PSP,程序则在PSP之上。MS-DOS把DS和ES设置为指向程序的加载地址(就是PSP起始地址);CS和IP设置为代码的入口地址,程序将从入口地址处开始执行。SS被设置为指向堆栈的开始,SP则为栈段大小。
如图:
-------------------------------------------------------
       偏移地址
00    20      40           100
-----------------------------------------|
|代码段|                             64kb|
-----------------------------------------------|
       | 数据段|                           64kb| 
       |----------------------------------------------|
      20      |栈段        |                      64kb|
              |---------------------------------------|
              40           100
-----------------------------------------------------  

EXE程序最多可以使用65535个段。如果程序需要多个数据段, 那么程序员必须手动设置ES和DS。以访问每个数据段。

EXE程序在连接的时候可以用/CP参数设置做多分配的内存数量。例如:
link /cp:1024 myprog ;分配1024个16字节为单位的数目

EXE文件头包括:
1,重定向表,包含程序加载时要重新计算并加以修正的地址。
2,EXE程序的大小,以512字节为单位
3,最小内存分配数量:在程序映像之上需要的最小内存数量(按节计算,一节等于16字节)
4,最多内存分配数量:在程序映像之上需要的最多内存数量(按节计算)
5,IP和SP的初始值
6,栈段和代码段距离加载模块开始的偏移(以节为单位)
7,文件校验和。向内存中装入程序时捕捉数据错误。
评论次数(0)  |  浏览次数(468)  |  类型(汇编语言笔记) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码