视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
微机原理课程设计报告-字符串分类统计
2025-10-03 04:04:33 责编:小OO
文档


安徽新华学院

《微机原理与接口技术》

课程设计

字符串分类统计

目 录

一、摘要……………………………………3

二、系统设计………………………………4

1、内容…………………………………4

2、思路…………………………………4

3、程序设计……………………………6

4、调试结果……………………………12

三、系统总结………………………………13

四、人员分工………………………………14

五、参考文献………………………………15

一、摘要

本程序主要用于,把输入的一串字符分类统计,分别统计出数字、大写字符、小写字符和其他字符的个数。本程序采用汇编语言编程,定义了宏、比较判断、循环调用、统计等等,非常人性化的把统计的结果显示出来。比如你输入一串数字“12345”,它会显示出你输入的这串数字,并显示数字的个数为5,同时显示其他相应类字符为空。

二、系统设计

1、内容

从键盘输入任意一个字符串,以回车作为结束符并显示,分别统计并显示出其中数字字符、大写字符、小写字符以及其它字符的个数。

2、思路

(1).首先定义两个宏,一个用于输出统计各字符的个数,另一个用于输出字符串。

(2).在数据段中定义各种字符提示信息以便程序清晰明白。

(3).定义数据缓冲区用于存放输入的字符串,定义NUM区用于存放统计的大写字符、小写字符、数字以及其它字符的个数。定义OTHERCHAR、BIGCHAR、SMALLCHAR以及堆栈用于存放统计的相应字符保存,以便后来输出。

(4).首先调用DOS 10号功能用DX指定BUF区,将输入的字符串保存到BUF区中。

(5).将BUF+1的内容取出来,判断是否为0,如果为0表示没有输入任何字符,则程序跳到NEXTLAP(输出提示信息You do not input any string!),然后显示字符串(Do you want to input a string again(Y/N)?)然后调用DOS 1号功能获取您从键盘输入的数,判断是否为Y或y如果是则将程序跳到刚开始处重新执行,如果不是这两个字符则程序结束。

(6).如果输入了字符串,则调用DOS 2号功能将BUF里的内容输出来(2号功能可以输出$符号而9号功能遇到$符号就终止)。

(7).取字符出来进行比较统计,如果它比30H大且比39H小则为数字,如果比41H大且比5AH小则为大写字符,如果比61H大且比7AH小则为小写字符,如果不是这三种情况则为其它字符。

注:DX存数字个数,BX存小写字母个数,DI存大写字母个数,BP存其它字符个数。

(8).将数字个数、大写字母个数、小写字母个数、其它字符个数依次放入NUM区。

(9).依次输出各字符:

     a.判断数字个数是否为0,如果为0则输出提示没有此类数据,否则输出数字个数以及有哪些数字。

     b.判断大写字符个数是否为0,如果为0则输出提示没有此类数据,否则输出大写字符的个数以及输入的哪些大写字符。

     c.判断小写字符个数是否为0,如果为0则输出提示没有此类数据,否则输出小写字符的个数以及输入的哪些小写字符。

     d.判断其它字符个数是否为0,如果为0则输出提示没有此类数据,否则输出其它字符的个数以及输入的哪些其它字符。

(10).然后将程序跳到NEXTLAP继续执行,依次下去。

流程图:

3、程序设计

shuchu MACRO           ;定义宏,用来输出统计其它字符、数字、大小写

                        个数

       LOCAL NEXT

       MOV AH,0

       MOV BL,10

       DIV BL

       MOV DL,AL

       MOV BH,AH       ;将余数暂时存放在BH中

       CMP AL,0

       JZ NEXT

       OR DL,30h

       MOV AH,2

       INT 21H

NEXT:  

       MOV DL,BH

       OR  DL,'0'      ;输出余数

       MOV AH,2 

       INT 21H

       dismsg CRLF     ;回车换行

       ENDM

       

