2、 递归子程序:子程序自己调用自己的情况称为递归调用,这种子程序称为递归子程序 二、嵌套深度 图1表示了嵌套深度为2时的子程序嵌套情况。 例1 两个6字节数相加。 分析:将一个字节相加的程序段设计为子程序。主程序分3次调用该子程序,但每次调用的参数不同。 程序如下: DATA SEGMENT ADD1 DB FEH,86H,7CH,35H,68H,77H ADD2 DB 45H,BCH,7DH,6AH,87H,90H SUM DB 6DUP(0) COUNT D
3、B 6 DATA ENDS STACK SEGMENT DB 100DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK MADD: MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV SI,OFFSET ADD1 MOV DI,OFFSET ADD2 MOV BX,OFFSET SUM MOV CX,COUNT ;循环初值为6 CLC A
4、GAIN:CALL SUBADD ;调用子程序 LOOP AGAIN ;循环调用6次 MOV AX,4C00H INT 21H ;子程序入口参数:SI,DI,BX 出口参数:SI,DI,BX SUBADD PROC ;完成一个字节相加 PUSH AX ;保护AX的值 MOV AL,[SI] ;SI是一个源操作数指针 ADC AL,[DI] ;DI是另一个源操作数指针 MOV [BX],AL ;BX是结果操作数指针 INC SI INC
5、DI INC BX POP AX ;恢复AX的值 RET SUBADD ENDP CODE ENDS END MADD 例2 把内存中的字变量NUMBER的值,转换为4个ASCII码表示的十六进制数码串,串的起始地址为STRING。 分析:把内存中的字变量NUMBER的值,转换为4个ASCII码表示的十六进制数码串的工作设计成一个子程序,在这个子程序中再调用另一个子程序,由它完成从BCD码到ASCII码的转换。 程序如下: DATA SEGMENT NUMBER D
8、4 AGAIN: AND AX,0FH ;取低4位 CALL HEXD ;调子程序 STD STOSB ;保护转换数据 PUSH CX ;保护CX的值 MOV CL,4 SHR DX,CL MOV AX,DX POP CX LOOP AGAIN POPF POP DX POP CX POP DI POP AX POP BP RET