原文
为什么可按EXE
重命名COM
文件,而不会产生明显
不良影响.
最初,唯一
存在的程序
是COM
文件.COM
文件的格式是:嗯,没有.没有格式.COM
文件只是一个内存映射
.该"格式
"从CP/M
继承.
为了加载COM
文件,程序加载器
只是把文件原封不动
地复制
进内存中,然后跳转到第一个字节
.没有修复,没有校验和
,什么都没有.
只需加载
即可.
COM
文件格式存在包括程序不能大于约64KB
等许多问题
.为了解决这些限制,引入了EXE
文件格式.EXE
文件头以"MZ"
神奇字母开头
,并带加载
程序到内存
中并准备执行
的其他信息
,来继续加载
程序.
就是这样,COM
文件是"原始内存镜像
",EXE
文件是"结构化
"的,严格
保持区别.如果重命名EXE
文件为COM
,操作系统试按机器代码
(问题不大)执行
头文件,相反,如果按EXE
重命名COM
文件,程序加载
器会拒绝它,因为缺少神奇的MZ
头.
随着时间
推移,像FORMAT.COM
,EDIT.COM
甚至COMMAND.COM
这些程序都超过了大约64KB
.根据原始规则,表明必须更改扩展
为EXE
,但会带来兼容
问题.
毕竟,因为
在此之前文件
一直是COM
文件,因此想要生成命令解释器
的程序
或批处理
文件试执行COMMAND.COM
.如果命令解释器
按COMMAND.EXE
重命名,则这些硬编码程序名
的程序
会停止工作,因为不再有COMMAND.COM
.
为让程序加载器
更加灵活,表明这些"知名程序
"可保留其COM
扩展名,同时不再受COM
文件的"必须小于64KB"
限制的约束
.
但是等等,如果COM
程序恰好以MZ
字母开头
怎么办?幸好,这从未发生过,因为如下
反汇编"MZ"
机器代码:
0100 4D DEC BP
0101 5A POP DX
第一条
指令递减
未定义初值
的寄存器
,第二条指令
使栈下溢
.理智程序不会以如上两个
未定义操作
开始.