dismsg MACRO message   ;输出字符串

       LEA DX,message

       MOV AH,9

       INT 21H

       ENDM

DATAS SEGMENT

STR   DB 'The input string is:$'

STR1  DB 'Please input a string:$'

STR2  DB 'The integer is:$'

STR3  DB 'The bigchar is:$'

STR4  DB 'The smallchar is:$'

STR5  DB 'The otherchar is:$' 

STR6  DB 'The date of integer is null!$'

STR7  DB 'The date of otherchar is null!$'

STR8  DB 'The data of bigchar is null!$'

STR9  DB 'The data of smallchar is null!$'

NUM2  DB 'The number of integer is:$'

NUM3  DB 'The number of bigchar is:$'

NUM4  DB 'The number of smallchar is:$'

NUM5  DB 'The number of otherchar is:$'  

NUM6  DB 'Do you want to input a string again?(Y/N):$'

NUM7  DB 'You do not input any string!$'

NUM8  DB 'Please input correct command!$'

BUF   DB 100           ;定义缓冲区用来存放输入的字符串

      DB ?

      DB 100 DUP (24H)

CRLF  DB 0AH,0DH,'$'

NUM   DB 4 DUP(?)

BIGCHAR DB 100 DUP(24H),0AH,0DH,'$'

SMALLCHAR DB 100 DUP(24H),0AH,0DH,'$'

OTHERCHAR DB 100 DUP(24H),0AH,0DH,'$'

TAIL   DB ?           ;用来存放其它字符的个数

DATAS ENDS

STACKS SEGMENT

    STACK1 DW 100 DUP(24H)

    TOP LABEL WORD

STACKS ENDS

CODES  SEGMENT

       ASSUME CS:CODES,DS:DATAS,SS:STACKS

START: 

AGAIN1: 

       MOV AX,STACKS

       MOV SS,AX 

       MOV SP,OFFSET TOP

       MOV AX,DATAS

       MOV DS,AX

       MOV CX,100

AGAIN2:

       LEA SI,BIGCHAR

       MOV [SI],24H

       LEA DI,SMALLCHAR

       MOV [DI],24H

       LEA BX,OTHERCHAR

       MOV [BX],24H

       INC SI

       INC DI

       INC BX

       LOOP AGAIN2

                  

       dismsg STR1      ;显示输入提示信息

       

       MOV AH,10        ;输入字符串

       LEA DX,BUF

       INT 21H

       

       dismsg CRLF      ;回车换行

       CMP BUF+1,0

       JZ  NEXTLAP

       dismsg STR       ;提示输入字符串

       MOV CL,BUF+1     

       LEA SI,BUF+2

ABC:

       MOV DL,[SI]      ;用于输出缓冲区里的输入字符串

       MOV AH,2

       INT 21H

       INC SI

       LOOP ABC

       

       dismsg CRLF      ;回车换行

       MOV CL,BUF+1     ;将字符串的个数放入CL

       LEA SI,BUF+2     ;取字符串的首地址

       MOV DX,0         ;DX统计数字个数

       MOV BX,0         ;BX统计小写字母个数 

       MOV DI,0         ;DI统计大写字母个数

       MOV BP,0         ;BP统计其他字符的个数

       MOV AH,0

L1:    MOV AL,[SI]      

       CMP AL,30H       

       JL  NEXT1         

       CMP AL,39H       

       JG  L2

       PUSH AX

       INC DX           ;统计数字字符的个数

       JMP NEXT

       

L2:    CMP AL,41H       ;统计大写字符的个数

       JL  NEXT1 

       CMP AL,5AH

       JG  L3

       MOV BIGCHAR[DI],AL

       INC DI

       JMP NEXT

       

L3:    CMP AL,61H       ;统计小写字符的个数

       JL  NEXT1

       CMP AL,7AH

       JG  NEXT1

       MOV SMALLCHAR[BX],AL

       INC BX 

       JMP NEXT  

       

