汇编分类统计字符个数

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

分类统计字符个数一、实验目的通过编程实现字符进行分类统计。利用DOS功能调用INT21H的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的内容“12ABCDE#!@Y(78)=(1).”屏幕显示:Place=7对第2部分,如键盘输入12ABCDE#3456789143!@Y(78)=(1).回车输出结果:Letter=6Digit=15Other=9Place=9三、分析与体会本次实验我花了较长的时间来完成。初略的程序花了5个多小时完成。后来遇到转换为十进制的时候就卡住了。后来在第六周周三的时候听了课以后才会做。第一个代码很长,有340多行代码。其实核心代码不多。主要是每一次转换为16进制以及10进制的时候,重复了相同的代码。还有换行也重复了几次。第二个代码不同的是自己输入字符。我自学了子程序。然后把转换为10进制和输出换行设置成了子程序。精简了代码。四、代码键盘输入字符串,分类统计STACKSSEGMENTSTACKDW128DUP(?)STACKSENDSDATASSEGMENTSTRINGDB100DUP(?)NUMDW?STR1DB'Letter=$'STR2DB'Digit=$'STR3DB'Other=$'STR4DB'Place=$'DIGITDW0OTHERDW0LETTERDW0PLACEDW?FLAGDW0DATASENDSCODESSEGMENTMAINPROCFARASSUMECS:CODES,DS:DATASSTART:MOVAX,DATASMOVDS,AXMOVSI,0INPUT:MOVAH,1INT21H;输入一个字符,存到ALCMPAL,0DH;判断是否是回车JENEXT0;是回车输入就结束MOVSTRING[SI],ALINCSIJMPINPUTNEXT0:MOVNUM,SIMOVBX,NUMLEASI,STRINGNEXT:MOVAL,[SI]CMPAL,30HJBCOTHER;小于30H是其他字符CMPAL,3AHJBECDIGIT;30H-3AH是数字CMPAL,41HJBCOTHER;3AH-40H是其他字符CMPAL,5AHJBECLETTER;41H-5AH是大写字母CMPAL,61HJBCOTHER;5BH-60H是其他字符CMPAL,7AHJBECLETTER;61H-7AH是小写字母;大于7AH是其他字符COTHER:INCOTHERJMPP2CDIGIT:INCDIGITJMPP2CLETTER:INCLETTERJMPP2P2:DECBXJZOUTPUTINCSIJMPNEXTOUTPUT:CALLPRIENTERMOVAH,9;letterMOVDX,SEGSTR1MOVDS,DXMOVDX,OFFSETSTR1INT21HMOVBX,LETTERCALLTOTEN;调用转换为十进制的子程序CALLPRIENTER;调用换行MOVAH,9;digitMOVDX,SEGSTR2MOVDS,DXMOVDX,OFFSETSTR2INT21HMOVBX,DIGITCALLTOTENCALLPRIENTERMOVAH,9;otherMOVDX,SEGSTR3MOVDS,DXMOVDX,OFFSETSTR3INT21HMOVBX,OTHERCALLTOTENCALLPRIENTERMOVAH,9;spaceMOVDX,SEGSTR4MOVDS,DXMOVDX,OFFSETSTR4INT21HMOVBX,NUM;找第一个空格的位置LEASI,STRINGAGAIN:MOVAL,20HCMPAL,[SI]JEP1DECBXJZOVERINCSIJMPAGAINOVER:MOVPLACE,4EH;4EH为N,找不到输出NMOVDX,PLACEMOVAH,2INT21HJMPEXIT;退出结束P1:INCSI;下标与位置的转换,需加1MOVPLACE,SIMOVBX,PLACECALLTOTENCALLPRIENTERJMPEXIT;十进制输出的子程序,小于十六位二进制的数可以输出;原理是把原数除10000,取值,余数除1000,取值,再次得到的余数;除100,取值,再将余数除10,取值,取余TOTENPROCNEARCMPBX,0JGP111MOVDL,30HMOVAH,2INT21HJMPRETURNP111:MOVFLAG,0MOVDI,10000P15:MOVDX,0MOVAX,BXDIVDIMOVBX,DXMOVDL,ALCMPDL,0JEP101MOVFLAG,1P102:ADDDL,30HMOVAH,2INT21HP16:MOVAX,DIMOVDX,0MOVCX,10DIVCXMOVDI,AXCMPDI,0JGP15JMPRETURNP101:CMPFLAG,0JEP16JMPP102RETURN:RETTOTENENDPPRIENTERPROCNEAR;回车换行MOVDL,0DHMOVAH,2INT21HMOVDL,0AHMOVAH,2INT21HRETPRIENTERENDPEXIT:MOVAX,4C00HINT21HMAINENDPCODESENDSENDSTART

1 / 6
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功