翻译《The Old New Thing》- What’s the difference between the COM and EXE extensions?

What is the distinction between COM and EXE extensions? - The Old New Thing (microsoft.com)

What is the distinction between the COM and EXE extensions?
Raymond Chen 2008年03月24日
简要
COM是一种无组织的原始内存映像,在存储程序代码时仅依赖于基本数据块。
而.exe文稿则包含".MZ"头信息及其他元数据,并采用结构化格式存储程序代码。
初始时, 操作系统根据文件扩展名来区分不同类型的文稿。
但后来系统改用检查.MZ头信息的方式来增强兼容性。
从而使得.COM文稿可以达到超过64KB而不必改名为.EXE版本。
正文
评论者Koro提出了一个问题:为何能够将COM文件重新命名为.exe版本而不会带来明显的负面效果?(James MAstros同样提出了一个相关问题,并补充道,在其问题中还包括一些额外的疑问。)
最初仅限于一种程序类型即为COM文件其本质上仅是一个内存映像这一结构源自CP/M系统当加载COM文件时在内存中直接复制了该文件内容并未进行任何修改并立即转向其起始位置无修复验证或其他操作
COM文件格式存在诸多问题,其中一个显著问题是程序大小不得超过约64KB.为了消除这些限制,采用了一种新的文件格式,即EXE文件格式.EXE文件的头部由魔术字母"MZ"开头,包含其他必要的信息,而程序加载器则通过提取这些数据将相应的程序加载至内存并做好准备执行.
事情就这样讲吧,在计算机领域中存在两种不同的二进制文件类型:一种是COM(即"原始内存映像"),另一种则是.exe(即"结构化内核"),两者在构造上有明确的区别且不容混淆。假如你尝试将.exe类型的程序更名为.com,则系统可能会以机器代码形式处理这个头(这通常不会带来预期的好处)。反过来也一样地若想把.com类型的程序改成.exe,则程序加载器会予以拒绝——因为它缺乏关键的魔术MZ头部信息。
那么,在什么情况下程序加载器才会彻底不再考虑文件扩展名,并仅基于MZ头部的有无来判断文件类型呢?这涉及到兼容性问题。
随着时间的发展,在这一阶段包含了如FORMAT.COM、EDIT.COM甚至COMMAND.COM等程序文件的系统规模都已超出了约64KB的标准限制范围。依据现有规定,在这种情况下应当将原有文件的扩展名由EXE改为COM。然而这一步操作将会带来兼容性方面的挑战。因为这些原本以COM结尾的文件在运行时往往会被直接识别并执行例如COMMAND.COM这样的命令解析器进程。如果将其重命名为COMMAND.EXE则会导致所有依赖于COMMAND.COM硬编码名称的应用都无法正常运行
这一改进使得程序加载器更加灵活。这表明这些广为人知的程序得以保留其COM扩展名,并无需满足所有COM文件必须适应64KB的要求
不过如此,则一个COM程序恰好以字母MZ开头又该怎么办呢?值得庆幸的是,在我们的测试中这种情况从未有过
0100 4D DEC BP
0101 5A POP DX
bash
第一条指令会导致一个初始值未被赋值的情况出现;第二个指令会导致栈出现下溢现象;没有任何理由认为任何有理性的程序会以两个未经初始化的操作启动。