NEXT1: MOV OTHERCHAR[BP],AL

       INC BP           ;统计其它字符的个数

       

NEXT:  INC SI

       DEC CL

       JNZ L1

       

       MOV NUM,DL       ;将统计的个数存放在NUM的存储区

       MOV AX,DI        ;数字个数放在NUM,大写字符个数放在NUM+1

       MOV NUM+1,AL     ;小写字符个数放在NUM+2,其他字符的个数放在NUM+3

       MOV NUM+2,BL

       MOV AX,BP

       MOV TAIL,AL      ;将其它字符的个数送入TAIL保存,以便后来输出(否则9号功能输出遇$则退出)

       MOV NUM+3,AL

       

       

       CMP NUM,0        ;判断数字个数如果为0则输出提示符,否则循环输出

       JZ  NNULL

       dismsg STR2      ;输出数字字符的提示符

       MOV CL,NUM

       MOV BP,OFFSET TOP

       SUB BP,2

OK:    

       MOV DX,STACK1[BP]

       MOV AH,2

       INT 21H

       SUB BP,2

       LOOP OK

       dismsg CRLF

       

       dismsg NUM2      ;输出数字字符数字的提示符

       MOV AL,NUM       ;输出数字字符的个数

       shuchu

       JMP NNULL1

NNULL:

       dismsg STR6  

NNULL1:

       dismsg CRLF

       CMP NUM+1,0      ;判断大写字符的个数如果为0则输出提示符,否则以字符串形式输出

       JZ  BNULL

       dismsg STR3      ;输出大写字符的提示符

       dismsg BIGCHAR

       

       dismsg CRLF

       

       dismsg NUM3      ;输出大写字符数字个数提示符

       MOV AL,NUM+1     ;输出大写字符的个数

       shuchu

       JMP BNULL1

       

BNULL:

       dismsg STR8

BNULL1:

       dismsg CRLF

       

       CMP  NUM+2,0     ;判断小写个数,如果为0则输出提示符,否则以字符串形式输出

       JZ  SNULL

       dismsg STR4      ;输出小写字符的提示符

       dismsg SMALLCHAR

       

       dismsg CRLF

       dismsg NUM4      ;输出小写字符数字个数的提示符

       MOV AL,NUM+2     ;输出小写字符的个数

       shuchu

       JMP SNULL1

SNULL:

       dismsg STR9

SNULL1:       

       dismsg CRLF

       

       

       CMP TAIL,0       ;判断其他字符的个数如果为0则输出提示符,否则循环输出

       JZ  ONULL

       dismsg STR5      ;输出其它字符的提示符

       MOV CL,TAIL

       MOV SI,OFFSET OTHERCHAR

L4:                     ;输出其它字符

       MOV DL,[SI]

       MOV AH,2

       INT 21H

       INC SI

       LOOP L4

       dismsg CRLF

       dismsg NUM5      ;输出其它字符个数的提示符

       MOV AL,NUM+3     ;输出其它字符的个数

       shuchu

       JMP AGAIN

ONULL:

       dismsg STR7

       JMP AGAIN

NEXTLAP:

       dismsg NUM7

AGAIN:

       dismsg CRLF

       dismsg NUM6

       MOV AH,01H

       INT 21H

       MOV BL,AL

       dismsg CRLF

       CMP BL,'Y'

       JZ  AGAIN1

       CMP BL,'y'

       JZ  AGAIN1

       CMP BL,'N'

       JZ  ONULL2

       CMP BL,'n'

       JZ  ONULL2

       dismsg NUM8

       JMP  AGAIN

ONULL2:

       MOV AH,4CH

       INT 21H

CODES  ENDS

END START 

调试结果:

1)所有字符都有的时候:

2)其中有字符类型缺少的时候:

    

3)什么字符都不输入的时候:

三、系统总结

