程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 匯編語言 >> DOS下的EXE格式文件

DOS下的EXE格式文件

編輯:匯編語言

生成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是一樣的!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved