汇编语言及应用——子程序设计
掌握子程序的设计方法;理解子程序调用与返回指令的执行过程及堆栈的变化情况;掌握子程序调用过程中主程序与子程序间的参数传递方式,掌握现场的保护与恢复方法。
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 SEGMENTBUF DB 70H,58H,50H,91H,99H,62H,75H,82H,74H,60HORG 0020HP1 DB 0ORG 0030HP2 DB 0ORG 0040HP3 DB 0ORG 0050HDP1 DB 'P1= $'ORG 0060HDP2 DB 'P2= $'ORG 0070HDP3 DB 'P3= $'ORG 0080HCOUNT DW 10
DATAS ENDSCSEG SEGMENTASSUME CS:CSEG,DS:DATAS
MAIN PROC FAR
START::
MOV AX,DATAS
MOV DS,AX
CALL CNT MOV AH,4CHINT 21H
MAIN ENDPCNT PROC NEARMOV CX,COUNTMOV SI,OFFSET BUF
LP1:MOV AL,BUF[SI]CMP AL,90HJNB BTW90_100CMP AL,60HJNB BTW60_89JL BLOW60BTW90_100:INC P1INC SILOOPNZ LP1JMP DISPBTW60_89:INC P2INC SILOOPNZ LP1JMP DISP
BLOW60:INC P3INC SILOOPNZ LP1DISP:MOV DX,OFFSET DP1MOV AH,09HINT 21HMOV DL,P1ADD DL,30HMOV AH,02HINT 21HMOV AH,02HMOV DL,0DHINT 21HMOV AH,02HMOV DL,0AHINT 21HMOV DX,OFFSET DP2MOV AH,09HINT 21HMOV DL,P2ADD DL,30HMOV AH,02HINT 21HMOV AH,02HMOV DL,0DHINT 21HMOV AH,02HMOV DL,0AHINT 21HMOV DX,OFFSET DP3MOV AH,09HINT 21HMOV DL,P3ADD DL,30HMOV AH,02HINT 21H
RET
CNT ENDP CSEG ENDS
END START

- 阅读程序,指出子程序的功能,并回答程序里的问题。
CODES SEGMENTASSUME CS:CODESSTART:MOV AX,1 ;令AX等于1MOV CX,3 ;令CX等于3,可以计数循环三次CALL S ;调用S子程序,从这里进入S子程序MOV BX,AX ;调用结束,将AX中的数据送给BX中保存MOV AX,4C00HINT 21H ;结束S:ADD AX,AX ;CALL S后将AX中的数据翻倍存入AX中,第一次 结束时为2,第二次结束时为4,第三次结束时为8LOOP S ;循环进行S操作,回到上一步,CX自减1,直至为0RET ;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 SEGMENTs db 'COUNT123_W's1 db 1 dup(?) ;其他字符个数s2 db 1 dup(?) ;数字个数s3 db 1 dup(?) ;字母个数
DATAS ENDS
CODES SEGMENTASSUME CS:CODES,DS:DATAS
START:MOV AX,DATASMOV DS,AXmov CX,10 ;循环10次lea SI,s ;得到si的偏移地址BEGIN:MOV al,[SI] ;取该地址第一个元素CMP AL,30H JB A1 ;当小于30H为其他字符,跳转到A1CMP AL,39HJBE A2 ;30H~39H为数字,跳转到A2cmp al,41H JB A1 ;3AH-40H为其他字符CMP AL,5AH JBE A3 ;41H-5AH为大写字符CMP al,61HJB A1 ;5BH-60H为其他字符CMP AL,7AH JBE A3 ;61H-7AH为小写字符A1:add byte ptr[s1],1 ;计数JMP Q1 A2:add byte ptr[s2],1JMP Q1A3:add byte ptr[s3],1JMP Q1
Q1: INC SIloop BEGIN ;循环MOV AH,4CHINT 21H
CODES ENDSEND START
运行截图:

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