刚抽到这个题目时,老师就说我们的题目是所有题目中最简单的,于是非常庆幸。但是当我们真正去做它的时候却发现并不是那么回事。在写程序的时候首先要考虑很多问题,如何判断、如何显示、遇到$要怎么处理等等。尤其当我们将四种字符依次保存起来以便后来输出的时候用,就遇见了一个比较大的麻烦,当时能用的四种可以用于地址的寄存器都用上了,但是感觉缺少一个,怎么办呢?最后还是用堆栈解决了。可是一开始输出的时候就遇见了错误,就是用堆栈保存的那个输不出来。到底是哪里错了呢?最后发现在存储器中堆栈存储是从高地址往低地址存的,每次取的时候应该是地址减2而不是加2。所以通过这次课程设计也使我们对存储器的堆栈存储有了一个比较大概的了解。最终,在大家的共同努力下,程序完成了,我们心里的一块石头放下了。

但是事情总有不如意,在老师说要准备验证程序的那个星期,我们回来重新运行了程序,当时一想我们输入的时候都是几种类型的字符都输入,那么如果缺少其中一种呢?再次运行时少输入了一种类型的字符,这时问题出现了,出现了乱码。当时我们就慌了,于是大家凑到一起赶紧修改。大家你一言我一句纷纷发表自己的看法,东改改西改改,最终大功告成。这次缺少其中一种两种它都会输出相应的字符类型为空,这次大家都放心了。

我说过,事情总有不如意。程序又出现了问题。过了几天我们又想到一个问题,输入缺少一种两种可以了,那么不输入字符会怎么样呢?于是再次把程序运行,这次什么也不输入直接回车结束。果然,这次又出现了乱码。这次大家没有慌,因为有了上一次的经验,于是稍微把程序改改,跟之前的类似,问题还是很轻松的被解决了。

通过这一次两次的发现问题,解决问题,我们很清楚的认识到了一点。想一件事情得到完善,不在于已经知道的问题,知道什么问题只要去努力,去探讨,最终还是可以解决的;关键是能不能发现问题所在,只有发现了才有可能去解决。如果连问题是什么都不知道,那么还谈什么解决呢。同时我们也看到了集体的力量,我们集体合作,各抒己见,把不同的思维结合起来,然后每个人从不同角度去发现问题,再通力合作去解决问题,最终完成我们的杰作。

虽然程序是完成了,但是程序当中依然还存在可以完善的部分,但是由于我们的能力有限,以我们目前的能力水平只能做到这种地步了。

我们的这个程序的优、缺点如下:

 优点:

      a.不管你输入什么字符我们都能将其回显出来。

      b.不管你输入的字符全不全面,我们都能统计出来。

      c.对于那些你没有输入的类型,我们将提示此类型无数据,这样可以一目了然。

      d.程序结束时提醒你要不要继续输入字符串,可以循环输入。

 缺点:

      程序中用到了大量的JMP语句,这样会影响程序的运行速度。

四、人员分工

与其说分工还不如说合作,我们其实没有什么明确的分工,大概介绍下我们的流程。

开始在组长的安排下,我们每个人的任务是带着目标将课本上相关例题看懂,汲取相关思想。考虑到我们的题不是太难也不是很复杂,每个人试着做出部分的程序,然后一起讨论一下怎么改进和融合。再由施文军和陈远涛先将流程图制作出来,每个人轮流做相应讲解。让每个人不仅明白自己写的部分,还要明白别人的部分。最后组长孙长城将大家在编写过程遇到的困难和解决方案及实验感想做个总结。

五、参考文献

【1】楼顺天、周佳设.《微机原理与接口技术》.第一版.科技出版社,2006

【2】钱晓捷.《新版汇编语言程序设计》.电子工业出版社.2008

【3】葛洪伟、姜浩伟、赵雅群、黄蓓.《Intel汇编语言程序设计》.第一版.中国电力出版社,2007

【4】张雪兰.《Windows汇编语言程序设计教程》.电子工业出版社下载本文

显示全文
专题