在 DOS 系统中,有三种程序文件,扩展名分别是:EXE、COM、BAT。
在 DOS 提示符后面,键入程序名(不用键入.扩展名)再回车,DOS 即可执行该程序。
各扩展名,分别代表一类程序。
BAT:称为批处理文件;
COM:称为命令文件;
EXE:称为可执行文件。
其中 EXE 文件的功能最为强大。
而 COM 文件则是短小精悍,调入内存并开始执行,其速度,要比 EXE 文件的速度更快。
但是,随着计算机硬件的档次,持续不断的提高,COM 文件的速度优势,已经不明显。
并且,现在广泛使用的是 Windows 操作系统,需要编写的,都是大程序。
而 EXE 文件形式,比 COM 形式,更适合编写大程序。
因此,现在,几乎是 EXE 文件独霸天下,几乎就看不到 COM 文件的存在了。
----------------------------------
前面说过:COM 文件,相比 EXE 文件,还是有一点点优势的。
所以,现在还是有人,想要编写出 COM 文件,感受一下。
但是,现在的教学环境,几乎就没有任何人、或书籍,再介绍 COM 文件的编写方法了。
再用转换程序 EXE2BIN 转换成 COM 文件。
说起来,很简单,只是用一个步骤,转换一下,COM 文件就出来了。
但是,实行起来,可是很罗嗦的。
首先,转换程序 EXE2BIN.COM 就很不好找。
即使找到了,也不能用。因为这个软件,它认 DOS 的版本。
做而论道手头就有 DOS 3.2 版本的 EXE2BIN 程序。
在 DOS 3.2 操作系统中,好用;在 DOS 5.0 中,就不好用。
目前使用的 DOS,都是在 Windows 中的提示符窗口,比早期的纯 DOS,版本提高了不知多少倍。
现在,可上哪儿去找装有 DOS 3.2 的老机器呢?
----------------------------------
其实,借助于 DEBUG 软件,也可以把 EXE 文件,转换成 COM 文件。
这种转换,要用手工操作,也并不太麻烦,仅仅需要一点知识,一点技巧而已。
为了转换成 COM 文件,有必要了解一下 COM 文件的格式,共有 3 个要点:
1.整个程序,只能有一个段,即:代码、数据、堆栈,共用一个段。
2.写程序时,要从 0100H 开始编写。
3.程序结束,返回 DOS,指令是 INT 20H。
(实践证明,用 MOV AH, 4CH / INT 21H 来结束程序,也可以。)
好了,现在用汇编语言编写一个 EXE 程序,全部代码如下:
;-------------------------------------
ASSUME CS:CODE, DS:CODE
CODE SEGMENT
ORG 0100H ;必须从 0100H 开始编程
START:
PUSH CS
POP DS ;数据段和代码段共用
LEA DX, MSG1
MOV AH, 9 ;显示字符串
INT 21H
EXIT:
MOV AH, 4CH ;机器码是:B4 4C
INT 21H ;程序结束,机器码是:CD 21
MSG1 DB 'Hello world ! $'
DB 'AAAAAAAAA' ;随便写的,醒目用
CODE ENDS
END START
;-------------------------------------
程序中,有用的代码是从 0100H 到 $ 为止。后面的 A,将用于查找尾部。
这个源程序,经过编译、连接,即可生成可执行程序文件 MM.EXE。
下图就是执行程序 MM.EXE,然后,再转换成命令文件 ZZZ.COM 的全部操作过程。
在图中可以看到,代码是从 0100 开始,画黄线的代码,就是结束程序的指令。
程序 结束所用的指令 INT 20。
再下面的,是寄存器的信息,其中 BX CX 是文件长度 0000 0127。
A 。
因此,用 R 命令修改 CX 为 1E。
然后,用 N 命令,为 COM 文件命名。
然后,用 W 命令,把 COM 文件存盘。生成了 ZZZ.COM,共存入了 1E 个字节。
最后,用 Q 命令,退出 DEBUG。
转换完毕。
----------------------------------
下面,在 DOS 提示符后,键入 ZZZ 回车,即执行了命令文件 ZZZ.COM。
可以看到,ZZZ.COM 和 MM.EXE 的功能,完全相同,都是显示 Hello world ! 。
----------------------------------
重新进入 DEBUG,并打开 ZZZ.COM,可以看到,和原来的 EXE 文件内容相同。
但是,命令文件的代码,要精练许多。
特别是当你编写 BIOS 的程序时,必然需要这种纯粹的程序代码。
有兴趣的网友,可以试试看。