字符串匹配.doc_第1页
字符串匹配.doc_第2页
字符串匹配.doc_第3页
字符串匹配.doc_第4页
字符串匹配.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

字符串匹配1、 实验目的掌握字符串的查找与匹配的有关算法。掌握串指令的使用方法,数据段、附件段的设置,源串、目的串地址指针的设置与使用,CMPS与REPE(REPNE)的使用技巧。2、 实验内容写一个算法计算和显示一个字符串SUBSTR在字符串STR出现的位置与次数。层次要求如下:C在数据区的字节变量中有一个字符串STR,输出字符串“SHU”在STR中第一次出现的位置(用16进制)。如果STR中不包含“SHU”则显示“No match!”;B键盘输入一个以回车结尾的字符串,并把结果存放于数据区的具有80字节的变量STR中,输出字符串“SHU”在STR中第一次出现位置(用16进制)。如果STR中不包含“SHU”则显示“No match!”;A键盘输入一个以回车结尾的字符串,并把串存放于数据区的具有80字节的变量STR中;再输入一个关键词,存入具有8个字节的变量SUBSTR中。输出字符串SUBSTR在STR中第一次出现位置(用10进制)。如果STR中不包含SUBSTR的内容则显示“No match!”。注:对有潜力的同学,输出子字符串在STR中出现的次数。3、 分析与体会这次实验没有不会用CMPSB和REPE命令是一个很大的遗憾。不过,通过这次实验我又学会了一些内容。关于0AH命令以及09命令的应用,我已经得心应手了。0AH命令运用之前需要在数据区定义一个字符串数组,字符串数组的第一个元素是能存储的最大元素个数,第二个是实际的输入的元素个数。所以在比较的时候需要从第三个(下标为2的)元素开始比。这时候用EQU命令来计算数组元素的个数是不行的。4、 代码层次C的代码: STACKS SEGMENT STACK DW 128 DUP(?) STACKS ENDS DATAS SEGMENT STR1 DB SHanghai University-SHU, STR2 DB SHU M EQU $-STR2 STR3 DB No match!$ FH DW 0 AI DW 0 FLAG DW 0 DATAS ENDS CODES SEGMENT MAIN PROC FAR ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS MOV DS,AX MOV FH,0 ;做为匹配与否的标记 MOV AH,0 MOV AL,STR11 SUB AX,M ;只要比较 N-M次 MOV AI,0 MOV SI,0 NEXT: MOV DI,0 MOV SI,AI AGAIN: MOV CX,M MOV BH,STR1SI MOV BL,STR2DI CMP BH,BL JNE P1 INC SI INC DI CMP DI,3 JB AGAIN MOV FH,1 INC AI JMP PRI P1: INC AI CMP AI,AX JB NEXT PD: CMP FH,1 JB P20 PRI: MOV BX,AI CALL TOSIXTEEN JMP EXIT P20: LEA DX,STR3 MOV AH,09 INT 21H JMP EXIT;十六进制输出 TOSIXTEEN PROC NEAR MOV CH,4 NEXT1: MOV CL,4 ROL BX,CL MOV DX,BX AND DL,0FH ADD DL,30H CMP DL,3AH JB NEXT2 ADD DL,7 NEXT2: MOV AH,2 INT 21H DEC CH JNZ NEXT1 MOV DL,H MOV AH,2 INT 21H RET TOSIXTEEN ENDP EXIT: MOV AX,4C00H INT 21H MAIN ENDP CODES ENDS END START层次B的代码: STACKS SEGMENT STACK DW 128 DUP(?) STACKS ENDS DATAS SEGMENT STR1 DB 100,?,101 DUP(?) N DW ? STR2 DB SHU M EQU $-STR2 STR3 DB No match!$ FH DW 0 AI DW 0 FLAG DW 0 DATAS ENDS CODES SEGMENT MAIN PROC FAR ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS MOV DS,AX LEA DX,STR1 MOV AH,0AH INT 21H ;字符串输入 ,以 $ 结束 MOV FH,0 ;做为匹配与否的标记 MOV AH,0 MOV AL, STR11 INC AX MOV AI,2 MOV SI,0 NEXT: MOV DI,0 MOV SI,AI AGAIN: MOV BH,STR1SI MOV BL,STR2DI CMP BH,BL JNE P1 INC SI INC DI CMP DI,3 JB AGAIN MOV FH,1 INC AI JMP PRI P1: INC AI CMP AI,AX JB NEXT PD: CMP FH,1 JB P20 PRI: CALL PRIENTER MOV BX,AI SUB BX,2 CALL TOSIXTEEN JMP EXIT P20: CALL PRIENTER LEA DX,STR3 MOV AH,09 INT 21H JMP EXIT;十六进制输出 TOSIXTEEN PROC NEAR MOV CH,4 NEXT1: MOV CL,4 ROL BX,CL MOV DX,BX AND DL,0FH ADD DL,30H CMP DL,3AH JB NEXT2 ADD DL,7 NEXT2: MOV AH,2 INT 21H DEC CH JNZ NEXT1 MOV DL,H MOV AH,2 INT 21H RET TOSIXTEEN ENDP PRIENTER PROC NEAR ;换行 MOV DL,0DH MOV AH,2 INT 21H MOV DL,0AH MOV AH,2 INT 21H RET PRIENTER ENDP EXIT: MOV AX,4C00H INT 21H MAIN ENDP CODES ENDS END START层次A的代码: STACKS SEGMENT STACK DW 128 DUP(?) STACKS ENDS DATAS SEGMENT STR1 DB 100,?,100 DUP(?) STR2 DB 20,?,20 DUP(?) M DW ? N DW ? STR3 DB No match!$ FH DW 0 AI DW 0 FLAG DW 0 DATAS ENDS CODES SEGMENT MAIN PROC FAR ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS MOV DS,AX LEA DX,STR1 MOV AH,0AH INT 21H ;字符串输入 ,以 $ 结束 CALL PRIENTER ;换行,区分输入 LEA DX,STR2 MOV AH,0AH INT 21H MOV FH,0 ;做为匹配与否的标记 MOV AH,0 MOV AL,STR11 ; 输入的字符个数 INC AX MOV CH,0 MOV CL,STR21 INC CX MOV AI,2 NEXT: MOV DI,2 MOV SI,AI AGAIN: MOV BH,STR1SI MOV BL,STR2DI CMP BH,BL JNE P1 INC SI INC DI CMP DI,CX JB AGAIN MOV FH,1 INC AI JMP PRI P1: INC AI CMP AI,AX JB NEXT PD: CMP FH,1 JB P20 PRI: CALL PRIENTER MOV BX,AI SUB BX,2 CALL TOTEN JMP EXIT P20: CALL PRIENTER LEA DX,STR3 MOV AH,09 INT 21H JMP EXIT;十进制输出 TOTEN PROC NEAR CMP BX,0 JG P111 MOV DL,30H MOV AH,2 INT 21H JMP RETURN P111: MOV FLAG,0 MOV DI,10000 P15: MOV DX,0 MOV AX,BX DIV DI MOV BX,DX MOV DL,AL CMP DL,0 JE P101 MOV FLAG,1 P102: ADD DL,30H MOV AH,2 INT 21H P16: MOV AX,DI MOV DX,0 MOV CX,10 DIV CX MOV DI,AX CMP DI,0 JG P15 JMP RETURN P101: CMP FLAG,0 JE P16 JMP P102 RETURN: RET TOTEN ENDP PRIENTER PROC NEAR ;换行 MOV DL,0DH MOV AH,2 INT 21H MOV DL,0AH MOV AH,2 INT 21H RET PRIENTER ENDP EXIT: MOV AX,4C00H INT 21H MAIN ENDP CODES ENDS END START层次的代码:;输入一个字符串STR1(以回车结束),再输入一个字符串STR2(回车结束),显示STR2在STR1中出现的次数 STACKS SEGMENT STACK DW 128 DUP(?) STACKS ENDS DATAS SEGMENT STR1 DB 100,?,100 DUP(?) STR2 DB 20,?,20 DUP(?) M DW ? N DW ? AI DW 0 FLAG DW 0 TIMES DW 0 DATAS ENDS CODES SEGMENT MAIN PROC FAR ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS MOV DS,AX LEA DX,STR1 MOV AH,0AH INT 21H ;字符串输入 ,以 $ 结束 CALL PRIENTER ;换行,区分输入 LEA DX,STR2 MOV AH,0AH INT 21H MOV AH,0 MOV AL,STR11 ; 输入的字符个数 INC AX MOV CH,0 MOV CL,STR21 INC CX INC CX MOV AI,2 NEXT: MOV DI,2 MOV SI,AI AGAIN: MOV BH,STR1SI MOV BL,STR2DI CMP BH,BL JNE P1 INC SI INC DI CMP DI,CX JB AGAIN INC TIMES INC AI P1: INC AI CMP AI,AX JB NEXT CALL PRIENTER MOV BX,TIMES CALL TOTEN JMP EXIT;十进制输出 TOTEN PROC NEAR CMP BX,0 JG P111 MOV DL,30H MOV AH,2 INT 21H JMP RETURN P111: MOV FLAG,0 MOV DI,10000 P15: MOV DX,0 MOV AX,BX DIV DI MOV BX,DX MOV DL,AL CMP DL,0 JE P101 MOV FLAG,1 P102: ADD DL,30H MOV AH,2 INT 21H P16: MOV AX,DI MOV DX,0 MOV CX,10 DIV CX MOV DI,AX CMP DI,0 JG P15 JMP RE

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论