百科问答小站 logo
百科问答小站 font logo



COM格式和EXE格式有什么区别? 第1页

  

user avatar   bei-ji-85 网友的相关建议: 
      

题主的问题,跟COM/EXE格式其实没关系。

早年MSDOS的命令集里,分两种:内部命令外部命令
内部命令就是集成在COMMAND.COM里的,不是单独的一个文件,直接运行就是了,代表的命令有:DIR/CD/MK/RD/COPY/DEL等;
外部命令是单独的一个EXE或者COM文件,具体是EXE还是COM要看具体是什么命令。

比如DOSKEY命令对应的是DOSKEY.COMSYS命令对应的是SYS.COM,类似的还有FORMAT等命令。
但有些命令是用EXE实现的,比如FDISK/XCOPY等,对应就是FDISK.EXE,XCOPY.EXE

具体是用EXE还是用COM文件,其实区别不太大,至少在MSDOS 6的时代区别是不大的。COM文件的格式限制比EXE更多一些,EXE格式的文件更复杂。

就文件效果来说COM文件和EXE文件最终在MSDOS环境里,都是二进制代码,都是真正做事情的,并不是你说的“执行的任务是其它程序完成”。

而对于内部命令,是由COMMAND.COM这个程序完成的,你看到的MSDOS的SHELL(命令行)也是COMMAND.COM

下图是MSDOS6.22软盘的内容:有COM也有EXE

到了Windows时代,Windows事实上对COM格式支持的已经不是很好了,就内容而言,COM本身是无格式的,第一个字节就是二进制机器指令,所以COM文件需要自己初始化代码段,数据段等,但EXE文件是有格式的,可执行程序加载器是可以为EXE做一些必要的初始化工作,所以EXE对于操作系统而言,更友好一些(操作系统知道你要干啥)。

COM文件最大通常不能超过64KB(也就是16位模式下的一个segment),但EXE没有这个限制,我截图里的EDIT.COM,实际上是一个EXE格式,而非COM格式。


COM格式的二进制文件,本身是无格式的,MSDOS(包括其他版本的DOS)加载的时候,先找到一个空闲的segment(64KB),之后,把COM文件原封不动的加载到偏移量0x100的位置上,设置各个段寄存器指向这个segment,IP=0x100,然后就开始执行。前256字节(0x100)是MSDOS的控制头(PSP),所以,如果写COM格式的文件,在用汇编编译器编译的时候,都要写一句org 100h的字样

EXE格式的二进制文件,是MZ或者PE格式的,MSDOS里是MZ开头的,其中有一个MSDOS header,里面描述了具体的段信息,IP入口等,具体的,百度上有很多,不再详细说明(内容较多):




  

相关话题

  为什么 Windows 系统 Program Files 这个经常用来装软件的目录,名称中有个空格? 
  为何早期版本Windows NT需要ctrl alt delete三键才可以登录? 
  我有没有权利要求笔记本电脑厂家不预装 Windows 从而省下一笔钱? 
  如何解决 C++ 代码不能打开提示有一个错误的问题? 
  为什么 Windows 操作系统开很多应用和游戏都不会杀后台? 
  为什么微软没在Windows/office里面加广告? 
  为什么大多数32位的Windows被设计成只能用4GB的内存? 
  如何看待ARM处理器在未来生产力/娱乐业的应用前景? 
  为什么微软不把Windows老版本系统开源? 
  Windows 等操作系统是如何做到复制大文件不出错的? 

前一个讨论
汉字在计算机中的表示方式有哪些?
下一个讨论
CPU是怎么解决Cache的冲突的?





© 2024-12-27 - tinynew.org. All Rights Reserved.
© 2024-12-27 - tinynew.org. 保留所有权利