百科问答小站 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入口等,具体的,百度上有很多,不再详细说明(内容较多):




  

相关话题

  同是主流操作系统,为什么macOS没有盗版系统而Windows到处是盗版? 
  windows系统为什么不预留一点资源(cpu和内存占用),在执行繁重任务时以保证系统本身的流畅运行? 
  如何看待Windows 11中仍然有Windows 3.1的组件,是否说明前者是后者的套壳? 
  Win11 被吐槽正式推出两个月后仍是半成品,它有哪些问题? 
  Windows 系统下你离不开的软件有哪些? 
  如何看待 Windows 11 硬件要求导致 TPM 2.0 模块价格暴涨 3 倍? 
  为什么Windows可以安装在所有不同的PC上,而安卓刷机包必须对应机型? 
  求问“命令行的需求,命令行的本质,命令行究竟解决什么需求,命令行究竟又能带来什么好处”,到底是什么呢? 
  Windows 上最小的「HelloWorld.exe」能有多小? 
  为什么 Mac 系统不用关机而 Windows 不行? 

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





© 2024-06-23 - tinynew.org. All Rights Reserved.
© 2024-06-23 - tinynew.org. 保留所有权利