第5节 子程序设计
推荐给好友
打印
加入收藏
更新于2009-06-01 11:01:33

5.1 子程序的概念

在程序设计中,我们会发现一些多次无规律重复的程序段或语句序列。解决此类问题一个行之有效的方法就是将它们设计成可供反复调用的独立的子程序结构,以便在需要时调用。在汇编语言中,子程序又称过程。
调用子程序的程序称为主调程序或主程序。

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

 

上一节                    下一节

相关链接


 
关于我们 | 诚邀加盟 | 客户服务 | 相关法律 | 网站地图 | 友情链接 | 服务信箱:service@eefocus.com
© 2006 与非门科技信息咨询(北京)有限公司 All Rights Reserved.