掌握子程序的设计方法;理解子程序调用与返回指令的执行过程及堆栈的变化情况;掌握子程序调用过程中主程序与子程序间的参数传递方式,掌握现场的保护与恢复方法。
1、内存自BUF单元开始的缓冲区连续存放着10个学生的英文分数,编程序统计其中90~100,60~89,60以下者各有多少人?并把90-100分人数结果存放在P1单元中、60-89分人数结果存放在P2单元中,60分以下人数结果存放在P3单元中(P1、P2、P3为数据段的单元),最后把P1、P2、P3中的数以”P1=?、P2=?、P3=?”显示在屏幕上。(注:数据以10进制显示)
改成子程序结构如下:
DATAS SEGMENT
BUF DB 70H,58H,50H,91H,99H,62H,75H,82H,74H,60H
ORG 0020H
P1 DB 0
ORG 0030H
P2 DB 0
ORG 0040H
P3 DB 0
ORG 0050H
DP1 DB 'P1= $'
ORG 0060H
DP2 DB 'P2= $'
ORG 0070H
DP3 DB 'P3= $'
ORG 0080H
COUNT DW 10
DATAS ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DATAS
MAIN PROC FAR
START::
MOV AX,DATAS
MOV DS,AX
CALL CNT
MOV AH,4CH
INT 21H
MAIN ENDP
CNT PROC NEAR
MOV CX,COUNT
MOV SI,OFFSET BUF
LP1:
MOV AL,BUF[SI]
CMP AL,90H
JNB BTW90_100
CMP AL,60H
JNB BTW60_89
JL BLOW60
BTW90_100:
INC P1
INC SI
LOOPNZ LP1
JMP DISP
BTW60_89:
INC P2
INC SI
LOOPNZ LP1
JMP DISP
BLOW60:
INC P3
INC SI
LOOPNZ LP1
DISP:
MOV DX,OFFSET DP1
MOV AH,09H
INT 21H
MOV DL,P1
ADD DL,30H
MOV AH,02H
INT 21H
MOV AH,02H
MOV DL,0DH
INT 21H
MOV AH,02H
MOV DL,0AH
INT 21H
MOV DX,OFFSET DP2
MOV AH,09H
INT 21H
MOV DL,P2
ADD DL,30H
MOV AH,02H
INT 21H
MOV AH,02H
MOV DL,0DH
INT 21H
MOV AH,02H
MOV DL,0AH
INT 21H
MOV DX,OFFSET DP3
MOV AH,09H
INT 21H
MOV DL,P3
ADD DL,30H
MOV AH,02H
INT 21H
RET
CNT ENDP
CSEG ENDS
END START
- 阅读程序,指出子程序的功能,并回答程序里的问题。
CODES SEGMENT
ASSUME CS:CODES
START:MOV AX,1 ;令AX等于1
MOV CX,3 ;令CX等于3,可以计数循环三次
CALL S ;调用S子程序,从这里进入S子程序
MOV BX,AX ;调用结束,将AX中的数据送给BX中保存
MOV AX,4C00H
INT 21H ;结束
S:ADD AX,AX ;CALL S后将AX中的数据翻倍存入AX中,第一次 结束时为2,第二次结束时为4,第三次结束时为8
LOOP S ;循环进行S操作,回到上一步,CX自减1,直至为0
RET ;CX减至0,结束子程序S的调用,返回主函数调用原位置
CODES ENDS
END START
最终本程序实现了数据1的三次翻倍,结束后BX中的数据应为8
- 设有10个字符分别是COUNT123_W存放在S中,试通过子程序的方式完成将S中的字符分别按字母、数字、及其他字符分类计数,并将计数结果分别存放到S1,S2,S3中。
解:
数据在ds段中;COUNT123_W为十个字节;所以s1地址为770:11其他字符个数 1;s2地址为770:12数字个数为3; s3地址为770:13 字母个数6
代码 :
DATAS SEGMENT
s db 'COUNT123_W'
s1 db 1 dup(?) ;其他字符个数
s2 db 1 dup(?) ;数字个数
s3 db 1 dup(?) ;字母个数
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
mov CX,10 ;循环10次
lea SI,s ;得到si的偏移地址
BEGIN:
MOV al,[SI] ;取该地址第一个元素
CMP AL,30H
JB A1 ;当小于30H为其他字符,跳转到A1
CMP AL,39H
JBE A2 ;30H~39H为数字,跳转到A2
cmp al,41H
JB A1 ;3AH-40H为其他字符
CMP AL,5AH
JBE A3 ;41H-5AH为大写字符
CMP al,61H
JB A1 ;5BH-60H为其他字符
CMP AL,7AH
JBE A3 ;61H-7AH为小写字符
A1:add byte ptr[s1],1 ;计数
JMP Q1
A2:add byte ptr[s2],1
JMP Q1
A3:add byte ptr[s3],1
JMP Q1
Q1:
INC SI
loop BEGIN ;循环
MOV AH,4CH
INT 21H
CODES ENDS
END START
运行截图: