;版权所有,欢迎借鉴
DATAS SEGMENT
MSG1 DB 'Please enter data:$'
MSG2 DB 'The number of the data is:$'
DATAS ENDS
STACKS SEGMENT
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
LEA DX,MSG1 ;显示“Please enter data:”
MOV AH,9
INT 21H
CALL ENTER1 ;回车换行
CALL READ ;调用子程序,
;读取用户输入的数字,计算个数
LEA DX,MSG2 ;显示“The number of the data is:”
MOV AH,9
INT 21H
CALL ENTER1 ;回车换行
CALL SHOW ;显示输入数字的个数,以十进制的形式
CALL ENTER1 ;回车换行
CALL ENTER1 ;再次回车换行,使得每次操作以段落
;的形式显示,使界面清新
JMP START ;循环
MOV AH,4CH
INT 21H
;----------------------------------------
;【子程序-读取用户输入的数字并计算个数】
READ PROC
MOV CX,0
TAG0: MOV AH,1 ;调用1号功能请求输入一个字符
INT 21H
CMP AL,'0' ;判断所输入的字符是否为数字
JB TAG1
CMP AL,'9'
JA TAG1
MOV AX,CX ;由于下面的DAA指令要使用AX寄存器,
;所以启用CX作临时存储使用
ADD AX,1 ;输入是数字的话,加一
DAA ;把相加后的结果转换为BCD码
MOV CX,AX ;保存起来
JMP TAG0 ;循环请求输入
TAG1: RET
READ ENDP
;【子程序-读取用户输入的数字并计算个数】
;----------------------------------------
;----------------------------------------
;【子程序-以十进制的形式显示数字个数】
SHOW PROC
MOV BX,CX ;读取数字个数
MOV CL,4H ;位移次数
ROR BX,CL ;右移4位
ADD BX,'0' ;转换为数字对应的字符
MOV DL,BL ;结果送到DL,以备输出
MOV AH,2 ;调用2号功能显示高位
INT 21H
ROL BX,CL ;左移4位
AND BX,0FH ;去掉高位的值
ADD BX,'0' ;转换为数字对应的字符
MOV DL,BL ;......
INT 21H
RET ;返回
SHOW ENDP
;【子程序-以十进制的形式显示数字个数】
;----------------------------------------
;----------------------------------------
; 【子程序-实现回车换行】
ENTER1 PROC
MOV AH,2H
MOV DL,0DH ;回车
INT 21H
MOV DL,0AH ;换行
INT 21H
RET
ENTER1 ENDP
; 【子程序-实现回车换行】
;----------------------------------------
CODES ENDS
END START
|