第六章 子程序结构
- 格式:pps
- 大小:861.50 KB
- 文档页数:80
第六章 子程序结构一、主程序与子程序的概念子程序又称为过程,它相当于高级语言中的过程和函数。
通常,凡是具有相对独立功能的程序段或需要多次应用的程序段都可以编制成子程序。
程序中当需要这段程序时,用调用指令CALL 转到这段程序中去,执行完毕,通过RET 指令返回原来的程序。
如下图(1)所示。
子程序返回后,从CALL 的下一条指令X 1继续执行主程序。
使用子程序优点:节省编程时间和存储空间,有利于设计一个大而复杂的程序。
即可以把一个大而复杂的程序设计成由一个主程序和若干个子程序组成,使用模块化程序设计,减少程序设计复杂性。
使用子程序不足之处:在调用和返回时要进行堆栈操作,增加CPU 开销,使程序速度减慢。
继续SURENDP X 1: (1)主程序与子程序的关系(2)子程序嵌套调用主程序与子程序的概念是相对的。
图(2)是一个子程序嵌套调用的例子。
图中,程序1在A、B两处调用程序2,在C处调用程序3,则称程序2和3是程序1的子程序,程序1是主程序;而程序2和3又分别调用程序4,则称程序4是程序2和3的子程序,程序2和3是主程序。
这就是子程序中嵌套子程序。
子程序还可以直接或间接调用自己,称为递归子程序和递归调用。
二、调用指令CALL 和返回指令RET(参见指令系统p.98)CALL 调用指令RET 返回指令由于子程序和调用程序可以在同一个段中,也可以不在同一段中,因此这两条指令的格式如下:1、调用指令CALL DSTCALL指令语句实现子程序(即过程)的调用。
调用结束后,要由所调用的子程序RET指令返回到CALL指令的下一条指令(即返回调用断点),因此执行CALL指令时要进行进栈操作。
具体分为直接调用和间接调用。
直接调用:目标地址直接出现在CALL指令语句中,DST就是过程名(即子程序名)。
间接调用:由16位通用寄存器或者存储单元提供调用地址。
(1)段内直接调用格式:CALL DST执行的操作:Push(IP) ;当前IP值进栈(IP)←(IP)+D16;目标地址装入IP,程序转移指令操作分二步:第一步,是把子程序的返回地址(即调用程序中CALL指令的下一条指令的地址)存入堆栈中,以供子程序返回主程序时使用。
1第六章子程序结构三、子程序参数传递参数:入口参数: 在子程序中被处理的数据出口参数: 表示子程序处理结果的数据(1) 通过寄存器传送参数(2) 通过存储器传送参数(3) 通过堆栈传送参数或参数地址(4)*多个模块之间的参数传送软延时:指利用CPU 执行指令需要耗费一定时间的特点实施的延时,常用减1循环来实现。
例:8088CPU ,主频4.77M ,每个时钟周期为:1/4.77M = 0.21μs 。
循环指令LOOP ,当CX 不为零时,执行循环转移分支,占用17个时钟周期;当CX 为零时,退出循环,占用5个时钟周期。
如果CX 初值是2801时,执行指令W AIT1:LOOP W AIT1,所需时间为:(0.21×2801)×17 + 0.21 ×5 ≈ 10ms子程序调用,实现100ms、550延时CSEG SEGMENTASSUME CS:CSEG,……MAIN PROC FARPUSH DSSUB AX,AXPUSH AX……MOV BX,10 ;延时100ms,参数赋值CALL DELAY ;调用延时子程序MOV BX,55 ;延时550ms,参数赋值CALL DELAY ;调用延时子程序……RETMAIN ENDP例:十六进制到十进制的转换(通过寄存器传送参数)assume cs: hexidecmain proc farstart: push dssub ax, axpush axrepeat:call crlfcall crlfjmp repeat retmain endp ………………hexidec ends end start如果数据段定义如下:data segmentary dw 1,2,3,4,5,6,7,8,9,10count dw 10sum dw ?ary1 dw 10,20,30,40,50,60,70,80,90,100count1 dw 10sum1 dw ?data ends如果直接访问内存变量,那么累加数组ary和数组ary1中的元素不能用同一个子程序proadd。