汇编分类统计字符个数

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

分类统计字符个数

一、实验目的

通过编程实现字符进行分类统计。

利用DOS功能调用INT 21H的10(0Ah)号功能,掌握进行键盘输入字符串的方法以及数据区设置。

掌握8086指令: CMP、JB、JA、SHL、INC、LEA、INT、JNZ、SCASB、LOOPE/LOOPNE等。

二、实验内容

1、编写一个程序实现将数据段中存储在STRING处到NUM处的字符串进行分类统计,然后将结果存入以letter、digit和other为名的存储单元中。查找字符串STRING中是否有空格,如有找出第一个出现的位置(先用十六进制显示,后修改为十进制显示),否则输出N。

2、修改前述1的程序,实现从键盘输入一个以回车键作为结束符的字符串(字符个数不超过80个),存入BUF中,分类统计BUF中字符串,将结果存入以letter、digit和other为名的存储单元中,屏幕输出大小写字母个数、数字个数和其它字符个数,并查找字符串BUF中是否有空格,如有找出第一个出现的位置(用十进制显示),否则输出N。(对有余力的同学)

实验结果:

DEBUG 调试并查看结果的正确性。

对存储区STRING的内容“12ABCDE#!@Y(78)=(1).”

屏幕显示:

N

对存储区STRING的内容“12ABCD E#! @Y(78)=(1).”

屏幕显示:

Place=7

对第2部分,如键盘输入

12ABCDE# 3456789143!@Y(78)=(1).回车

输出结果:

Letter=6

Digit=15

Other=9

Place=9

三、分析与体会

本次实验我花了较长的时间来完成。初略的程序花了5个多小时完成。后来遇到转换为十进制的时候就卡住了。后来在第六周周三的时候听了课以后才会做。

第一个代码很长,有340多行代码。其实核心代码不多。主要是每一次转换为16进制以及10进制的时候,重复了相同的代码。还有换行也重复了几次。

第二个代码不同的是自己输入字符。我自学了子程序。然后把转换为10进制和输出换行设置成了子程序。精简了代码。

四、代码

键盘输入字符串,分类统计

STACKS SEGMENT STACK

DW 128 DUP(?)

STACKS ENDS

DATAS SEGMENT

STRING DB 100 DUP(?)

NUM DW ?

STR1 DB 'Letter=$'

STR2 DB 'Digit=$'

STR3 DB 'Other=$'

STR4 DB 'Place=$'

DIGIT DW 0

OTHER DW 0

LETTER DW 0

PLACE DW ?

FLAG DW 0

DATAS ENDS

CODES SEGMENT

MAIN PROC FAR

ASSUME CS:CODES,DS:DATAS

START: MOV AX,DATAS

MOV DS,AX

MOV SI,0

INPUT:

MOV AH,1

INT 21H ;输入一个字符,存到AL

CMP AL,0DH ;判断是否是回车

JE NEXT0 ;是回车输入就结束

MOV STRING[SI],AL

INC SI

JMP INPUT

NEXT0:

MOV NUM,SI

MOV BX,NUM

LEA SI,STRING

NEXT:

MOV AL,[SI]

CMP AL,30H

JB COTHER ;小于30H 是其他字符

CMP AL,3AH

JBE CDIGIT ;30H-3AH 是数字

CMP AL,41H

JB COTHER ; 3AH-40H是其他字符

CMP AL,5AH

JBE CLETTER ; 41H-5AH是大写字母

CMP AL,61H

JB COTHER ;5BH-60H是其他字符

CMP AL,7AH

JBE CLETTER ;61H-7AH是小写字母

;大于7AH 是其他字符COTHER:

INC OTHER

JMP P2

CDIGIT:

INC DIGIT

JMP P2

CLETTER:

INC LETTER

JMP P2

P2:

DEC BX

JZ OUTPUT

INC SI

JMP NEXT

OUTPUT:

CALL PRIENTER

MOV AH, 9 ;letter

MOV DX, SEG STR1

MOV DS, DX

MOV DX, OFFSET STR1

INT 21H

MOV BX,LETTER

CALL TOTEN ;调用转换为十进制的子程序

CALL PRIENTER ;调用换行

MOV AH, 9 ;digit

MOV DX, SEG STR2

MOV DS, DX

MOV DX, OFFSET STR2

INT 21H

MOV BX,DIGIT

CALL TOTEN

CALL PRIENTER

MOV AH, 9 ;other

MOV DX, SEG STR3

MOV DS, DX

MOV DX, OFFSET STR3

INT 21H

MOV BX,OTHER

CALL TOTEN

CALL PRIENTER

MOV AH, 9 ;space

MOV DX, SEG STR4

MOV DS, DX

MOV DX, OFFSET STR4

INT 21H

MOV BX,NUM ;找第一个空格的位置

LEA SI,STRING

AGAIN:

MOV AL,20H

CMP AL,[SI]

JE P1

DEC BX

JZ OVER

INC SI

JMP AGAIN

OVER: MOV PLACE,4EH ;4EH 为N ,找不到输出N MOV DX,PLACE

MOV AH,2

INT 21H

JMP EXIT ;退出结束

相关文档
最新文档