文档介绍:第六章
子程序设计
子程序的定义
子程序
把功能相对独立的程序段单独编写和调试,作为一个相对独立的模块供程序使用,就形成子程序
特点
实现源程序的模块化
简化源程序结构
提高编程效率
过程定义伪指令
参数传递是子程序设计的重点和难点
子程序可以嵌套
主要内容
子程序的定义
过程定义伪操作
过程名 PROC [NEAR]|FAR
...
RET
过程名 ENDP
NEAR属性(段内近调用)的过程只能被相同代码段的其他程序调用
FAR属性(段间远调用)的过程可以被相同或不同代码段的程序调用
不能缺少!
子程序的常见格式
subname proc ;具有缺省属性near的subname过程
push ax ;保护寄存器:顺序压入堆栈
push bx ;ax/ bx/ cx仅是示例
push cx
…;过程体
pop cx ;恢复寄存器:逆序弹出堆栈
pop bx
pop ax
ret ;过程返回
subname endp ;过程结束
子程序中使用了AX,BX,CX
子程序的调用与返回指令
指令格式
指令功能
寻址方式
CALL DST
SP=SP-2;[SP]=CALL指令的下一条指令的IP值; IP=IP+D16
段内直接调用
CALL FAR PTR DST
SP=SP-2;[SP]=返回地址的段地址
SP=SP-2;[SP]=返回地址的偏移值
IP=DST的偏移地址,CS=DST的段地址
段间直接调用
CALL DST
如: CALL BX
SP=SP-2;[SP]=CALL指令的下一条指令的IP值
IP=DST中的有效地址EA(IP=BX)
段内间接调用
CALL DST
如:
CALL DWORD PTR[BX]
SP=SP-2;[SP]=返回地址的段地址
SP=SP-2;[SP]=返回地址的偏移值
IP=EA的低16位,CS=EA的高16位
段间间接调用
RET
IP=[SP],SP=SP+2
段内返回
RETF
IP=[SP], SP=SP+2
CS=[SP],SP=SP+2
段间返回
RET n
IP=[SP], SP=SP+2(段内)
CS=[SP],SP=SP+2(段间)
SP=SP+n
段内或段间带参数返回
断点入栈
转子程序
子程序的调用指令
格式: CALL 过程名
过程名就是子程序入口地址,即子程序第一条指令的首字节地址
 
CALL指令寻址方式
段内直接寻址
段内间接寻址
段间直接寻址
段间间接寻址
返回指令
格式: RET/ RETF/ RET n
寻址方式:
段内返回
段间返回
说明:
CALL和RET指令的属性
过程是有类型的,缺省情况下是NEAR类型
CALL和RET 指令的操作也是有类型的
如果定义的过程是FAR属性的,那么对它的调用和返回一定都是FAR属性的。(断点的保存和弹出都是32位的)。
如果定义的过程是NEAR属性的,那么对它的调用和返回一定都是NEAR属性的。(断点的保存和弹出都是16位的)。
子程序和调用程序之间的调用形式
1、调用程序和子程序在同一个代码段
CODE SEGMENT
ASSUME CS:CODE
……
CALL SUBR1
……
SUBR1 PROC
……
RET
SUBR1 ENDP
CODE ENDS