字符串匹配.docx
- 文档编号:23635714
- 上传时间:2023-05-19
- 格式:DOCX
- 页数:19
- 大小:16.56KB
字符串匹配.docx
《字符串匹配.docx》由会员分享,可在线阅读,更多相关《字符串匹配.docx(19页珍藏版)》请在冰豆网上搜索。
字符串匹配
字符串匹配
1、实验目的
掌握字符串的查找与匹配的有关算法。
掌握串指令的使用方法,数据段、附件段的设置,源串、目的串地址指针的设置与使用,CMPS与REPE(REPNE)的使用技巧。
2、实验内容
写一个算法计算和显示一个字符串SUBSTR在字符串STR出现的位置与次数。
层次要求如下:
C.在数据区的字节变量中有一个字符串STR,输出字符串“SHU”在STR中第一次出现的位置(用16进制)。
如果STR中不包含“SHU”则显示“Nomatch!
”;
B.键盘输入一个以回车结尾的字符串,并把结果存放于数据区的具有80字节的变量STR中,输出字符串“SHU”在STR中第一次出现位置(用16进制)。
如果STR中不包含“SHU”则显示“Nomatch!
”;
A.键盘输入一个以回车结尾的字符串,并把串存放于数据区的具有80字节的变量STR中;再输入一个关键词,存入具有8个字节的变量SUBSTR中。
输出字符串SUBSTR在STR中第一次出现位置(用10进制)。
如果STR中不包含SUBSTR的内容则显示“Nomatch!
”。
注:
对有潜力的同学,输出子字符串在STR中出现的次数。
3、分析与体会
这次实验没有不会用CMPSB和REPE命令是一个很大的遗憾。
不过,通过这次实验我又学会了一些内容。
关于0AH命令以及09命令的应用,我已经得心应手了。
0AH命令运用之前需要在数据区定义一个字符串数组,字符串数组的第一个元素是能存储的最大元素个数,第二个是实际的输入的元素个数。
所以在比较的时候需要从第三个(下标为2的)元素开始比。
这时候用EQU命令来计算数组元素的个数是不行的。
4、代码
层次C的代码:
STACKSSEGMENTSTACK
DW128DUP(?
)
STACKSENDS
DATASSEGMENT
STR1DB'SHanghaiUniversity-SHU,'
STR2DB'SHU'
MEQU$-STR2
STR3DB'Nomatch!
$'
FHDW0
AIDW0
FLAGDW0
DATASENDS
CODESSEGMENT
MAINPROCFAR
ASSUMECS:
CODES,DS:
DATAS
START:
MOVAX,DATAS
MOVDS,AX
MOVFH,0;做为匹配与否的标记
MOVAH,0
MOVAL,STR1[1]
SUBAX,M;只要比较N-M次
MOVAI,0
MOVSI,0
NEXT:
MOVDI,0
MOVSI,AI
AGAIN:
MOVCX,M
MOVBH,STR1[SI]
MOVBL,STR2[DI]
CMPBH,BL
JNEP1
INCSI
INCDI
CMPDI,3
JBAGAIN
MOVFH,1
INCAI
JMPPRI
P1:
INCAI
CMPAI,AX
JBNEXT
PD:
CMPFH,1
JBP20
PRI:
MOVBX,AI
CALLTOSIXTEEN
JMPEXIT
P20:
LEADX,STR3
MOVAH,09
INT21H
JMPEXIT
;十六进制输出
TOSIXTEENPROCNEAR
MOVCH,4
NEXT1:
MOVCL,4
ROLBX,CL
MOVDX,BX
ANDDL,0FH
ADDDL,30H
CMPDL,3AH
JBNEXT2
ADDDL,7
NEXT2:
MOVAH,2
INT21H
DECCH
JNZNEXT1
MOVDL,'H'
MOVAH,2
INT21H
RET
TOSIXTEENENDP
EXIT:
MOVAX,4C00H
INT21H
MAINENDP
CODESENDS
ENDSTART
层次B的代码:
STACKSSEGMENTSTACK
DW128DUP(?
)
STACKSENDS
DATASSEGMENT
STR1DB100,?
101DUP(?
)
NDW?
STR2DB'SHU'
MEQU$-STR2
STR3DB'Nomatch!
$'
FHDW0
AIDW0
FLAGDW0
DATASENDS
CODESSEGMENT
MAINPROCFAR
ASSUMECS:
CODES,DS:
DATAS
START:
MOVAX,DATAS
MOVDS,AX
LEADX,STR1
MOVAH,0AH
INT21H;字符串输入,以$结束
MOVFH,0;做为匹配与否的标记
MOVAH,0
MOVAL,STR1[1]
INCAX
MOVAI,2
MOVSI,0
NEXT:
MOVDI,0
MOVSI,AI
AGAIN:
MOVBH,STR1[SI]
MOVBL,STR2[DI]
CMPBH,BL
JNEP1
INCSI
INCDI
CMPDI,3
JBAGAIN
MOVFH,1
INCAI
JMPPRI
P1:
INCAI
CMPAI,AX
JBNEXT
PD:
CMPFH,1
JBP20
PRI:
CALLPRIENTER
MOVBX,AI
SUBBX,2
CALLTOSIXTEEN
JMPEXIT
P20:
CALLPRIENTER
LEADX,STR3
MOVAH,09
INT21H
JMPEXIT
;十六进制输出
TOSIXTEENPROCNEAR
MOVCH,4
NEXT1:
MOVCL,4
ROLBX,CL
MOVDX,BX
ANDDL,0FH
ADDDL,30H
CMPDL,3AH
JBNEXT2
ADDDL,7
NEXT2:
MOVAH,2
INT21H
DECCH
JNZNEXT1
MOVDL,'H'
MOVAH,2
INT21H
RET
TOSIXTEENENDP
PRIENTERPROCNEAR;换行
MOVDL,0DH
MOVAH,2
INT21H
MOVDL,0AH
MOVAH,2
INT21H
RET
PRIENTERENDP
EXIT:
MOVAX,4C00H
INT21H
MAINENDP
CODESENDS
ENDSTART
层次A的代码:
STACKSSEGMENTSTACK
DW128DUP(?
)
STACKSENDS
DATASSEGMENT
STR1DB100,?
100DUP(?
)
STR2DB20,?
20DUP(?
)
MDW?
NDW?
STR3DB'Nomatch!
$'
FHDW0
AIDW0
FLAGDW0
DATASENDS
CODESSEGMENT
MAINPROCFAR
ASSUMECS:
CODES,DS:
DATAS
START:
MOVAX,DATAS
MOVDS,AX
LEADX,STR1
MOVAH,0AH
INT21H;字符串输入,以$结束
CALLPRIENTER;换行,区分输入
LEADX,STR2
MOVAH,0AH
INT21H
MOVFH,0;做为匹配与否的标记
MOVAH,0
MOVAL,STR1[1];输入的字符个数
INCAX
MOVCH,0
MOVCL,STR2[1]
INCCX
MOVAI,2
NEXT:
MOVDI,2
MOVSI,AI
AGAIN:
MOVBH,STR1[SI]
MOVBL,STR2[DI]
CMPBH,BL
JNEP1
INCSI
INCDI
CMPDI,CX
JBAGAIN
MOVFH,1
INCAI
JMPPRI
P1:
INCAI
CMPAI,AX
JBNEXT
PD:
CMPFH,1
JBP20
PRI:
CALLPRIENTER
MOVBX,AI
SUBBX,2
CALLTOTEN
JMPEXIT
P20:
CALLPRIENTER
LEADX,STR3
MOVAH,09
INT21H
JMPEXIT
;十进制输出
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
层次S的代码:
;输入一个字符串STR1(以回车结束),再输入一个字符串STR2(回车结束),显示STR2在STR1中出现的次数
STACKSSEGMENTSTACK
DW128DUP(?
)
STACKSENDS
DATASSEGMENT
STR1DB100,?
100DUP(?
)
STR2DB20,?
20DUP(?
)
MDW?
NDW?
AIDW0
FLAGDW0
TIMESDW0
DATASENDS
CODESSEGMENT
MAINPROCFAR
ASSUMECS:
CODES,DS:
DATAS
START:
MOVAX,DATAS
MOVDS,AX
LEADX,STR1
MOVAH,0AH
INT21H;字符串输入,以$结束
CALLPRIENTER;换行,区分输入
LEADX,STR2
MOVAH,0AH
INT21H
MOVAH,0
MOVAL,STR1[1];输入的字符个数
INCAX
MOVCH,0
MOVCL,STR2[1]
INCCX
INCCX
MOVAI,2
NEXT:
MOVDI,2
MOVSI,AI
AGAIN:
MOVBH,STR1[SI]
MOVBL,STR2[DI]
CMPBH,BL
JNEP1
INCSI
INCDI
CMPDI,CX
JBAGAIN
INCTIMES
INCAI
P1:
INCAI
CMPAI,AX
JBNEXT
CALLPRIENTER
MOVBX,TIMES
CALLTOTEN
JMPEXIT
;十进制输出
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
小结:
其实,会层次C的代码,层次B就不远了,然后层次A也不远了,最后层次S也不远了。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 字符串 匹配