.com和.exe

.COM文件和.EXE文件是汇编语言及很多高级语言源程序经汇编或编译而形成的最终文件。在DOS下这两类文件都可由用汇编语言指令编写的源程序别,但它们的文件结构、加载执行过程和引用等方面都存在着较大的区别。经汇编、链接、转换等生成,即它们产生和运行环境并无本质上的区别。

1.结构特征的区别

.COM文件中的结构特征:

.COM文件是一类规模较小、结构较简单的可执行文件

该类文件只能有一个段,即代码段,有关数据和变量的定义纳入代码段中,不可再设立堆栈段、数据段和附加段

文件长度不能查过64KB(实际上不能超过65024字节,因为还要家去256字节的文件前缀PSP和256字节的初始堆栈段以及2字节的堆栈指示字)

文件中所包含的子程序必须是段内属性的(即NEAR过程)

多模块连接而成的.COM文件,各目标模块必须具有相同的段名和类别

.EXE文件的结构特征:

允许设立各种段;且美中段都允许设立若干个,数据段又可悲多个程序所共享,特别设和于多用户实时任务的环境, 因此,文件可以充分有效的利用内存空间,它的总规模只受当前内存可用空间的限制

其实的偏移地址可随具体应用问题用编者用ORG指令确定,而不必一定100H或0000H,通常系统默认0000H开始

除主程序(过程)必须具有段间调用属性(FAR)外;文件中各个子程序可视具体调用情况定位NEAR或FAR或两者兼有

可由不同的目标模块经连接而生成.EXE文件,只要各模块内对应各种段定义的参数正确,它们将可以取相同或不同的名字,但应保证:只有在主模块末尾指明程序执行入口起始标号,并且至少有一个具有“STACK”组合类型属性的堆栈段

2.文件加载过程的区别

在加载执行每个程序时,DOS系统的command自动将当时可用内存空间的最低端作为命令程序的加载起点,首先生成一个成为程序浅醉控制块PSP的存储块,其长度固定为256字节,分为13个域,它包含了相应程序的启动、执行和结束的信息,也就是提供DOS本身使用的入口信息,供别加载程序使用的入口信息以及供被加载程序使用的传递参数,由于程序在编制过程中, 只有偏移地址是相对固定的,而所有段地址是不能预先确定的(即浮动的),有多个目标模块连接运行时更是如此,这些段值只能根据随机加载运行时可用内存的情况进行实时确定,故PSP就是程序加载、定位、运行和返回的根本依据

在这一过程中,.COM文件由于结构上的单一、紧凑,只有一个短,加载过程中无需段的重定位(无文件头),DOS的EXEC子功能只需在当前可用内存的最低端,建一个相应的程序段前缀PSP,然后再紧靠PSP上方, 将盘上的.COM文件印象原封不动的装入,并将控制转到PSP+100H处,程序即可顺利运行,因此,也称.COM文件的加载为”映像加载“

而.EXE文件由于具有多段、多模块的结构,在连接过程中形成了前述的”文件头“,其中包含有段重定位的信息,因此,系统对.EXE文件的加载要分4步:

生成程序段前缀PSP

装入“文件头”,由“文件头”确定被装载文件在内存的起点,由此起点原封不动的装入.EXE文件

根据当前内存情况修改文件中的段值,以文成段的重定位

最后为段寄存器和有关指针寄存器提供初值

3.在应用方面的区别

.COM文件由于结构单一、紧凑,其内容只有构成程序的二进制机器代码组成,因此具有节省存储空间,加载运行速度快等特点,实际应用中,主要用来解决不太负载、程序规模不塌的一些问题,有时也把它作为大型应用程序的引导程序。另外,还可以用debug工具的A、E、N、R、W等命令直接编制、调试、生成小巧实用的.COM文件;而不必经过汇编、连接和转换等步骤,非常之方便,但由于.COM文件单一段的结构,使它的文件长度被限制在64KB之内,因此,它的功能是很有限的。

而.EXE文件可将程序分成多个不同的部分来处理,注重编程的模块化,条理清楚,层次分明,各模块可以在明确各自的功能和相互之间的连接预定以后独立编写、调试,然后再把它们连接起来成为一个完整的、功能较齐全的程序文件(即.EXE文件)


最主要的区别只有一个:

COM程序没有头部控制信息,只有二进制代码;

EXE程序会有一个头部控制信息,控制EXE的二进制代码。
这个主要区别就决定了他们之间会有许多的差别:
1:COM程序的入口地址是固定的,为100h;exe程序的人口地址可以随意,由end 后面的标号决定。
2:COM程序的数据和代码段是混合在一起的,因为COM没有能力识别数据段开始的位置。
3:COM程序只能有一个代码段,而不能有更多,这也决定了COM程序的大小最多为64K。
从本质上来看,COM和EXE保存的都是机器代码。因此,我们在某些情况下,把EXE程序的头部去了,并做适当的修改,就可以转化为COM程序;COM程序加多一个头部,就可以变成EXE程序。
EXE程序可以分为DOS下的EXE程序和WINDOWS下的EXE程序,两种程序的头部结构是不同的。其中WINDOWS下的EXE程序是采用PE结构的。


下面是一个简单的.COM文件的例子,该文件的功能是在屏幕上显示“Hello, this is a com file !”
code segment                                        ;代码段定义
org 100h                                                ;起始地址
assume cs:cade, ds:code
disp proc near
mov dx, offset msg
mov ah, 09h
int 21h
mov ax, 4c00h
int 21h
disp endp                                              ;过程结束
msg db 0dh, 0ah,'hello, this is a .com file !'
db 0dh, 0ah, '$'                                     ;字符串定义
code ends                                             ;代码段结束
end disp                                                ;程序入口

此程序只有一个段(代码段),且用伪指令ORG将起始地址定在100H处,有关数据变量的定义如msg也在代码段中

……………………………………………………………………………………………………………………………………

下面举一简单的.EXE文件例子:

code segment word public 'code'                           ;定义代码段
assume cs:code, ds:data, ss:stack
disp proc far
mov ax, data                                                          ;传送数据段地址
mov ds, ax
mov ax, stack                                                        ;传送堆栈段地址
mov ss, ax
mov ah, 09h
mov dx, offset msg
int 21h
mov ax, 4c00h
int 21h
disp endp
code ends
;————————————————————————————————————————————————
data segment word public 'DATA'
msg db 0dh, 0ah, 'Hello, this is a .exe file !'
db 0dh, 0ah, '$'
data ends
;—————————————————————————————————————————————————
stack segment para stack 'STACK'
db 128 dup(?)
stack ends
;—————————————————————————————————————————————————
end disp


阅读更多
个人分类: 汇编
上一篇大端模式和小端模式
下一篇程序员眼里的女人O(∩_∩)O哈!
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