4.5.3 子程序的嵌套
某程序调用一个或若干个子程序,称为子程序一般调用。某个程序调用某一子程序,而该子程序又调用另外一个子程序,就称为子程序的嵌套调用。这两种调用形式如图4-17所示。
图4-17 主程序调用方式示意图
【例4-15】 编程实现6字节数相加。
分析 将一个字节相加的程序段设计为子程序。主程序分6次调用该子程序,但每次调用的参数不同。程序如下:
DATA SEGMENT
ADD1 DB FEH,86H,7CH,35H,68H,77H
ADD2DB 45H,BCH,7DH,6AH,87H,90H
SUMDB 6DUP(?)
COUNT DB 6
DATA ENDS
STACK SEGMENT
DB 100 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START: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
AGAIN:CALLSUB1;调用子程序
LOOP AGAIN;循环调用6次
MOV AH,4CH
INT 21H
;子程序入口参数:SI,DI,BX 出口参数:SI,DI,BX完成一个字节相加SUB1 PROC
PUSH AX;保护AX的值
MOV AL,[SI];SI是一个源操作数指针
ADC AL,[DI];DI是另一个源操作数指针
MOV[BX],AL;BX是结果操作数指针
INC SI;修改指针
INC DI
INC BX
POP AX;恢复AX的值
RET
SUB1 ENDP
CODE ENDS
END START
【例4-16】 把内存中字变量NUM的值,转换为4个ASCII码表示的十六进制数码串,串的起始地址为STRING。
分析 把内存中的字变量NUM的值,转换为4个ASCII码表示的十六进制数码串的工作设计成一个子程序,在这个子程序中再调用另一个子程序,由它完成从BCD码到ASCII码的转换。程序如下:
STACK SEGMENT
DB 200 DUP(?)
STACK ENDS
DATA SEGMENT
NUM DW 25AFH
STRING DB 4DUP(?),0DH,0AH,′$′
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
LEA BX,STRING
PUSH BX;将参数(结果地址指针)压入堆栈
PUSH NUM;将源数据压入堆栈
CALLBINIHEX;调用子程序
LEA DI,STRING
MOV AH,09H
INT 21H
BINIHEX PROC
PUSH BP
MOV BP,SP
PUSH AX
PUSH DI
PUSH CX
PUSH DX
PUSHF;以上为保护现场
MOV AX,[BP+4];取出NUM
MOV DI,[BP+6];取出STRING的偏移地址
ADD DI,LENG TH STRING-1;使DI指向转换数据
MOV DX,AX;保护原始数据
MOV CX,4
AGAIN:AND AX,0FH;取低4位
CALLBCDIASI;调子程序
STD
STOSB;保护转换数据
PUSH CX;保护CX的值
MOV CL,4
SHRDX,CL
MOV AX,DX
POP CX
LOOP AGAIN
POPF
POP DX
POP CX
POP DI
POP AX
POP BP
RET 4
BINHEX ENDP
BCDIASI PROC;将AL中的BCD码转换成ASCII码
CMP AL,′A′:与A的ASCII码比较
JLLP
ADD AL,07H;大于A加30H后还要加7
LP:ADD AL,30H;小于A只加30H
RET
BCDIASI ENDP
CODE ENDSEDN START
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。