在程序设计中,我们会发现一些多次无规律重复的程序段或语句序列。解决此类问题一个行之有效的方法就是将它们设计成可供反复调用的独立的子程序结构,以便在需要时调用。在汇编语言中,子程序又称过程。
调用子程序的程序称为主调程序或主程序。
5.2 子程序的定义
子程序的定义是由过程定义伪指令PROC和ENDP来完成的。其格式如下:
过程名 PROC [NEAR/FAR]
┆
过程名 ENDP
其中PROC表示过程定义开始,ENDP表示过程定义结束。过程名是过程入口地址的符号表示。
一般过程名同标号一样,具有三种属性,即段属性、偏移地址属性以及类型属性。
5.3 子程序设计方法
1.信息的保护与恢复
例如:若子程序PROG中改变了寄存器AX,BX,CX,DX的值,则可采用如下方法保护和恢复现场。
PROG PROC
PUSH AX
PUSH BX
PUSH CX ;保护现场
PUSH DX
┆
┆
POP DX
POP CX
POP BX ;恢复现场
POP AX
RET ;返回断点处
PROC ENDP
2.主程序与子程序参数传递方式
(1)寄存器法
(2)约定单元法
(3)堆栈法
5.4 子程序应用举例
【例4.12】将一个给定的二进制数按位转换成相应的ASCII码字符串,送到指定的存储单元并显示。如二进制数10010011转换成字符串为‘10010011’。要求将转换过程写成子程序,且子程序应具有较好的通用性,而必须能实现对8倍和16倍二进制数的转换。
入口参数:DX存放待转换的二进制数
CX存放待转换数的位数(8位或16位)
DI存放ASCII码首地址
出口参数:转换后的字符串存放在以DI作指针的字节存贮区中
程序如下:
DATA SEGMENT
NUM8 DB 93H
NUM16 DW 0ABCDH
ASCBUF DB 20 DUP(0)
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE, SS:STACK
START: MOV AX,DATA
MOV DS,AX
MOV DX,0
MOV DL,NUM8 ;转换二进制数送DX
MOV CX,8 ;置位数8
LEA DI,ASCBUF ;字符串首址→DI
CALL BTASC ;调用子程序BTASC
MOV [DI],BYTE PTR 0DH
MOV [DI+1],BYTE PTR 0AH
MOV [DI+2],BYTE PTR ‘$’
LEA DX,ASCBUF
MOV AH,9
INT 21H
MOV DX,NUM16
MOV CX,16 ;置位数16
LEA DI,ASCBUF
CALL BTASC
MOV [DL],BYTE PTR 0DH
MOV [DL+1],BYTE PTR 0AH
MOV [DL+2],BYTE PTR ‘$’ ; 显示转换后的字符串
LEA DX, ASCBUF
MOV AH,9
INT 21H
BTASC PROC
PUSH AX ;保存AX
MOV AL,0
CMP CX,8 ;比较8位数
JNE L1 ;直接转换16位数
MOV DH,DL ;8位数转换送DH
L1: ROL DX,,1 ;DX最高位移入CF
RCL AL,1 ;CF移入AL最低位
ADD AL,30H
MOV [DI],AL
INC DI
LOOP L1
POP AX
RET
BTASC ENDP
CODE ENDS
END START
5.5 子程序的嵌套与递归调用
1.子程序的嵌套
子程序不但可以被主程序调用,而且也可以被其他子程序调用。我们把一个子程序调用另一个子程序称为子程序的嵌套调用。
2.子程序的递归调用
子程序的递归调用是指一个子程序直接或间接地调用自己。递归子程序一般对应于数学上对函数的递归定义,它往往能设计出效率较高的程序,完成相当复杂的计算,因而是很有用的。
【例4.15】试编制计算N! (N≥0)的程序。N!=N*(N-1)*(N-2)*……*1
其递归定义如下:
0!=1
N!=N*(N-1)! (N>1)
计算N!的子程序FACT的流程图如图4.10所示。

【例4.16】计算5!的程序示例, RESULT是保存阶乘的存储单元。
程序如下:
STACK SEGMENT STACK
DB 200 DUP(0)
STACK ENDS
DATA SEGMENT
N DW 5
RESULT DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, SS:STACK,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV AX,N
CALL FACT
MOV AX,RESULT
MOV AH,4CH
INT 21H
FACT PROC
CMP AX,0
JNE L1
MOV RESULT,1
JMP EXIT
L1: PUSH AX
DEC AX
CALL FACT
POP AX
MOV RESULT
MOV RESNLT,AX
EXIT: RET
FACT ENDP
CODE ENDS
END START


