当前位置:文章首页 >> 程序设计 >> 汇编语言 >> DOS下的EXE格式文件
DOS下的EXE格式文件
2007-10-19 10:08:22  作者:佚名  来源:互联网  文字大小:【】【】【

  生成EXE格式文件

  ;Model伪操作的格式为:Model memory_mode,model_options

  其中:memory可为 tiny/small/medium/compact/large/huge/flat等

  除tiny编译成com格式文件外,其他的都是exe格式文件

  small是其中较常用的一种,所以这里解说small

  对于small,所有数据都放在一个64K的段内,所有代码都放在另一个64K段内,数据和代码都是近访问。

  --------------------------------------------------------------------

  ;例:显示一个字符串
;文件名:2.asm,编译链接后生成文件 2.exe
    .model small  ;生成EXE格式文件
    .stack 100h   ;若不带100h,则默认堆栈大小为400H
        
    .data      ;初始化的数据段
mess  db 'How, world!$'
        
    .data?     ;未初始化数据段,该段不占用EXE文件的大小!
pp   Dw 200H DUP(?) ;对于未初始化数据,只能是使用“?”
    .code      ;代码段
        
    .startup    ;可使用该伪指令初始化DS及堆栈值(参后面的例子)
    mov ah,9    
    lea dx,mess
    int 21h     ;显示信息
    mov pp,ax
    .exit      ;可设置返回码
    end       ;因使用了.startup,所以不用指出程序从哪里开始啦!

  ---------------------------------------------------------------

  生成2.exe文件的详细操作过程:

  D:\Masm615>dir 2
    Volume in drive D has no label
Volume Serial Number is 18F0-186B
Directory of D:\Masm615
2    ASM      711 02-15-03 10:48 2.asm
    1 file(s)      711 bytes
    0 dir(s)  2,408,906,752 bytes free
D:\Masm615>ml 2.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: 2.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]: 2.obj
Run File [2.exe]: "2.exe"
List File [nul.map]: NUL
Libraries [.lib]:
Definitions File [nul.def]:
D:\Masm615>dir 2
Volume in drive D has no label
Volume Serial Number is 18F0-186B
Directory of D:\Masm615
2    ASM      711 02-15-03 10:48 2.asm
2    OBJ      207 02-15-03 10:50 2.obj
2    EXE      562 02-15-03 10:50 2.exe
    3 file(s)     1,480 bytes
    0 dir(s)  2,408,910,848 bytes free
D:\Masm615>2
How, world!
D:\Masm615>_

  _______________________________________________________________

  用DEBUG查看生成的EXE文件

  -r
AX=0000 BX=0000 CX=0032 DX=0000 SP=0100 BP=0000 SI=0000 DI=0000
DS=128C ES=128C SS=12A0 CS=129C IP=0000  NV UP EI PL NZ NA PO NC
129C:0000 BA9E12    MOV   DX,129E
-u0 25
129C:0000 BA9E12    MOV   DX,129E ;这是由.startup伪指令翻译过来的
129C:0003 8EDA     MOV   DS,DX  ;设置数据段(初始化数据和未初始化数据具有相同的段值)
129C:0005 8CD3     MOV   BX,SS
129C:0007 2BDA     SUB   BX,DX
129C:0009 D1E3     SHL   BX,1
129C:000B D1E3     SHL   BX,1
129C:000D D1E3     SHL   BX,1
129C:000F D1E3     SHL   BX,1
129C:0011 FA      CLI
129C:0012 8ED2     MOV   SS,DX  ;重新设置堆栈
129C:0014 03E3     ADD   SP,BX  ;这样,ds=ss
129C:0016 FB      STI
129C:0017 B409     MOV   AH,09  ;此处开始是我们写的程序
129C:0019 8D160600   LEA   DX,[0006] ;对于small,数据的定位类型是word,即必须是偶数,如6
129C:001D CD21     INT   21
129C:001F A32001    MOV   [0120],AX ;未初始化数据位于“代码\数据\堆栈”的后面
129C:0022 B44C     MOV   AH,4C
129C:0024 CD21     INT   21
-d129e:6 11
129E:0000          48 6F-77 2C 20 77 6F 72 6C 64     How, world
129E:0010 21 24                       !$
-g17
AX=0000 BX=0020 CX=0032 DX=129E SP=0120 BP=0000 SI=0000 DI=0000
DS=129E ES=128C SS=129E CS=129C IP=0017  NV UP EI PL NZ NA PO NC
129C:0017 B409     MOV   AH,09

  ---------------------------------------------------

  此时可看一下程序在内存中的布局,以加深理解!

  注:原堆栈SS:SP=12A0:0100和新堆栈129E:0120是一样的!


  •  ©  2006-2008 www.qq08.net 业务联系 广告刊登 QQ:517165800统计

  • 皖ICP备07000033号