汇编语言:使用简化段源程序结构对字符串进行分类
题目要求运行截图
编程平台代码实现
题目要求
使用简化段源程序结构,从键盘输入一系列字符(最多可以输入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
如果文章内容出错或者您有更好的解决方法,欢迎到评论区指正和讨论!