预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10
亲,该文档总共72页,到这已经超出免费预览范围,如果喜欢就直接下载吧~
如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
第六章子程序结构主程序子程序:
子程序:在一个实际程序中,有些操作要执行多次,
把要重复执行(subroutine)操作编为子程序。
也常把一些常用的操作标准化、通用化的子程序。
主程序:(Mainprogram)—往往要调用子程序或处理中断,
暂停主程序,执行子程序或中断服务程序。模块化程序设计方法调用子程序时需保留内容:
①调用子程序:将CALL下条指令地址即IP值保留下来
(8086中段寄存器CS和指令指针IP),
才能保证子程序执行完后准确返回主程序继续执行。
②执行子程序时,
通常用到内部寄存器,执行结果会影响标志位,
必须在调用子程序之前将现状保护起来。
③子程序嵌套或子程序递归(自调自)
保留许多信息,而且保证正确返回(且后进先出)。
后保留先取出原则(即LIFO-LASTInFirstout)。6.1子程序的设计方法
6.1.1过程(子程序)定义伪操作
过程名PROC属性
……
过程名ENDP
codesegment
mainprocfar
......
callsubr1
......
ret
mainendp
subr1procnear
......
ret
subr1endp
codeends例6.2调用程序和子程序不在同一代码段中
segxsegment
......
subtprocfar
......
ret
subtendp
......
callsubt
......
segxendsends
segysegment
segment
......
callsubt
......
segyendsends子程序调用(中断调用):隐含使用堆栈保存返回地址
callnearptrsubp
(1)保存返回地址
(2)转子程序
(IP)←subp的偏移地址
callfarptrsubp
(1)保存返回地址
(2)转子程序
(CS)←subp的段地址
(IP)←subp的偏移地址过程属性的确定原则:
NEAR属性:调用程序和子程序在同一代码段中(段内调用)
FAR属性:调用程序和子程序不在同一代码段中(段间调用)RETIRET指令的属性带参数返回:
在得到返回地址之后,SP还要增加的偏移量CALL调用指令(仅以16位为例)
段内直接近调用:CALLDST
执行操作:PUSH(IP)
(IP)←(IP)+16位位移量
段内间接近调用:CALLDST
执行操作:PUSH(IP)
(IP)←(EA)
段间直接远调用:CALLDST
执行操作:PUSH(CS)
PUSH(IP)
(IP)←DST偏移地址
(CS)←DST段地址
段间间接远调用:CALLDST
执行操作:PUSH(CS)
PUSH(IP)
(IP)←(EA)
(CS)←(EA+2)RET返回指令
段内近返回:RET
执行操作:(IP)POP()
段内近带立即数近返回:RETEXP
执行操作:(IP)POP() (SP)←(SP)+D16(由EXP计算得到)段间远返回:RET
执行操作:(IP)←POP()
(CS)←POP()
段间带立即数远返回:RETEXP
执行操作:(IP)←POP()
(CS)←POP()
(SP)←(SP)+D16(由EXP计算得到)6.1.3保存与恢复寄存器
1、为什么要有保存与恢复寄存器的操作?
调用程序和子程序所使用的堆栈会发
生冲突,为了避免运行发生错误
3、要对哪些寄存器保存和恢复?
(1)子程序子程序中用到的寄存器应该保存
(2)负责传送参数的寄存器则不一定需要保存,
特别是用来向主程序回送结果的寄存器例6.3十进制到十六进制的转换程序
(通过寄存器传送变量)
decihexsegment;1016
assumecs:decihex
mainprocfar
pushds
subax,ax
pushax
repeat:calldecibin;102
callcrlf
callbinihex;216
callcrlf
jmprepeat
ret
mainendpdecibinprocnear;102
movbx,0
newchar:movah,1
int21h
subal,30h
jlexit;<0退出
cmpal,9d
jgexit;>9退出
cbw
xchgax,bx
movcx,10d
mulcx
xchgax,bx
addbx,ax
jmpnewchar
exit:ret
decibinendpbinihexprocnear;216
movch,4
rotate:movcl,4
rolbx,cl
moval,bl
andal,0fh
addal,30h
cmpal,3ah
jlprintit
addal,7h