文档介绍:第六章子程序设计
任课教师:陶雪丽
xueli_xl@
11/12/2017
1
河南师范大学计算机与信息技术学院
本章内容提要
子程序设计
子程序的嵌套
子程序举例
11/12/2017
2
河南师范大学计算机与信息技术学院
子程序设计
1
过程定义伪操作
2
子程序的调用和返回
3
保存与恢复寄存器
4
子程序的参数传递
5
增强功能的过程定义伪操作
11/12/2017
3
河南师范大学计算机与信息技术学院
子程序
把功能相对独立的程序段单独编写和调试,作为一个相对独立的模块供程序使用,就形成子程序。
子程序可以实现源程序的模块化,可简化源程序结构,可以提高编程效率。
子程序设计要利用过程定义伪指。
参数传递是子程序设计的重点和难点
子程序可以嵌套;
一定条件下,还可以递归和重入
11/12/2017
4
河南师范大学计算机与信息技术学院
模块化程序设计
模块化程序设计方法是按照各部分程序所实现的不同功能把程序划分成多个模块,各个模块在明确各自的功能和相互间的连接约定后,就可以分别编制和调试程序,最后再把它们连接起来,形成一个大程序。
这是一种很好的程序设计方法。
子程序结构就是模块化程序设计的基础。
11/12/2017
5
河南师范大学计算机与信息技术学院
过程定义伪操作
格式:
过程名 proc [near|far]
...
过程名 endp
过程名(子程序名)为符合语法的标识符,是子程序入口的符号地址。
属性:
NEAR属性(段内近调用)的过程只能被相同代码段的其他程序调用。
FAR属性(段间远调用)的过程可以被相同或不同代码段的程序调用。
11/12/2017
6
河南师范大学计算机与信息技术学院
过程定义伪操作
80x86的汇编程序用PROC伪操作的类型属性来确定CALL和RET指令的属性。
对简化段定义格式,在TINY、PACT、FLAT模式下,过程的缺省属性为near;在MEDIUM、LARGE和HUGE存储模式下,过程的缺省属性为far。
对完整段定义格式,过程的缺省属性为near。
用户可以在过程定义时用near或far改变缺省属性。
11/12/2017
7
河南师范大学计算机与信息技术学院
子程序的调用和返回
过程的正确执行是由子程序的正确调用和正确返回保证的。
80x86的CALL和RET指令完成的就是调用和返回的功能。
为了保证正确性:
要正确选择PROC的属性;
注意子程序运行期间的堆栈状态。
执行CALL指令时,要使返回地址入栈;
执行RET指令时,要使返回地址出栈。
11/12/2017
8
河南师范大学计算机与信息技术学院
保存与恢复寄存器
子程序中一般要使用寄存器,除了要带参数返回结果的寄存器(返回参数)外,希望过程的执行不改变其他寄存器的内容。
如果子程序中要使用寄存器,而又不希望改变其原有内容,常用的方法:在子程序开始部分,把将要修改内容的寄存器顺序压栈,在过程最后返回调用程序(又称主程序)之前,再将这些寄存器内容逆序弹出。
常见格式如下所示:
无参数传递的子程序:回车换行
11/12/2017
9
河南师范大学计算机与信息技术学院
保存与恢复寄存器
SUBT PROC NERA
push ax ;保护寄存器:顺序压入堆栈
push bx ;ax/bx/cx仅是示例
push cx
…;过程体
pop cx ;恢复寄存器:逆序弹出堆栈
pop bx
pop ax
ret ;过程返回
SUBT ENDP ;过程结束
11/12/2017
10
河南师范大学计算机与信息技术学院