汇编语言:使用简化段源程序结构对字符串进行分类

汇编语言:使用简化段源程序结构对字符串进行分类

  • 题目要求
      • 运行截图
  • 编程平台
  • 代码实现

题目要求

使用简化段源程序结构,从键盘输入一系列字符(最多可以输入280个字符,以回车符结束),并按字母、数字及其他字符分类计数,最后显示这三类的计数结果。

运行截图

汇编语言:使用简化段源程序结构对字符串进行分类_第1张图片

编程平台

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

如果文章内容出错或者您有更好的解决方法,欢迎到评论区指正和讨论!

你可能感兴趣的:(汇编语言,汇编)