当前位置首页 > 百科> 正文

COM格式

2019-10-02 10:55:19 百科
COM格式

COM格式

COM格式档案是一种简单的执行档。在迪吉多公司于20世纪70年代推出的作业系统中,.COM被用做包含作业系统支持命令的文本档案的拓展名(类似于Windows系统的.cmd档案)。随着引进CP/M的引进(微型计算机的作业系统),COM扩展相的档案改变为的执行档。该格式后来被结转到MS-DOS。虽然MS-DOS中已有更常见的.exe档案格式的,紧凑的COM档案仍然保持活力,并在MS-DOS频繁使用。

COM档案中没有附带任何支持性数据,仅包含可执行代码。档案头即为第一句执行指令。没有重定位的信息,这样代码中不能有跨记忆体段(segment)运算元据的指令,因此代码与数据只能限制在同一个64KB的记忆体段中。

基本介绍

  • 中文名:COM格式
  • 外文名:COM format
  • 类型:一种计算机档案扩展名
  • 提出时间:20世纪70年代

MS-DOS二进制格式

COM格式是在CP/M和MS-DOS中使用的原始二进制可执行格式。它很简单因为 它没有标题(除CP/M 3档案外),并且不包含标準元数据,仅包含代码和数据。 这种简单性是一个代价:二进制档案的最大大小为65,280(FF00h)位元组(256位元组短于64 KB),并将其所有代码和数据存储在一个段中。
由于它没有重定位信息,它被作业系统装载到一个预置地址,在PSP后面的偏移量0100h,它被执行(因此限制了执行档的大小):入口点固定为0100h。 这在8位机器上不是问题,因为它们可以最大地处理64k的记忆体,但是16位机器具有更大的地址空间,这就是为什幺格式不再使用的原因。
在Intel 8080 CPU架构中,只能定址65,536位元组的记忆体(地址範围为0000h至FFFFh)。 在CP/M下,该存储器的前256位元组(从0000h到00FFh)被保留供系统零页使用,并且任何用户程式都必须在0100h载入才能执行。 COM档案完全适合这个模型。 在引入MP / M和并行CP / M之前,一次不可能运行多个程式或命令:在0100h载入的程式运行,没有其他运行。
虽然MS-DOS和CP/M中的档案格式相同,但两个作业系统的.COM档案不兼容; MS-DOS COM档案包含x86指令和可能的MS-DOS系统调用,而CP/M COM档案包含8080指令(限于某些机器的程式也可能包含8085或Z80的附加指令)和CP/M系统调用。
DOS中的.COM档案将所有x86段暂存器设定为相同的值,并将SP(堆叠指针)暂存器设定为FFFEh,因此堆叠从记忆体段的最顶端开始并从那里开始工作。
原来的DOS 1.x API是CP / M API的衍生产品,通过调用INT 20h(终止程式)函式或INT 21h函式0来执行程式终止.COM档案,他们起着同样的作用,程式设计师还必须确保程式终止时代码和数据段暂存器包含相同的值,以避免潜在的系统崩溃。 虽然这可以在任何DOS版本中使用,但是Microsoft建议使用INT 21h函式4Ch来从DOS 2.x以后的程式终止,它不需要将数据和代码段设定为相同的值。
可以在两个作业系统下运行.COM档案。 在指令级没有真正的兼容性; 入口点的指令被选择为在功能上相同但在两个作业系统中不同,并且使程式执行跳转到正在使用的作业系统的部分。 它基本上是两个不同的程式,在单个档案中具有相同的功能,之前是代码选择要使用的程式。
在CP/M 3下,如果COM档案的第一个位元组是C9h,则有一个256位元组的标题; 由于C9h对应于8080指令RET,这意味着如果在不支持该扩展的早期版本的CP/M上运行,COM档案将立即终止。(因为8085和Z80的指令集是8080指令集的超集,所以这三个处理器都可以工作。)C9h是8088/8086上的一个无效操作码,它会在v86模式下引发INT 6异常,因为386.由于C9h是自80188/80186以来的LEAVE操作码,因此不被用作有效程式中的第一条指令,因此某些版本的DOS中的可执行载入程式拒绝以C9h开头的COM档案,从而避免崩溃。
档案的名称可能以.COM结尾,但不能採用上述简单格式。 这由档案开头的幻数表示。 例如,DR DOS 6.0中的COMMAND.COM档案实际上是DOS可执行格式,前两个位元组表示为MZ(4Dh 5Ah),即Mark Zbikowski的缩写。
在MS-DOS和兼容DOS中,载入器或执行环境没有为COM档案提供记忆体管理。所有记忆体都可用于COM档案。执行后,作业系统命令外壳COMMAND.COM将重新载入。这留下了COM档案可能非常简单,使用单个段或任意複杂的可能性,从而提供自己的记忆体管理系统。一个複杂程式的例子是COMMAND.COM,MS-DOS shell,它提供了一个载入器来载入其他COM或EXE程式。在.COM系统中,可以载入和运行较大的程式(最大可用记忆体大小),但系统载入程式假定所有代码和数据都在第一段中,并且由.COM程式提供任何代码和数据。进一步组织。如果必要的代码包含在.COM程式中,则可通过动态连结处理大于可用记忆体或大型数据段的程式。使用.COM而不是.EXE格式的优点是二进制图像通常更小,更容易使用彙编程式进行编程。一旦有足够功率的编译器和连结器可用,将.COM格式用于複杂程式就不再有利。
.COM档案在IBM PC早期之后通常不用于商业软体执行档,格式主要用于命令行应用程式。

