百科问答小站 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上部署Python开发环境,包括各种常用的第三方库? 
  鸿蒙之于AOSP,是否Linux之于wine,Windows之于WSL?这么多人质疑鸿蒙说明了什么? 
  大家对重装系统有什么看法? 
  当我们在电脑按下ctrl+c,剪切板储存了哪些信息? 
  Windows 内核和 Linux 内核谁更复杂? 
  Windows 下有哪些给你带来「快感」的软件? 
  为什么 Windows 10 20H1 又将可能采用圆角矩形窗口设计了? 
  登录windows, 有类似Linux下ssh的终端登录方式吗? 
  为什么 Windows 的音量调节弹出来很慢? 
  WINDOWS 10,你为什么这么垃圾? 

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





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