汇编分类统计字符个数.docx
《汇编分类统计字符个数.docx》由会员分享,可在线阅读,更多相关《汇编分类统计字符个数.docx(8页珍藏版)》请在冰豆网上搜索。
![汇编分类统计字符个数.docx](https://file1.bdocx.com/fileroot1/2022-11/21/33d4cfc0-0aa7-46a1-9a85-e05950ba9908/33d4cfc0-0aa7-46a1-9a85-e05950ba99081.gif)
汇编分类统计字符个数
汇编分类统计字符个数
部门:
xxx
时间:
xxx
整理范文,仅供参考,可下载自行编辑
分类统计字符个数
1、实验目的
通过编程实现字符进行分类统计。
利用DOS功能调用INT21H的10<0Ah)号功能,掌握进行键盘输入字符串的方法以及数据区设置。
掌握8086指令:
CMP、JB、JA、SHL、INC、LEA、INT、JNZ、SCASB、LOOPE/LOOPNE等。
b5E2RGbCAP
2、实验内容
1、编写一个程序实现将数据段中存储在STRING处到NUM处的字符串进行分类统计,然后将结果存入以letter、digit和other为名的存储单元中。
查找字符串STRING中是否有空格,如有找出第一个出现的位置<先用十六进制显示,后修改为十进制显示),否则输出N。
p1EanqFDPw
2、修改前述1的程序,实现从键盘输入一个以回车键作为结束符的字符串<字符个数不超过80个),存入BUF中,分类统计BUF中字符串,将结果存入以letter、digit和other为名的存储单元中,屏幕输出大小写字母个数、数字个数和其它字符个数,并查找字符串BUF中是否有空格,如有找出第一个出现的位置<用十进制显示),否则输出N。
<对有余力的同学)DXDiTa9E3d
实验结果:
DEBUG调试并查看结果的正确性。
对存储区STRING的内容¡°12ABCDE#!
@Y(78>=(1>.”
屏幕显示:
N
对存储区STRING的内容¡°12ABCDE#!
@Y(78>=(1>.”
屏幕显示:
Place=7
对第2部分,如键盘输入
12ABCDE#3456789143!
@Y(78>=(1>.回车
输出结果:
Letter=6
Digit=15
Other=9
Place=9
3、分析与体会
本次实验我花了较长的时间来完成。
初略的程序花了5个多小时完成。
后来遇到转换为十进制的时候就卡住了。
后来在第六周周三的时候听了课以后才会做。
RTCrpUDGiT
第一个代码很长,有340多行代码。
其实核心代码不多。
主要是每一次转换为16进制以及10进制的时候,重复了相同的代码。
还有换行也重复了几次。
5PCzVD7HxA
第二个代码不同的是自己输入字符。
我自学了子程序。
然后把转换为10进制和输出换行设置成了子程序。
精简了代码。
jLBHrnAILg
4、代码
键盘输入字符串,分类统计
STACKSSEGMENTSTACK
DW128DUP(?
>
STACKSENDS
DATASSEGMENT
STRINGDB100DUP(?
>
NUMDW?
STR1DB'Letter=$'
STR2DB'Digit=$'
STR3DB'Other=$'
STR4DB'Place=$'
DIGITDW0
OTHERDW0
LETTERDW0
PLACEDW?
FLAGDW0
DATASENDS
CODESSEGMENT
MAINPROCFAR
ASSUMECS:
CODES,DS:
DATAS
START:
MOVAX,DATAS
MOVDS,AX
MOVSI,0
INPUT:
MOVAH,1
INT21H。
输入一个字符,存到AL
CMPAL,0DH。
判断是否是回车
JENEXT0。
是回车输入就结束
MOVSTRING[SI],AL
INCSI
JMPINPUT
NEXT0:
MOVNUM,SI
MOVBX,NUM
LEASI,STRING
NEXT:
MOVAL,[SI]
CMPAL,30H
JBCOTHER。
小于30H是其他字符
CMPAL,3AH
JBECDIGIT。
30H-3AH是数字
CMPAL,41H
JBCOTHER。
3AH-40H是其他字符
CMPAL,5AH
JBECLETTER。
41H-5AH是大写字母
CMPAL,61H
JBCOTHER。
5BH-60H是其他字符
CMPAL,7AH
JBECLETTER。
61H-7AH是小写字母
。
大于7AH是其他字符
COTHER:
INCOTHER
JMPP2
CDIGIT:
INCDIGIT
JMPP2
CLETTER:
INCLETTER
JMPP2
P2:
DECBX
JZOUTPUT
INCSI
JMPNEXT
OUTPUT:
CALLPRIENTER
MOVAH,9。
letter
MOVDX,SEGSTR1
MOVDS,DX
MOVDX,OFFSETSTR1
INT21H
MOVBX,LETTER
CALLTOTEN。
调用转换为十进制的子程序
CALLPRIENTER。
调用换行
MOVAH,9。
digit
MOVDX,SEGSTR2
MOVDS,DX
MOVDX,OFFSETSTR2
INT21H
MOVBX,DIGIT
CALLTOTEN
CALLPRIENTER
MOVAH,9。
other
MOVDX,SEGSTR3
MOVDS,DX
MOVDX,OFFSETSTR3
INT21H
MOVBX,OTHER
CALLTOTEN
CALLPRIENTER
MOVAH,9。
space
MOVDX,SEGSTR4
MOVDS,DX
MOVDX,OFFSETSTR4
INT21H
MOVBX,NUM。
找第一个空格的位置
LEASI,STRING
AGAIN:
MOVAL,20H
CMPAL,[SI]
JEP1
DECBX
JZOVER
INCSI
JMPAGAIN
OVER:
MOVPLACE,4EH。
4EH为N,找不到输出N
MOVDX,PLACE
MOVAH,2
INT21H
JMPEXIT。
退出结束
P1:
INCSI。
下标与位置的转换,需加1
MOVPLACE,SI
MOVBX,PLACE
CALLTOTEN
CALLPRIENTER
JMPEXIT
。
十进制输出的子程序,小于十六位二进制的数可以输出
。
原理是把原数除10000,取值,余数除1000,取值,再次得到的余数
。
除100,取值,再将余数除10,取值,取余
TOTENPROCNEAR
CMPBX,0
JGP111
MOVDL,30H
MOVAH,2
INT21H
JMPRETURN
P111:
MOVFLAG,0
MOVDI,10000
P15:
MOVDX,0
MOVAX,BX
DIVDI
MOVBX,DX
MOVDL,AL
CMPDL,0
JEP101
MOVFLAG,1
P102:
ADDDL,30H
MOVAH,2
INT21H
P16:
MOVAX,DI
MOVDX,0
MOVCX,10
DIVCX
MOVDI,AX
CMPDI,0
JGP15
JMPRETURN
P101:
CMPFLAG,0
JEP16
JMPP102
RETURN:
RET
TOTENENDP
PRIENTERPROCNEAR。
回车换行
MOVDL,0DH
MOVAH,2
INT21H
MOVDL,0AH
MOVAH,2
INT21H
RET
PRIENTERENDP
EXIT:
MOVAX,4C00H
INT21H
MAINENDP
CODESENDS
ENDSTART
申明:
所有资料为本人收集整理,仅限个人学习使用,勿做商业用途。