序,则称为子程序嵌套。子程序在多层嵌套中,要格外注意程序中的堆栈操作,要确保子程序在每次返回时,SP指向的是正确的返回地址,而不是数据或其他信息。
递归也是子程序嵌套的一种形式,它嵌套调用的过程就是它自身。同样在编写递归子程序时,要特别注意堆栈状态的变化。
子程序设计:
子程序的设计过程归纳为一下几步: (1)确定子程序的名称和调用属性。
(2)确定子程序入、出口参数,以及适当的参数传递方式。 (3)确定子程序的算法,画出流程图,并编写程序。 (4)确定子程序的寄存器和存储单元使用情况,并进行现场保护。
(5)编写子程序说明文档。
由于子程序通常是要反复使用或供他人使用的,在设计子程序的同时就应当建立子程序的说明文档,清楚地描述该子程序的功能和调用方法,以便于以后正确使用和维护。一般来说子程序说明文档应包括以下内容:
(1)子程序名:一般应使用具有一定含义的标识符。 (2)功能:说明该子程序完成的具体任务。
(3)入口参数:说明子程序运行所需的参数及其存取方式。 (4)出口参数:说明子程序运行结果及其存取方式。 (5)工作寄存器及存储单元:说明该子程序运行中寄存器和存
储单元的占用情况。
(6)坐着及最后修改日期:注明程序作者及修改日期,以便今后的维护。
(7)示例:在必要时,通过具体例子示范参数的使用,并起验证作用。
第四章 程序设计分析
分析:
将各分数段人数的统计放在子程序中完成,主程序把存放成绩的单元首地址、各分数段人数的存放单元地址以及要统计的总人数利用堆栈传递给子程序。统计的方法可以采用多分支结构,也可以利用成绩的十位数减去5作为变址值,从而实现在对应的分数段人数单元加1的功能,显然,后一种方法编制的程序效率更高。
子程序名:COUNT
功 能:统计低于60、60~69、70~79、80~89、90~99及100分的人数
入口参数:将统计的总人数、存放成绩的单元首地址、统计各分数段人数的单元首地址压入堆栈
出口参数:各分数段人数在数据存储区中
第五章 程序流程图
开始 主程序 存放成绩单元首地址送SI 各分数段人数的单元首地址送DI 要统计的人数送CX 调用子程序 个人成绩除以10的商减5的值 对应的地址空间内容加1 NO 10次循环 YES 结束 第六章 各模块说明
1、成绩传送模块。将存放数据的段首地址送给SI,通过对SI加2
来实现对各个数据的传送。
2、成绩分段并传送模块。将取出来的成绩经过调用子程序,通过子程序处理后得到的分数段个数送到各自对应的分数段单元中。 3、各个分数段个数的显示。调用DOS中断,将个数显示到计算机屏幕上。
4、子程序模块。对从数据段中取出来的数据进行处理和判断。实现方法如下:将分数除以10得到十位数,将十位数减去5,可以得到小于5的数,然后加上分数段个数存放单元的首地址,即可以存放在指定的单元中。
第七章 程序清单
设计方案:
统计的方法采用多分支结构 程序:
DSEG SEGMENT
TABL DB 56、69、70、76、73、85、88、90、96、100; N EQU 0 A DB 0
B DB 0 C DB 0 D DB 0 E DB 0 F DB 0 DSEG ENDS
SSEG SEGMENT STACK DB 200 DUP(?) SSEG ENDS CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG,SS:SSEG STACK:MOV AX ,DSEG MOV DS ,AX LEA SI ,TABL MOV CX ,N LP: MOV AL ,[SI] CMP AL ,60 JB S50 CMP AL ,70 JB S60 CMP AL ,80 JB S70
CMP AL ,90 JB S80
CMP AL,100 JB S90 S100:INC A
JMP NEXT S90: INC B
JMP NEXT S80: INC C
JMP NEXT S70:INC D JMP NEXT S60: INC E JMP NEXT S50: INC F NEXT:INC SI LOOP LP EXIT: MOV AH ,4CH
INT 21H
CSEG ENDS END START