天天看點

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                                          ...

-