2、设计思路
分析实验要求,我们要完成四个功能:
1)从一个已知字符串str中找到匹配字符串substr的起始位置;
2)从起始位置开始,比对两个字符串,确定两个字符串确实一样,由此便可认为已知字符串中出现了匹配字符串;
3)在找到匹配字符串后,设置标志为单元found;
4)在找到匹配字符串后,把匹配位置存放到pos中。
明确需要完成的功能,然后设计算法:
1)使用‘while’循环,遍历字符串str,找到匹配字符串substr的起始位置;
2)找到起始位置后,再用LOOP循环对两个字符串比对。循环次数是substr长度再减一(第一次已经在while中完成);
3)4)完成循环后,设置标志位found,把匹配位置存放到pos中。
注意到str可能不包含substr,当遍历str没有找到substr时,程序终止。
下面是程序思路流程图:
3、运行结果
设置字符串str和匹配字符串substr如图:
设置字符串str和匹配字符串substr如图:
运行结果如下:
本实验的汇编语言源代码见博客末尾:
;Finding substr from stringDATA SEGMENT str DB '2020210827 Liqiwen', 00H substr DB 'Liqiwen', 00H N EQU $-substr found DB 00H pos DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX, DATA MOV DS, AX LEA SI, str XOR AX, AX MOV AL, [SI] ;Using AL as the container of [SI] XOR CX, CX MOV CX, N-1 ;LOOP times: N-1 BACK:LEA DI, substr SHIFT: CMP AL, 00H ;str doesn't contain substr, program terminated. JE FINISH CMP AL, [DI] JE COMP ;If [SI] euqals the first chart of substr, comparation will begin. INC SI MOV AL, [SI] JMP SHIFT COMP: INC SI ;Shift to the next chart INC DI MOV AL, [SI] L1: CMP AL, [DI] JNE BACK ;If [DI] doesn't euqal [SI], clarifying substr didn't appare, instruction will go back. INC SI INC DI MOV AL, [SI] LOOP L1 MOV AL, 0FFH MOV found, AL LEA BX, SI-8 ;BX deposits the beginning position. MOV [pos], BX FINISH: MOV AH, 4CH INT 21H CODE ENDS END START
复制代码