汇编分类统计字符个数
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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 ;退出结束