支持平台

该格式在许多现代基于Windows NT的平台上仍然可执行,但它在MS-DOS仿真子系统NTVDM中运行,并不存在于64位变体中。 COM档案也可以在DOS模拟器(如DOSBox)上执行,在这些模拟器支持的任何平台上。

兼容性

基于Windows NT的作业系统使用.com扩展名来处理从MS-DOS时间传输的少量命令,儘管它们实际上当前实现为.exe档案。 作业系统将识别.exe档案头并正确执行它们,儘管它们在技术上不正确的.com扩展名。 (事实上,任何.exe档案都可以重命名.com并且仍然可以正确执行。)对这些命令使用原始.com扩展可确保与旧的MS-DOS批处理档案兼容,这些档案可能使用完整的原始档案名称引用它们。 这些命令是chcp.com,discomp.com,diskcopy.com,format.com,mode.com,more.com和tree.com。

执行效果

在MS-DOS中,如果一个目录同时包含一个COM档案和一个具有相同名称的EXE档案,那幺当没有指定扩展名时,将优先选择COM档案进行执行。 例如,如果系统路径中的某个目录包含两个名为foo.com和foo.exe的档案,则以下命令将执行foo.com:
C:\>foo
运行foo.exe的用户可以显式使用完整的档案名称:
C:\>foo.exe
利用这种默认行为,病毒编写者和其他恶意程式设计师使用notepad.com这样的名字来创建它们,希望如果将它放在与相应的EXE档案相同的目录中,命令或批处理档案可能会意外触发它们的程式 而不是文本编辑器notepad.exe。 再次,这些.com档案实际上可能包含一个.exe格式的执行档。
在Windows NT及衍生产品(Windows 2000,Windows XP,Windows Vista和Windows 7)上,PATHEXT变数用于覆盖调用档案的首选项(以及可接受的扩展名)的顺序,而无需在命令行中指定扩展名。 默认值仍然在.exe档案之前放置.com档案。 这与以前在JP Software的扩展命令行处理器4DOS,4OS2和4NT系列中发现的功能非常相似。

恶意使用.com

一些计算机病毒作者希望利用现代计算机用户可能缺乏对.com档案扩展名和相关二进制格式的知识,以及他们更可能熟悉.com网际网路域名。 电子邮件已传送附属档案名称类似于“www.example.com”。 不小心的微软Windows用户点击这样的附属档案可能会开始浏览一个名为http://www.example.com/的网站,而是运行附属档案的二进制命令档案www.example,并给予它完全的许可权 无论其作者想到的是什幺机器。
注意COM档案格式本身没有任何恶意; 这是对.com命令档案和.com商业网站之间巧合名称冲突的利用。
声明:此文信息来源于网络,登载此文只为提供信息参考,并不用于任何商业目的。如有侵权,请及时联系我们:baisebaisebaise@yeah.net