单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第六章 子程序结构,子程序的概念,子程序的定义,子程序设计方法,子程序应用举例,子程序的嵌套与递归调用,子程序的概念,在程序设计中,我们会发现一些多次无规律重复的程序段或语句序列。解决此类问题一个行之有效的方法就是将它们设计成可供反复调用的独立的子程序结构,以便在需要时调用。在汇编语言中,子程序又称过程。,调用子程序的程序称为主调程序或主程序。,子程序的定义,子程序的定义是由过程定义伪指令,PROC,和,ENDP,来完成的。其格式如下:,过程名,PROC NEAR/FAR,过程名,ENDP,其中,PROC,表示过程定义开始,,,ENDP,表示过程定义结束。过程名是过程入口地址的符号表示。,一般过程名同标号一样,具有三种属性,即段属性、偏移地址属性以及类型属性。,子程序设计方法,信息的保护与恢复,主程序与子程序参数传递方式,信息的保护与恢复,例如:若子程序,PROG,中改变了寄存器,AX,BX,CX,DX,的值,则可采用如下方法保护和恢复现场。,PROGPROC,PUSHAX,PUSHBX,PUSHCX;,保护现场,PUSHDX,POPDX,POPCX,POPBX;,恢复现场,POPAX,RET;,返回断点处,PROCENDP,主程序与子程序参数传递方式,(1)寄存器法,(2)约定单元法,(3)堆栈法,子程序应用举例,【例】将一个给定的二进制数按位转换成相应的,ASCII,码字符串,送到指定的存储单元并显示。如二进制数10010011转换成字符串为10010011。要求将转换过程写成子程序,且子程序应具有较好的通用性,而必须能实现对8倍和16倍二进制数的转换。,入口参数:,DX,存放待转换的二进制数,CX,存放待转换数的位数(8位或16位),DI,存放,ASCII,码首地址,出口参数:转换后的字符串存放在,以,DI,作指针的字节存贮区中,程序如下:,DATASEGMENT,NUM8DB93H,NUM16DW0ABCDH,ASCBUFDB20DUP(0),DATAENDS,CODESEGMENT,ASSUME DS:DATA,CS:CODE,SS:STACK,START:MOVAX,DATA,MOVDS,AX,MOVDX,0,MOVDL,NUM8;,转换二进制数送,DX,MOVCX,8;,置位数8,LEADI,ASCBUF;,字符串首址,DI,CALLBTASC;,调用子程序,BTASC,MOVDI,BYTE PTR 0DH,MOVDI+1,BYTE PTR 0AH,MOVDI+2,BYTE PTR$,LEADX,ASCBUF,MOVAH,9,INT21H,MOVDX,NUM16,MOVCX,16;,置位数16,LEADI,ASCBUF,CALLBTASC,MOVDL,BYTE PTR 0DH,MOVDL+1,BYTE PTR 0AH,MOVDL+2,BYTE PTR;,显示转换后的字符串,LEADX,ASCBUF,MOVAH,9,INT21H,BTASCPROC,PUSHAX;,保存,AX,MOVAL,0,CMPCX,8;,比较8位数,JNEL1;,直接转换16位数,MOVDH,DL;8,位数转换送,DH,L1:ROLDX,,1;DX,最高位移入,CF,RCLAL,1;CF,移入,AL,最低位,ADDAL,30H,MOVDI,AL,INCDI,LOOPL1,POPAX,RET,BTASCENDP,CODEENDS,ENDSTART,子程序的嵌套与递归调用,1子程序的嵌套,子程序不但可以被主程序调用,而且也可以被其他子程序调用。我们把一个子程序调用另一个子程序称为子程序的嵌套调用。,2子程序的递归调用,子程序的递归调用是指一个子程序直接或间接地调用自己。递归子程序一般对应于数学上对函数的递归定义,它往往能设计出效率较高的程序,完成相当复杂的计算,因而是很有用的。,【例】试编制计算,N!(N0),的程序。,N!=N*(N-1)*(N-2)*1,其递归定义如下:,0!=1,N!=N*(N-1)!(N1),计算,N!,的子程序,FACT,的流程图如图所示。,【例】计算5!的程序示例,,RESULT,是保存阶乘的存储单元。,程序如下,:,STACKSEGMENT STACK,DB 200 DUP(0),STACKENDS,DATASEGMENT,NDW 5,RESULTDW?,DATAENDS,CODESEGMENT,ASSUME CS:CODE,SS:STACK,DS:DATA,START:MOVAX,DATA,MOVDS,AX,MOVAX,N,CALLFACT,MOVAX,RESULT,MOVAH,4CH,INT21H,FACTPROC,CMPAX,0,JNEL1,MOVRESULT,1,JMPEXIT,L1:PUSHAX,DECAX,CALLFACT,POPAX,MOVRESULT,MOVRESNLT,AX,EXIT:RET,FACTENDP,CODEENDS,ENDSTART,