文档介绍:第六章子程序结构
第一节子程序设计方法
第二节结构伪操作
第三节程序举例
子程序又称为过程,它相当于高级语言中的过程和函数,在一个程序的不同部分,往往要用到类似的程序段,这些程序段的功能和结构形式都相同,只是某些变量的赋值不同,此时就可以把这些程序段写成子程序形式,以便调用。
子程序设计
子程序的概念
子程序的定义
子程序设计方法
子程序应用举例
子程序的嵌套与递归调用
返回本章首页
子程序的概念
在程序设计中,我们会发现一些多次无规律重复的程序段或语句序列。解决此类问题一个行之有效的方法就是将它们设计成可供反复调用的独立的子程序结构,以便在需要时调用。在汇编语言中,子程序又称过程。
调用子程序的程序称为主调程序或主程序。
返回本节
子程序的定义
子程序的定义是由过程定义伪指令PROC和ENDP来完成的。其格式如下:
过程名 PROC [NEAR/FAR]
┆
过程名 ENDP
其中PROC表示过程定义开始,ENDP表示过程定义结束。过程名是过程入口地址的符号表示。
一般过程名同标号一样,具有三种属性,即段属性、偏移地址属性以及类型属性。
返回本节
过程定义伪操作用在过程(子程序)的前后,使整个过程形成清晰的,具有特定功能的代码块。
格式:procedure name proc attribute (far/near)
procedure name endp
①其中,过程名为标识符,它又是子程序入口的符号地址,它的写法与标号相同。
②NEAR属性: 段内调用,及返回
FAR属性:段间调用,及返回
CALL调用及RET返回的属性由程序决定。
返回本章
用户对过程属性的确定原则:
⑴调用程序和过程在同一个代码段中则使用NEAR属性;
⑵调用程序和过程不同一个代码段中则使用FAR属
例:调用程序和子程序在同一代码段中。
Main proc far | main proc far
| 
  |
Call sub r1 | Call sub r1
|
Ret | ret
Main endp | subr1 proc near
  |
  |
Subr1 proc near | ret
  |
Ret | subr1 endp
Subr1 endp | main endp
因为调用程序MAIN和子程序SUBR1是在同一代码段中,
所以SUBR1定义为NEAR属性,这样MAIN中对SUBR1的调用和SUBR1中的RET就都是NEAR属性的。
一般MAIN应定义为FAR属性,这是由于我们把程序的主过程看作DOS调用的一个子过程。所以DOS对MAIN的调用以及MAIN中的RET就是FAR属性的。
。
SEGX SEG MENT
 SUBT PROC FAR
  RET
SUBT ENDP
CALL SUBT
 SEGX ENDS
SEGY SEG MENT
CALL SUBT
 SEGY ENDS
SUBT为一过程,它有两处被调用,一处是与它在同一段的SEGY段内,另一处是在另一段SEGY段内,为此SUBT必须具有FAR属性,以适应SEGY段调用的需要。
SUBT既有FAR属性,则在SEGX和SEGY段对SUBT的调用就具有FAR属性了。
2、子程序的调用和返回。
过程的正确执行是由子程序的正确调用及正确返回保证的。
①调用CALL指令,返回RET指令;
子程序运行期间的堆栈状态
②CALL时以使返回地址入栈,RET时应使返回地址出栈。
3、保存与恢复寄存器。
由于调用程序(主程序)和子程序经常是分别编制的,所以他们所使用的寄存器往往会发生冲突,如果主程序在调用子程序以前的某个寄存器内容,在从子程序返回后还有用,而子程序又恰好使用了同一个寄存器,造成破坏了该寄存器的原有内容,导致程序错误。
为此,我们把子程序要使用的寄存器内容保存在堆栈中,而在退出子程序前,把寄存器恢复原状。