【doc】PC汇编语言编写菜单程序中可执行文件调用方法分析
PC汇编语言编写菜单程序中可执行文件调
用方法分析
第9卷第1期
1994年3月
数据采集与处理
Journal.fDataAalui~ition8-Processing PC汇编语言编写菜单程序中
可执行文件调用方法分析弋.
周军干盛林
''——
———一————,
(南京航空航天大学测试工程系南京,210.]6)
摘要利用Pc汇编语言编写的菜单程序,要求程序船够在可执行文件加载执行完以后退回到菜单
程序.文中对在DOS系统下内存管理分析的基础上,结台有关DOS的内存管理功能,得出:在用4BH
功能之前,要首先在菜单程序的开头保存Psp的段地址,并用4AH功能修改菜单程序进人内存后所
占内存空间的大小.文中在l最后堵出了一个实倒程序,该程序在~5OS3.30环境下运行通过.
美键词程控制,塞鲢微型计算机内存控剞块
中围分类号:TP31J.52~"r'P313
引言
帮旁蝌
PC机丰富的软件资源使它广泛地应用在工业过程控制及系统管理方面.在开发PC机的
软件资源编制系统应用软件时,常采用按系统功能进行模块化分块
的方法,这
种方法对于
软件编制人员是很有用的.从用户使用角度出发,要求有一个简单,方便的人一机接口界面,故
为用户设计一个操作菜单是很有必要的.
利用8086汇编语言编制出的程序具有简短和执行速度快的特点,利用8086汇编语言就
可以编出一个高效,简短的菜单操作程序.但用8086忙编语言编程时,由于对PC机软,硬件
,特别是在编菜单程序中利用DOS功能调用其它可执行不了解,在调用DOS中断
文件时,就会
感到很困难.对于这个问题,我们是通过对DOS的内存管理及DOS对可执行文件的调用功能
的分析.从理论上解决了如何去调用另一个可执行的文件
lDOS的内存管理
一
般PC机都采用DOS操作系统来管理内存资源,它是单用户的操作系统,但在内存中仍
可依次加载和驻留若干个用户程序.为使用户程序与DOS之间保持通信,在每个程序前都有
一
个程序段前缀(PSP),其结构如图l所示.利用DEBUGCOM就可观察PSP中的内容.DE—
BUGCOM在内存中的PSP如下所示:
收稿日期1993—02—23I修改稿收到日期:1993—93—22
'
,,
.
?
?
0_
第1期周军等;PC汇编语言缩写菜单程序中可执行文件调用方法分析29
C)debug
—
d.0ff
ll70:O000cD ll70.OO10C1 l170:0020FF ll70;0030FB 1170:004000 ll70;0050CD 1170j006020 1170:007020 1170008000 ll70:0090O0 1170:00A000 ii70;00B000 l170.0OCO00 1170;00D000 1l70:00E000 ll70:00F000 .
DOS对内存的管理是以内存分配块(连续的内存空间)的形式为用户程序申请内
存并划分
RAM空间,每一个分配块均设置有一个内存控制块(McB),占一节,它说明该分配
块的位置和
节数,格式如下:
位移0lH3H5HOFH
l堑里l坌墼垫垦些l坌墼垫堇墼l堡堕
长度(BYTE)i22ii
其中:标记只有4DH和5AH两种取值.4DH
示本内存块不是最后一块;5AH表示本内存块
为最后一块.分配块段址为0,说明本内存块未被占用.被占用的内存块的分配块段址为加载
程序的PSP段址,在加载程序执行终止退回DOS或父程序时,它所占用的内存零被释放.分配
块节数指出了本控制块所拥有的内存空间大小.在计算机启动进入DOS状态后,内存的分配
情况如图2所示由图2可以看出,在DOS状态下装入的可执行文件占用了整个用户空间.编
写菜单程序时,要求菜单程序能够为自己保留足够的空间,并释放其它可用内存空间,供可执
行文件加载,执行.
PsP上0H程序中止中断指令(INT20H)2
上2H可用内存空间(节为单位)2
+4H保留.】
+5H远调用指令(CALLFAR)5
0AHINT2棚入口4
+0EHINT23H入口4
+l2HINT2{H八口4
+l6H存放父进程PSP段址2
上18H保留20
/N..一........一一,一一.,一一一一一一一一
一,一一,一,,,,,,,
一一,一一一一,一,,,,
?阡吡吣?曲柚吣吣?吣吣??吣呻
阡幢??卸??????????
?阡???如舯????仰帅??仰 ?????????吣??? 凹?盯盯???????????? 叽阡阡?帅帅?帅??帅??仰 黜毗阡阡??????????吣? m叭阡阡??加?????????限}圭扯扯啡
}ij阡?鲫如?们吣?仰?吣吣 吣阡????卸???????? ?阡??如曲????帅仰?仰 蚣此阡???舯鲫???????? m阡??.柚柚???????? 加?盯??卸??伽???仰帅
30救据采集与处理第0卷
偏移量宇段含义长度(字节)
?
上2CH环境块段址2
+2阻保留34
+50HINT21H,RETF指夸3
+53HDOS专用0
?
上5CH存放格式化未打开的第一个FCB16
.
上6CH存放格式化未打开的第二个FCB16
+7cH保留d
+8OH未格式化参数长度1
+8IH未格式化参数内容l27 地址0:OH
{0IOH
50lOH
70:OH
012EOH
07E5OH
程序加载
起始地址
圈1pSI'结构框图
中断向量表(1KB) ROM-BIOS数据(256B)
DOS使用参数(512B)
DOS-BIOS模块
DOS—KERNEL模块 第一个DOS缓冲区 块设备部件参数块链 4DHl第一个MCB 可安装设备驱动器程序 第二组句柄文件控蜘块 DOS缓冲区
4DHl第二十MCB PsP
COMMAND常驻部分 dDH1第三个McB COMMAND主环境 5AHl第四十McB 程序哲驻医(空冈块) COMMAND暂驻部分 图2PC机启动后的内存分配情况
lDOS内部模块
l系统篦置
DOS外壳常驻
J用户自由空间
l
'
口
口
第J期周军等:PC汇编语言编写菜单程序中可执行文件调用方法分析31 2与内存管理相关的DOS中断功能分析嘲
利用8086汇编语言编制的菜单程序,调用其他可执行文件,就需用到DOS中有关内存分
配,管理的功能,即INT21H中的48H,49H,4AH和4BH功能.48H,49H和4AH功能主要用于
分配内存块,释放已分配的内存块和修改已分配的内存块4BH功能是调用文件到内存中.在
此简要说一下有关4AH和4BH功能中的一些参数.
(1)4AH功能是对已分配的内存块的大小进行修改.
入口:AH一4AH,INT21H中的4AH功能号
ES=BUF_
SEG需修改内存块的段地址
BX~SIZE;新申请分配的内存块的容量(节为单位)
在这里需要对Es中的入口参数值进行一下说明.由于DOS在调入一个可执行文件时,会
把这个文件在内存中的起始段地址(即PSP的段地址)赋给DS和Es寄存器,所以要在菜单程
序的起始部分把ES中的值保存起来,并在调用4AH功能时再赋给酷寄存器,这样就可达到
修改菜单程序存内存中占用空间大小的目的.
返回:c=0;成功
c=l;失败,这时AX一错误码,
BX=最大可用空间
(2)4BH功能有三个子功能:0号子功能是装载一个程序并执行;1号子功能是装载一个
程序但并不执行,它是专门为DEBUG.COIV[保留的;3号子功能是从指定的内存地址装入程
序.在菜单程序中,主要是用0号子功能.
入口:AH一4BH;INT21H的4BH功能号
AL=0;4BH中的0号子功能
DS:DX;指向一个可执行文件路径名的段地址:偏移量
ES:BX;指向下一个参数块的段地址:偏移量
返回:c一0;成功
C一1;失败.这时AX一错误码
其中:0号子功能所要用到的参数块内容见附表.程序在调用这一子功能后,所有的内部寄存
器和DS,ES,SS段寄存器的内容都会丢失.故在使用这个功能前,为使在调用的可执行文件执
行完后退回的菜单程序能够继续执行,必需在这个功能使用前保存好这些寄存器的内容,并在
返回后及时恢复.
附寰0号子功能的装载参敷块内容
偏穆量内容
O,lH环境块段址(O为父进程环境块)
2,5H命夸行地址(PSP~-80H)
6,9H第一十FCB地址(PSP+5cH)
A,DH第二十FCB地址(PSP+6C~i)
32数据采集与处理第g卷
3编程举例
根据上述分析,我们编制了一个调用可执行文件的程序实例,图3为这一程序的程序清
单.本程序在DOS3.30环境下,经编译连接后运行成功,它调用了在C:\ASM目录下的
PE2.EXE文件.在这个程序中,最主要的是在程序段的开始,在未更改ES段寄存器内害之前,
把ES中的值保存起来,该值作为调用INT21H的IAH功能时的一个入口参数. ~taeksegments~tekstack~澈置堆栈区I………………………… staedb10Ohdup(?)I1ePartolM~nue s衄ckends,…………………………
moval1.0
cNegsegmentpubjda;设置数据区intI6h
buraw??Dal,1bh
p血na\m\pe2.exeJ,0jneexe
pramdw0,6duo(0)ret
erI町d~INT2lit:Efmr${………………………"
dsegen血~Call~ecuteFile
1?''??…?'??'''???'???''???'??
esegsegmentpublic'oodeexe:rflOVhx,segpr~tm
a鹫ume锱:cseg,dS:0seg,ss:sta吐
mentlpT0clarm0pTam[d],bx
movax,stackI传送堆栈指针rflOVpT椰[8],bx
movss."rflOVprmn[12].bx
rr-ovsp,l00hlea",thn
pushdsI保存ret指令返回时指针l曲h,pram
subax,axcau—
e*ec
pushaxJm0next
movax.dsegret
movds,up
movbuf,I保存PsP段地址{………………………… moves,ax{INT21H4BItSubroutine;
:''''''''''''''''''''''''''''''4''''''''''''''''''''''''''''''
)M~lilyTheMemory?I修改内存块大小一cpr0cnear
!…………………………savessdw? push髂~vespdw?
rrvah.4ahDush吼
rr-oves.fpushds
movbx,50h{新的内存块节数push
int21hm0vcx.ss
D.Pesm0Vcs:saVes宕'吼
jr-cnextnVcx,sp
rnOvah,0ghrrvcs:savesp,c J髓血.eTr0rrr坤vah.4bh
int21hrfl~va1.0
retint2lh
next:rflovCx,cs:saveSs m0vSs,cx
在此可插入菜单的
控制,显示部分
判按键是否是"Esc"
不是,调用PE2.EXE
是,退回D0s
调用可执行文件
传送4BH0号子功能
的l人口参数
调用4BH0号子功参的
于程序
保存Ss值
保存SP值
'哥
叶
'
?
第1期周军等:PC汇编语言编写菜单程序中可执行文件调用方法分析30
movcxt船}save~p,'
movsp?':x
popds
poPcx
jncexit
movah.09h
leadx,~fror
int21h
嘶t:.?
emer-dD
ends
图3程序清单
参考文献
1张载鸿PC系列机系统开发与应用(上),北京:国防工业出版社1991179--191
2ThornHogan.PC软,硬件技术资料大全北京:清华大学出版牡,1990134一i37
TheAnalysisofCallingan aMPnuProgramby
'.
,,
Zht~uJ-mt
ExecutableFile,whenCompiling
8086AssemblyLanguage
?
?
YuSheldin
(DeparUncmafieas~remefltEngineering.NUAANanjing.2l0016)
AbstractUsing8086assemblylanguagetocompileame~tlprogram,itsneededtoexecuteanexe
cutablefileunderloadingbythemenuprogram,andthenbacktothemenuprogram.Onthebaseof
analysingthememorymanagementunder.theD0SenvironmentwiththeDOSsINT21Hfunction
aboutthememorymanagement,wecaIlconcludethatbefoEeusingtheINT21H一
4BHfunction.theseg
mentofPSPmustbekeptatthebeginingofthemenuprogram.andtheslzeofmemorythatthemenu
programusedmusthemodifiedbyINT21H一
4AHfunctionwith[hepreservedPsPsegmentaddress.At
theendof血
earticleanexampleprogramispresented.ThisprogramcanbeexecutedSucassf'Idlyunder theenvjronmentofD0S3.3D.
keywords:programcontrol;assemblylanguage;microcomputers;memorycQr~tra3block 第一作者简升周军男.硬士生.1969年8月出生