com、exe、bin文件的区别
以下均为网上收集:
1、dos下,exe有个512字节的文件头,包含重定位信息,后面跟程序;com就是程序的内存映象,没有文件头,偏移地址固定100h;其它不知道
2、exe可以有独立的代码、数据和堆栈段,还可以有多个代码段或多个数据段,程序长度可以超过64KB,执行起始处可以任意指定....
com程序将代码、数据和堆栈段合一,结构紧凑,所有代码、数据都在一个逻辑段内,不超过64KB....
com文件存储在磁盘上是主存的完全影象,不包含重新定位的加载信息,与exe文件相比其加载速度更快,占用的磁盘空间也少...
bin..不知道..
刚学的...现学现卖...
3、COM 文件类型是编译成的不需要重新定位的可执行的代码,这类程序需要调入内存的固定开始地址,文件大小有限制
EXE 这类文件是需要重新定位的可执行代码,在调入执行前,需要重新定位一些指针。具体限制的大小不详。
Bin 就是一个二进制文件。 具体的格式可以查找生成该文件的编译器的说明(如果自己产生,那就要自己确定写入的是啥东西了^_^)。
4、主要的区别只有一个: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结构的。
5、exe文件可以直接执行,有如下特点:
1.程序允许建立若干不同名的代码段、数据段、堆栈段或附加段。
2.程序的长度仅受当前内存可用空间的限制。
3.程序的入口随应用而定,只需起始标号与END语句说明的起始地址一致。
4.程序中的各个子程序的属性随段内或段间调用而定为NEAR或FAR。
5.连接生成EXE文件的各个不同的目标模块内的代码段,数据段或附加段可取同名或独立命名。但要求只有主模块的END语句指出程序入 口的起始标号,并至少有一个具有STACK属性的堆栈段。
com文件存储在磁盘上是主存的完全影象,不包含重新定位的加载信息(固定偏移地址为100H),与exe文件相比其加载速度更快,占用的磁盘空间也少。有如下特点
1.程序只能设置一个段,且不建立堆栈段;
2.程序的长度必须少于64K字节;
3.程序必须预留100H空间,开始处是一条可执行指令;
4.程序被装入的起始标号必须由END语句说明开始地址;
5.程序中的子程序必须具有近程属性(NEAR);
6.如果COM文件是由几个不同的目标模块链接生成的,要求所有目标模块具有同一代码段名和类别名(CLASS),且赋予公共属性(PUBLIC),而主模块应具有100H的入口指针并优先连接。
bin文件是纯粹的二进制文件,他不能直接被执行,必须被LOADER加载。
一、com格式文件:
个人理解:
com程序完全由二进制代码组成,只有一个段,所以数据的引用和地址的引用采用的都是相对值。固可以直接把COM文件读到内存中,距离PSP100h的位置,不用进行重定位。
Com format
the com files are raw binary executables and are a leftover from the old cp/m machines with 64k ram. a com program can only have a size of less than one segment (64k), including code and static data since no fixups for segment relocation or anything else is included. one method to check for a com file is to check if the first byte in the file could be a valid jump or call opcode, but this is a very weak test since a com file is not required to start with a jump or a call. in principle, a com file is just loaded at offset 100h in the segment and then executed.
offset count type description
0000h 1 byte id=0e9h
id=0ebh
those are not safe ways to determine wether a file is a com file or not, but most com files start with a jump. further information not available.
extension:com
occurences:pc
see also:exe,mz exe,ne exe
.COM文件包含程序的一个绝对映象----就是说,为了运行程序准确的处理器指令和内存中的数据,MS-DOS通过直接把该映象从文件拷贝到内存而加载.COM程序;它不作任何改变.
1、为加载一个.COM程序,MS-DOS首先试图分配内存,因为.COM程序必须位于一个64K的段中,所以.COM文件的大小不能超过65,024(64K减去用于PSP的256字节和用于一个起始堆栈的至少256字节).如果MS-DOS不能为程序,一个PSP,一个起始堆栈分配足够内存,则分配尝试失败.否则,MS-DOS分配尽可能多的内存(直至所有保留内存),即使.COM程序本身不能大于64K.在试图运行另一个程序或分配另外的内存之前,大部分.COM程序释放任何不需要的内存.
2、分配内存后,MS-DOS在该内存的头256字节建立一个PSP,如果PSP中的第一个FCB含有一个有效驱动器标识符,则置AL为00h,否则为0FFh.MS-DOS还置AH为00h或0FFh,这依赖于第二个FCB是否含有一个有效驱动器标识符.
3、建造PSP后,MS-DOS在PSP后立即开始(偏移100h)加载.COM文件,它置SS,DS和ES为PSP的段地址,接着创建一个堆栈.为创建一个堆栈,MS-DOS置SP为0000h,若已分配了至少64K内存;否则,它置寄存器为比所分配的字节总数大2的值.最后,它把0000h推进栈,这是为了保证与在早期MS-DOS版本上设计的程序的兼容性.
MS-DOS通过把控制传递偏移100h处的指令而启动程序.程序设计者必须保证.COM文件的第一条指令是程序的入口点.
注意:因为程序是在偏移100h处加载,因此所有代码和数据偏移也必须相对于100h.汇编语言程序设计者可通过置程序的初值为100h而保证这一点(例如通过在原程序的开始使用语句org 100h).
.dll也是pe文件,说明比较大,你可以去asm.yeah.net上看看,有教程
vxd是32位保护模式下的驱动程序,工作在ring0,一般是与硬件打交道的
psp简短介绍(注意:PSP区和程序区虽然物理地址连续,却有不同的段地址。因为psp占100h,psp段地址为SA的话,程序区的段地址应该为SA+10h)
该PSP中包含以下三部分信息:
(1)供被加载程序使用的DOS入口,如PSP+0、+2、+5和+2CH字段;
(2)供DOS本身使用的DOS入口,如PSP+0AH、+0EH、+12H和+2CH字段;
(3)供被加载程序使用传递参数,如PSP+5CH,+6CH和80H字段。
(psp介绍http://en.wikipedia.org/wiki/Program_Segment_Prefix)

浙公网安备 33010602011771号