以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,文件校验和。向内存中装入程序时捕捉数据错误。
- [somniumchase] 我一运行就说没有数字 01/01 11:44
- [游客] 为什么啊 08/07 15:36
- [游客] 如果想快一些 就改下面这里 dx值改成1H delay: push ax 04/19 02:53
- [lshhjx] 注释在程序中很重要,楼主不知道吗? 12/08 13:40
- [biaggi] 看不明白,在下還須學習 11/06 08:11
- [游客] 我运行的时候直接显示Unkown filename跳出了- -请问怎么改 06/16 21:44
- [游客] 勿庸置疑,注释是好习惯。与人方便自己方便。 04/12 10:33
- [游客] 老实说,看着真心累呀! 04/07 18:37
- [游客] 很无语,初学者就多看书,不要动不动要别人注释,基础打好了,再自己注释,这样比别人帮你注释好得多 12/17 19:43
- [dgkepu] 初学者:不懂,希望有多点注释带着学习学习! 12/07 20:52
- [游客] windows 7是一个64Bit操作系统,它不兼容DOS,无法识别16Bit系统。重装系统wind 02/28 21:05
- [游客] windows 7是一个64Bit操作系统,它不兼容DOS,无法识别16Bit系统。重装系统wind 02/28 21:05
- [466987333] 你好,高手,我想请教一个问题。 我用的是win7操作系统,32位的,里面没有找masm目录,是不是 12/12 17:30
- [lanfioncc] 那个太高级了。。。我还有点看不懂。。不过谢谢!!! 11/27 11:23
- [yc2010] 实验16中的 table: dw sub1,sub2,sub3,sub4 可不可以改成呢? 09/11 09:08
- [yc2010] mov bl,ah mov bh,0 add bx,bx ----------->这里为 09/07 21:03
- [yc2010] 为什么要add bx,bx呢? 09/07 20:55
- [yc2010] 那是不是像table[bx],ds[bx]....等(内存单元)都是表示一个字节呢? 09/06 21:10
- [masmaster] 杨季文的《80X86汇编语言程序设计教程》 09/01 12:52
- [游客] to masmaster shl左移4位,那al传进来的4,5,6位背景色不就没了. 为什 09/01 11:00