汇编语言及应用——子程序设计

程序展示了如何使用子程序进行数据处理,包括统计内存缓冲区中分数段的学生人数并将结果存储在特定单元中,以及通过子程序实现数据的翻倍并返回结果。此外,还提供了一个子程序用于按字母、数字和其他字符分类统计字符串中的字符数量。
摘要由CSDN通过智能技术生成

掌握子程序的设计方法;理解子程序调用与返回指令的执行过程及堆栈的变化情况;掌握子程序调用过程中主程序与子程序间的参数传递方式,掌握现场的保护与恢复方法。

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

在这里插入图片描述

  1. 阅读程序,指出子程序的功能,并回答程序里的问题。
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
在这里插入图片描述

  1. 设有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

运行截图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值