COM 文件与一般的 EXE 文件在结构上有所不同,COM 文件是在早期没有分段的情况下设计的,具有结构简单,占用内存小,数据及代码都在同一段内等即以 64K 为单位的特点,较实用的汇编程序,如对驻留程序,中断服务程序等的设计,在可能的情况下,一般都采用这样的程序结构。
COM 文件在加载时将 CS, DS, ES, SS 段都定义在 PSP 段基址上,IP 定义在 PSP+100H 处,SP 堆栈指针被定位在程序的末端,并在栈顶存放两个字节的00H。
编制 COM 文件应遵循下列规则:
1. 只能建立一个代码段,内含代码和数据段,同时不能单独设置堆栈段。
2. 代码和数据只能在 100H 以后设置,一般用伪指令 "ORG 100H" 放在汇编程序的开始,程序应在 ORG 100H 定义程序段的入口。即在 100H 处设置一条可执行指令,一般的结构如下:
CODE SEGMENT ASSUME CS:CODE,DS:CODE ORG 100H START: JMP BEGIN ........ 数据区 ........ BEGIN: 程序区 ........ CODE ENDS END START
3. 数据区可放在段内的任意地方,当然,不能与代码域冲突。
4. 整个程序是在一个段内,而涉及到段定义有关的指令,伪指令都会在程序链接时给出生成 COM 文件错误,如:
MOV AX,CODE
MOV DS,AX
该指令串在 EXE 文件是没有问题,但如果要生成 COM 文件,换句话说,若按 COM 文件方式设计程序,则会出错,因为在 COM 文件中不存在段的概念。要完成上述功能应采用:
PUSH CS
POP DS
同样的伪指令 SEG 也不能在 COM 文件中出现。
5 在多模块情况下,要求所有的目标模块必须具有同一代码段名和类别名,且赋予 PUBLIC 供链接程序 LINK 使用,具有 " ORG 100H " 入口的主模块应优先链接。
COM 文件的生成是在用 MASM 和 LINK 的方式生成 EXE 文件后,再使用 DOS 下的 EXE2BIN 命令将其转换成 COM 文件。若用 TASM 和 TLINK 时编译和链接程序时,在TLINK 加 /Tdc 开关直接生成 COM 文件。如果程序不能满足 COM 文件编程要求,则在执行 EXE2BIN 时会给出错误信息,当然,在TLINK时也会出错。