COM文件格式

COM文件不允许分段,所占有的空间不允许超过64KB,其入口点(开始运行的起始点)必须是100H(其前面的256个字节为程序前缀所在地),且不必设置堆栈段.在程序装入时,由系统自动把SP建立在该段之末.对所有的过程应定义为NEAR属性.

 

 

标准格式:

program    SEGMENT

        ORG    100H

        ASSUME CS : program, DS : program, ES : program, SS : program

main    PROC    NEAR

        ;code  go  here 汇编代码*/

        MOV    AX , 4C00H    ;return to DOS

        INT    21H

        ;data go here 数据定义*/

program    ENDS

    END    main

 

 

 

对于MASM 5.0, 6.0版,也可用如下格式:

;title go here

       .model tiny

        .code

        ORG    100H

start:    JMP    begin

        ;data go here

begin:

        ;code go here

        MOV    AX , 4C00H

        INT    21H

    END    start

对于com注意以下几个问题: 
1.com没有header 
2.com程序不分段 
3.com入口点必须是100h 
4.com不必设置stack,sp=段尾 
5.com的过程为near 
然后用exe2bin把exe变成com

 

COM格式文件最大64K,无重定位项目,加载速度快,且DS=ES=CS=SS,IP=100
即其第一条指令位于段内偏移量100H的位置,其格式为:
==================================================================
     .model tiny        ;这句很关键
     .data              ;对于COM格式文件,数据段的内容会自动放到代码段后
data db 'My data Area!',0    
    
     .code
     .startup           ;可使下面的指令从0100H 开始(适应COM格式文件的要求)
    
    
     .exit              ;结束程序,相当于 MOV AH,4CH/INT 21H
     end
------------------------------------------------------
编译链接:ml  文件名.asm,而后直接生成可执行文件:文件名.com
------------------------------------------------------
;例:下面是一个COM格式的文件,涉及到结构的使用。
;文件名:1.asm

MAN STRUCT      ;定义一个结构,在win32中非常常用!
  W  dw 1234h           ;dw 也可用 word
  B  db 9 dup(?)        ;db 也可用 byte
MAN ENDS

.model tiny     ;COM格式文件

.data           ;对于COM格式文件,数据段的内容会自动放到代码段后
zz  MAN <>,<1,"abcd">,<3,"Ldf">

.code           ;代码段
.startup        ;可使下面的指令从0100H 开始(COM格式文件要求)

    mov ax,3031h
    mov zz.W,ax         ;对结构赋值
    mov zz.B,'1'
    mov ax,type(MAN)    ;取结构所占字节数
    .exit               ;可设置返回码,如:.EXIT 3相当于 MOV AX,4C03H/INT 21H
    end
-----------------------------------------------------------
下面是生成1.com文件的详细操作过程

D:/Masm615>dir

Volume in drive D has no label
Volume Serial Number is 18F0-186B
Directory of D:/Masm615

.              〈DIR〉        02-04-03  21:56 .
..             〈DIR〉        02-04-03  21:56 ..
MASMREF  DOC       264,704  02-23-00  20:00 MASMREF.DOC
ML       ERR         9,687  03-16-00  16:20 ML.ERR
ML       EXE       385,072  02-04-03  21:57 ML.EXE
MASM     EXE        49,152  12-30-00  14:04 MASM.EXE
LINK     EXE       364,544  01-13-95  14:10 LINK.EXE
1        ASM           566  02-15-03  11:10 1.asm
         6 file(s)      1,073,725 bytes
         2 dir(s)   2,410,340,352 bytes free

D:/Masm615>ml 1.asm
Microsoft (R) Macro Assembler Version 6.15.8803
        Patched for you by promethee [ECL] in the year 2001 - enjoy
Copyright (C) Microsoft Corp 1981-2000.  All rights reserved.

Assembling: 1.asm

Microsoft (R) Segmented Executable Linker  Version 5.60.339 Dec  5 1994
Copyright (C) Microsoft Corp 1984-1993.  All rights reserved.

Object Modules [.obj]: 1.obj /t
Run File [1.com]: "1.com"
List File [nul.map]: NUL
Libraries [.lib]:
Definitions File [nul.def]:

D:/Masm615>dir 1

Volume in drive D has no label
Volume Serial Number is 18F0-186B
Directory of D:/Masm615

1        ASM           566  02-15-03  11:10 1.asm
1        OBJ           156  02-15-03  11:13 1.obj
1        COM            51  02-15-03  11:13 1.com
         3 file(s)            773 bytes
         0 dir(s)   2,410,332,160 bytes free

---------------下面是用debug查看程序的结果-------------------
-r
AX=0000  BX=0000  CX=0033  DX=0000  SP=FFFE  BP=0000  SI=0000  DI=0000
DS=0B7F  ES=0B7F  SS=0B7F  CS=0B7F  IP=0100   NV UP EI PL NZ NA PO NC
0B7F:0100 B83130        MOV     AX,3031
-u100 110
0B7F:0100 B83130        MOV     AX,3031
0B7F:0103 A31201        MOV     [0112],AX
0B7F:0106 C606140131    MOV     BYTE PTR [0114],31
0B7F:010B B80B00        MOV     AX,000B
0B7F:010E B44C          MOV     AH,4C
0B7F:0110 CD21          INT     21
-d112 L21
0B7F:0110        34 12 00 00 00 00-00 00 00 00 00 01 00 61     4............a
0B7F:0120  62 63 64 00 00 00 00 00-03 00 4C 64 66 00 00 00   bcd.......Ldf...
0B7F:0130  00 00 00                                          ...
-

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值