百科问答小站 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 10 20H1 又将可能采用圆角矩形窗口设计了? 
  如何看待 WannaCrypt0r 还没有结束? 
  如何反驳「Powershell 比 Linux shell(bash..)好得多」这种说法? 
  Windows里有什么程序或部件是从很早开始就沿用至今的? 
  在当代使用古董电脑是一种什么样的体验? 
  在拖拽交互上,macOS 是否比 Windows 更好? 
  如何看待“24核PC不能动鼠标”这篇文章? 
  如何看待 Git 的 Windows 安装程序称 Vim「很难用」? 
  windows10下载vb6.0.exe安装包时为什么显示下载失败? 
  不想随大流,怎么选择有个性的操作系统? 

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





© 2025-06-28 - tinynew.org. All Rights Reserved.
© 2025-06-28 - tinynew.org. 保留所有权利