预览加载中,请您耐心等待几秒...
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;1016 assumecs:decihex mainprocfar pushds subax,ax pushax repeat:calldecibin;102 callcrlf callbinihex;216 callcrlf jmprepeat ret mainendpdecibinprocnear;102 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;216 movch,4 rotate:movcl,4 rolbx,cl moval,bl andal,0fh addal,30h cmpal,3ah jlprintit addal,7h