汇编课程设计字符串查找与替换何荣贤.docx
- 文档编号:3975012
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:36
- 大小:575.56KB
汇编课程设计字符串查找与替换何荣贤.docx
《汇编课程设计字符串查找与替换何荣贤.docx》由会员分享,可在线阅读,更多相关《汇编课程设计字符串查找与替换何荣贤.docx(36页珍藏版)》请在冰豆网上搜索。
汇编课程设计字符串查找与替换何荣贤
《汇编语言程序设计》课程设计
题目:
字符串查找与替换
专业:
计算机科学与技术
学号:
2010810071
姓名:
何荣贤
2011-2012学年第一学期
一.设计目的
汇编语言课程设计是对所学课程内容全面、系统的总结、巩固和提高的一项课程实践活动。
根据汇编语言的特点,选择相应的题目,在老师的指导下,由学生独立完成。
课程设计要求同学们熟悉汇编语言的编程,BIOS中断调用、系统功能调用、磁盘数据的查询、存取等相关知识。
通过课程设计,一方面提高运用汇编语言编程解决实际问题的能力,另一方面使同学们更深入的了解计算机系统内部的有关知识,为以后的学习和系统开发奠定良好的基础。
二.设计内容3.
功能描述:
1.对已有的文件(预先建立)内容进行扫描统计。
(字符数,行数)
2.字符串查找操作
3.字符串替换操作,替换后的文件内容另存入一结果文件,原文件内容不变
4.显示结果文件内容
编程要点:
1.目标文件及结果文件必须和程序文件在同一目录下(当前目录)
2.原文件内容必须50行以上
3.字符串查找、替换过程要显示当前行及前几行、后几行的内容,以便按键选择继续查找或是否替换代码
4.字符串查找或者替换操作结束后,要显示查找到的字符串个数、已经替换的字符串个数。
三.程序设计原理
1.主程序
程序开始打开原文件,将文件内容读到内存缓冲区TEXT后,关闭原文件。
接着显示主菜单,接收用户输入一个字符,实现不同的功能:
a.输入‘1’,则调用子程序STATISTICS,对TEXT中的文件内容进行扫面统计(字符数、行数);
b.输入‘2’,则调用子程序SEARCH,进行字符串的查找操作;
c.输入‘3’,则调用子程序REPLACE,进行字符串的替换操作;
d.输入‘4’,则调用子程序DISPLAY,将TEXT的内容显示出来;
e.输入‘5’,则退出程序;
f.输入其他字符,则显示提示信息,重新输入。
2.子程序STATISTICS
由于显示屏为25*80,每行至多显示80个字符,所以要依次对TEXT中的每个字节进行扫描,使用CMP指令判断该字节是否为空格符、回车符、换行符:
a.若为空格符则BX加1,再比较BX是否小于80,小于则继续判断下一个字节,等于则将BX清零,统计的行数LINE_COUNT加1,再继续判断下一个字节;
b.若为回车符则直接判断下一个字节;
c.若为换行符则将BX清零,统计的行数LINE_COUNT加1,再继续判断下一个字节;
d.若为字符,则统计的字符数CHAR_COUNT加1,BX加1,再比较BX是否小于80,小于则继续判断下一个字节,等于则将BX清零,统计的行数LINE_COUNT加1,再继续判断下一个字节;
统计完成后调用子程序BINIDEC用十进制显示统计结果。
3.子程序SEARCH
首先接收用户要查找的字符串,然后通过循环控制程序,对TEXT进行查找。
用CMPSB指令进行字符串比较,若匹配的话调用子程序SHOW显示前几行、当前行、后几行,并调整剩余比较次数和下一次的比较位置,提示用户是否继续查找;若不匹配则进行下一次查找,直到查找结束。
最后显示找到的字符串个数。
4.子程序REPLACE
首先接收用户要查找的字符串,然后通过循环控制程序,对TEXT进行查找。
用CMPSB指令进行字符串比较。
若匹配的话调用子程序SHOW显示前几行、当前行、后几行,并调整剩余比较次数和下一次的比较位置,提示用户输入一个字符:
若为‘1’,则继续查找;
若为‘2’,则调用子程序TIHUAN,进行替换操作;
若为‘3’,则调用子程序REPLACE_ALL进行全部替换;
若为‘4’,则退出查找;
若为其他字符则重新输入。
若不匹配则进行下一次查找,直到查找结束。
最后显示找到的字符串个数和替换的字符串个数,并调用子程序SAVE把替换后的文件内容写入结果文件
5.子程序RPLACE_ALL
通过循环控制程序,对TEXT进行查找。
用CMPSB指令进行字符串比较。
若匹配的话调用子程序TIHUAN,进行替换操作,若不匹配则继续查找,直到查找结束
6.子程序DISPLAY
由于显示屏为25*80,每行至多显示80个字符,所以要依次对TEXT中的每个字节进行扫描,使用CMP指令判断该字节是否为字符、空格符、回车符、换行符,使每一屏显示20行内容,提示用户输入任意键显示下一页。
7.子程序TIHUAN
当两个字符串长度相等时,直接用MOVSB指令进行替换;若原字符串比替换的字符串长,则先用MOVSB指令进行替换,然后再把后面的内容前移接上,同时调整TEXT总字节个数;若原字符串比替换的字符串短,则先把字符串后面的内容后移,使替换的字符串不会覆盖原有的内容,同时调整TEXT总字节个数
8.子程序SHOW
在查找操作时显示找到字符串的前几行、当前行、后几行,在显示找到的字符串时改变字符串的背景颜色,使查找简单明了。
9.子程序BINIDEC
将BX中的二进制数以十进制的形式显示出来
10.宏定义CLS
清屏,并将光标定位于0行0列
11宏定义PRINT
输出字符串
12.宏定义INPUT
输入字符串
四.程序流程图
开始
打开原文件
读文件
关闭文件
显示主菜单
输入一个字符
调用STATISTICS
扫描统计
是1?
Y
N
调用SEARCH
字符串查找
是2?
Y
N
调用REPLACE
字符串替换
是3?
Y
N
调用DISPLAY
显示文件内容
是4?
Y
N
是5?
N
Y
结束
STATISTICS
取文件的第一个字节
是否为空格符?
Y
N
是否为回车符?
Y
N
是否为换行符?
Y
N
总字符个数加1
INCBX
BX等于80?
N
Y
BX清零
总行数加1
取下一个字节
统计结束?
N
Y
显示总字符个数、总行数
RET
SEARCH
输入字符串
计算外循环次数
比较
匹配?
N
调用SHOW显示前几行、当前行后几行
Y
显示子菜单2
输入一个字符
是1?
调整外循环次数
Y
调整下次比较位置
N
是2?
N
循环结束?
YN
显示找到的个数
RET
REPLACE
输入查找的字符串
输入替换后的字符串
计算外循环次数
比较
匹配?
N
调用SHOW显示前几行、当前行后几行
Y
显示子菜单
输入一个字符
是1?
Y
N
调用TIHUAN
是2?
Y
调整外循环次数
调整下次比较位置
是3?
N
Y
循环结束?
N
是4?
NN
YY
调用REPLACE_ALL
显示找到的个数
显示替换的个数
调用SAVE写入结果文件
RET
REPLACE_ALL
计算外循环次数
比较
匹配?
N
调用TIHUAN
Y
调整外循环次数
调整下次比较位置
循环结束?
NN
Y
RET
TIHUAN
串1长度=串2长度?
Y
N
替换
调整总字节数
串1长度<串2长度?
Y
被替换的字符串后的内容后移
替换
调整总字节数
替换
调整总字节数
被替换的字符串后的内容前移
已替换字符串个数加1
RET
DISPLAY
CLS
取文件的第一个字节
显示该字符
是否为回车符?
Y
是否为换行符?
N
Y
N
BL加1
BL小于80?
Y
N
BL清零
BH加1
BH小于20?
Y
N
BH清零
输入一个字符
CLS
取下一个字节
统计结束?
N
Y
CLS
RET
SAVE
SHOW
显示找到的字符串的前几行
新建文件
写入文件
用不同的背景颜色显示找到的字符串
关闭
显示找到的字符串的后几行
RET
RET
五.源程序
DATASSEGMENT
NUM1DB?
FCODE1DW?
FCODE2DW?
LINE_COUNTDW0;行数
ALL_COUNTDW0;总字节数
CHAR_COUNTDW0;总字符数
SEARCH_COUNTDW0;找到的字符串个数
REPLACE_COUNTDW0;已替换的字符串个数
FNAME1DB'D:
\sorce.TXT',0;原文件路径
FNAME2DB'D:
\result.TXT',0;结果文件路径
TEXTDB500DUP(80DUP(''))
STRING1DB16,?
CHUAN1DB15DUP(?
)
STRING2DB16,?
CHUAN2DB15DUP(?
)
WINDOW1DB13,10,13,10,'/************|MENU|***********\',13,10
DB'|1---STATISTICS|',13,10
DB'|2---SEARCH|',13,10
DB'|3---REPLACE|',13,10
DB'|4---DISPLAY|',13,10
DB'|5---QUIT|',13,10
DB'\*******************************/',13,10,'SELET:
','$'
WINDOW2DB13,10,13,10,'|-----------|SEARCH|------------|',13,10
DB'|1---SEARCHNEXTONE|',13,10
DB'|2---ENDSEARCH|',13,10
DB'|---------------------------------|',13,10,'SELET:
','$'
WINDOW3DB13,10,13,10,'|-----------|REPLACE|-----------|',13,10
DB'|1---SEARCHNEXTONE|',13,10
DB'|2---REPLACE|',13,10
DB'|3---REPLACEALL|',13,10
DB'|4---END|',13,10
DB'|---------------------------------|',13,10,'SELET:
','$'
STR1DB'---SEARCH:
','$'
STR2DB'---REPLACEWITH:
','$'
STR3DB'---THECHAR_COUNTIS:
','$'
STR4DB'---THELINE_COUNTIS:
','$'
STR5DB'---THENUMBEROFCHARACTERSTRINGHAVEFOUNDIS:
','$'
STR6DB'---THENUMBEROFCHARACTERSTRINGREPLACEDIS:
','$'
STR7DB'---PRESSANYKEYTOLOOKNEXTPAGE:
','$'
STR8DB'---THATISALL!
',13,10,'---PRESSANYKEYTORETURNMENU:
','$'
STR9DB13,10,13,10,13,10,'$'
ERR_CRDB'CREATEERROR!
',13,10,'$'
ERR_OPDB'OPENERROR!
',13,10,'$'
ERR_CLDB'CLOSEERROR!
',13,10,'$'
ERR_RDDB'READERROR!
',13,10,'$'
ERR_WRDB'WRITEERROR!
',13,10,'$'
ERRORDB'ERROR!
YOUSHOULDINPUT(1-5)!
',13,10,'$'
ERROR1DB'ERROR!
YOUSHOULDINPUT(1-2)!
',13,10,'$'
ERROR2DB'ERROR!
YOUSHOULDINPUT(1-4)!
',13,10,'$'
CRLFDB13,10,'$'
DATASENDS
;***********************************************************************
PRINTMACROX1;宏显示字符串
LEADX,X1
MOVAH,9
INT21H
ENDM
INPUTMACROX1;宏输入字符串
LEADX,X1
MOVAH,10
INT21H
ENDM
CLSMACRO;清屏并把光标定在0行0列
MOVAH,6
MOVAL,0
MOVBH,7
MOVCH,0
MOVCL,0
MOVDH,24
MOVDL,79
INT10H
MOVBH,0
MOVDX,0
MOVAH,2
INT10H
ENDM
;***********************************************************************
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,ES:
DATAS
START:
MOVAX,DATAS
MOVDS,AX
MOVES,AX
LEADI,TEXT
LEADX,FNAME1;打开文件
MOVAH,3DH
MOVAL,0
INT21H
JNCOP_WJ;打开文件成功则转OP_WJ
PRINTERR_OP;打开文件失败则显示出错信息,退出程序
JMPL6
OP_WJ:
MOVFCODE1,AX;保存文件代号
RD_WJ:
MOVAH,3FH;读文件
MOVDX,DI
MOVBX,FCODE1
MOVCX,80
INT21H
JNCPDUAN;读文件成功转PDUAN
PRINTERR_RD
JMPL6
PDUAN:
MOVCX,AX;判断是否读完
ADDDI,AX
JCXZCLOSE;读完转CLOSE
JMPRD_WJ;未读完转RD_WJ继续读取
CLOSE:
LEASI,TEXT
SUBDI,SI
MOVALL_COUNT,DI;文件总字节数
MOVAH,3EH;读完关闭文件
MOVBX,FCODE1
INT21H
JNCL1
PRINTERR_CL
JMPL6;关闭失败显示出错信息,退出程序
L1:
PRINTWINDOW1
MOVAH,1
INT21H
CMPAL,'1'
JNEL2
CALLSTATISTICS;扫描统计
JMPL1
L2:
CMPAL,'2'
JNEL3
CALLSEARCH;查找
JMPL1
L3:
CMPAL,'3'
JNEL4
CALLREPLACE;替换
JMPL1
L4:
CMPAL,'4'
JNEL5
CALLDISPLAY;显示结果文件内容
JMPL1
L5:
CMPAL,'5'
JEL6
PRINTERROR
JMPL1;输入错误显示提示信息,重新输入
L6:
MOVAH,4CH
INT21H
;**************************扫描统计STATISTICS**************************
STATISTICSPROC;
MOVCHAR_COUNT,0
MOVLINE_COUNT,0
MOVCX,ALL_COUNT
XORBX,BX
LEASI,TEXT
S0:
CMPBYTEPTR[SI],20H;若为空格符转S1
JES1
CMPBYTEPTR[SI],13;若为回车符转T2
JET2
CMPBYTEPTR[SI],10;若为换行符转S2
JES2
INCCHAR_COUNT
S1:
INCSI
INCBX
CMPBX,80
JBT1
XORBX,BX
INCLINE_COUNT
T1:
LOOPS0
INCLINE_COUNT
JMPS3
S2:
INCLINE_COUNT
T2:
INCSI
XORBX,BX
LOOPS0
S3:
PRINTCRLF;显示字符数和行数
PRINTSTR3
MOVBX,CHAR_COUNT
CALLBINIDEC
PRINTCRLF
PRINTSTR4
MOVBX,LINE_COUNT
CALLBINIDEC
RET
STATISTICSENDP
;***************************二进制转十进制并显示*************************
BINIDECPROC;入口参数为BX
MOVCX,10000
CALLDEC_DIV
MOVCX,1000
CALLDEC_DIV
MOVCX,100
CALLDEC_DIV
MOVCX,10
CALLDEC_DIV
MOVCX,1
CALLDEC_DIV
RET
BINIDECENDP
DEC_DIVPROC
MOVAX,BX
MOVDX,0
DIVCX
MOVBX,DX
MOVDL,AL
ADDDL,30H
MOVAH,2
INT21H
RET
DEC_DIVENDP
;***************************查找字符串********************************
SEARCHPROC
MOVSEARCH_COUNT,0
PRINTCRLF
PRINTSTR1
INPUTSTRING1
PRINTCRLF;输入要查找的字符串
XORCX,CX
XORBX,BX
MOVCX,ALL_COUNT
MOVBL,STRING1+1
SUBCX,BX
INCCX;计算外循环次数
XORBX,BX
K1:
PUSHCX;外循环次数入栈
LEASI,TEXT
LEADI,CHUAN1
ADDSI,BX;调整串比较起始位置
INCBX;用于调整下次比较的起始位置
XORCH,CH
MOVCL,STRING1+1;内循环次数
CLD
REPZCMPSB
JNZK7;不匹配转K7继续查找
INCSEARCH_COUNT;找到的字符串个数加1
CALLSHOW;调用SHOW显示前几行、当前行、后几行
K2:
PRINTWINDOW2;是否继续查找
MOVAH,1
INT21H
CMPAL,'1'
JEK3;继续查找转K3
CMPAL,'2'
JEK5;结束查找转K5
PRINTCRLF
PRINTERROR1
JMPK2;输入错误显示提示信息,重新输入
K5:
POPCX
MOVCX,1;CX置1,退出循环结束查找
JMPK6
K3:
POPCX
XORDX,DX;调整剩余比较次数CX
MOVDL,STRING1+1
SUBCX,DX
INCCX
ADDBX,DX;调整下次比较的相对位移BX
DECBX
JMPK6
K7:
POPCX
K6:
LOOPK1
K4:
PRINTCRLF;显示找到的字符串个数
PRINTSTR5
MOVBX,SEARCH_COUNT
CALLBINIDEC
RET
SEARCHENDP
;******************显示找到的字符串、前几行、后几行********************
SHOWPROC
PUSHBX
PUSHSI
CLS;清屏,置光标位置为0行0列
MOVBX,OFFSETTEXT
XORDX,DX
XORCH,CH
MOVCL,STRING1+1
SUBSI,CX;SI指向找到的字符串的第一个字符
MOVDI,SI
CMPDI,BX
JEH4;若DI指向文件的第一个字符则转H4
H0:
CMPDI,BX;判断是否到文件头
JBH3
CMPBYTEPTR[DI],10
JNEH1
INCDL
CMPDL,6
JEH3
H1:
DECDI
JMPH0
H3:
INCDI
CMPDI,SI
JEH4;要显示找到的字符串时转H4
MOVDL,[DI];显示字符串前几行的内容
MOVAH,2
INT21H
JMPH3
H4:
MOVBH,0
MOVAH,3
INT10H;读当前的光标位置
MOVBH,0
MOVBL,9FH
XORCH,CH
MOVCL,STRING1+1
MOVBP,DI
MOVAL,1
MOVAH,13H
INT10H;将找到的字符串以不同的底色显示
XORCH,CH
MOVCL,STRING1+1
ADDSI,CX
XORBX,BX
MOVCX,OFFSETTEXT
ADDCX,ALL_COUNT;CX为文件最后一个字符的偏移地址
F0:
CMPSI,CX;判断是否到文件尾
JAF4
MOVDL,[SI]
MOVAH,2
INT21H;显示字符串后几行的内容
CMPBYTEPTR[SI],10
JNEF1
INCBL
F1:
INCSI
CMPBL,6
JBF0
F4:
POPSI
POPBX
RET
SHOWENDP
;************************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编 课程设计 字符串 查找 替换