使用简化段源程序结构,从键盘输入一系列字符(最多可以输入280个字符,以回车符结束),并按字母、数字及其他字符分类计数,最后显示这三类的计数结果。
Masm for Windows 集成实验环境 2012.5
.model small
.stack
.data
buffer DW 280,0,280 DUP(?);存放输入的缓冲区
;缓冲区解析:
;第一个280代表能存储的最大数据量;
;0代表已储存的数据个数;
;第二个280代表当前用来存储数据的空间大小,一般与最大数据量相等。
hint DB 'Enter up to 280 characters, ending with a carriage return: $'
break DB 13,10,'$';换行
letters DB 'Letters: $'
digits DB 'Digits: $'
others DB 'Other characters: $'
.code
MAIN PROC
MOV AX,@data
MOV DS,AX
LEA DX,hint;输入前提示
MOV AH,9H
INT 21H
LEA DX,buffer;定位到输入缓冲区
MOV AH,0AH;输入一串字符到缓冲区中,遇到回车时自动停止输入
INT 21H
LEA DX,break;换行
MOV AH,9H
INT 21H
LEA BX,buffer
CALL CLASSIFY;分类统计BX所指向的缓冲区中数据
PUSH DI
PUSH SI
PUSH AX
LEA DX,letters;输出字母前提示
MOV AH,9H
INT 21H
POP AX;获得字母个数
CALL OUTPUTDATA;以十进制形式输出AX中的数据
LEA DX,break;换行
MOV AH,9H
INT 21H
LEA DX,digits;输出数字前提示
MOV AH,9H
INT 21H
POP AX;获得数字个数
CALL OUTPUTDATA;以十进制形式输出AX中的数据
LEA DX,break;换行
MOV AH,9H
INT 21H
LEA DX,others;输出其他字符前提示
MOV AH,9H
INT 21H
POP AX;获得其他字符个数
CALL OUTPUTDATA;以十进制形式输出AX中的数据
MOV AH,4CH
INT 21H
MAIN ENDP
;子程序
;功能:分类统计BX所指向的缓冲区中数据。
;入口参数:BX存放要分类的缓冲器的首地址。
CLASSIFY PROC
MOV AX,0;AX统计字母个数
MOV SI,0;SI统计数字个数
MOV DI,0;DI统计其他字符个数
INC BX;BX指向缓冲区中存放数据个数的偏移地址
MOV CL,[BX];CX存放缓冲区数据个数
MOV CH,0
CMP CX,0;检查是否无输入
JE finish
INC BX;BX指向第一个字符的偏移地址
lop:
MOV DL,[BX]
CMP DL,30H;与“0”比较
JB oth
CMP DL,39H;与“9”比较
JBE dig
CMP DL,41H;与“A”比较
JB oth
CMP DL,5AH;与“Z”比较
JBE let
CMP DL,61H;与“a”比较
JB oth
CMP DL,7AH;与“z”比较
JG oth
let:;当前字符为字母
INC AX
JMP cont
dig:;当前字符为数字
INC SI
JMP cont
oth:;当前字符为其他字符
INC DI
cont:
INC BX
LOOP lop
finish:
RET
CLASSIFY ENDP
;子程序
;功能:以十进制形式输出0和正整数。
;入口参数:AX存放要输出的数据。
OUTPUTDATA PROC
MOV BX,10
MOV CX,0;记录要输出的位数
lop1:
MOV DX,0
DIV BX
PUSH DX;余数入栈
INC CX
CMP AX,0
JNE lop1
lop2:
POP DX
ADD DL,30H;转换成ASCII码
MOV AH,2H
INT 21H
LOOP lop2
RET
OUTPUTDATA ENDP
end
如果文章内容出错或者您有更好的解决方法,欢迎到评论区指正和讨论!