字符串匹配
题目:
已知一任意长度字符串str,以00h结束,长度小于200h,编写汇编程序实现在该字符串中搜索匹配子串substr(以00h结束,长度小于80),若找到,则将found单元置为ffh,并将匹配位置(匹配位置以字符串str首地址为0参考点)存放在pos单元中;否则,将found单元置为00H。(禁止使用串操作指令)
解答:
BF算法
- 首先需要取两个字符串的地址,取两个空间SI,DI分别保存两个字符串的地址
- 取出地址SI和DI处的值,进行比较
- 若两个字符不同,则SI和DI都后移一个字节(假定字符串中的字符以字节形式存储),返回第二步
- 若SI为0,则将found单元值00H并退出程序
- 若两个字符相同,则先将地址SI,DI的值保存(进行压栈,后面再弹栈时,SI和DI的值会保留现在的值)
- 将SI和DI后移一位
- 若DI为0(考虑子串substr只有一个字符的情况),则将found单元置FFH,并将SI的地址减1放到pos单元中
- 若DI不为0,比较地址SI和DI处的值
- 若不同,则弹栈返回第二步处,即将压栈前SI和DI的值向后移动一位继续比较
- 若相同,则DI向后移动一位
DATA SEGMENT
STR DB "BABCABCD" , 0
SUBSTR DB "ABCE" , 0
FOUND DW ?
POS DW ?
DATA ENDS
STACK1 SEGMENT STACK
DW 100 DUP(?)
ATSCK1 SEGMENT
CODE SEGMENT
ASSUME CS:CODE , DS:DATA , SS:STACK1
START:MOV AX , DATA
MOV DS , AX
MOV SI , OFFSET STR ;SI存入STR的地址
MOV DI , OFFSET SUBSTR ;DI存入SUBSTR的地址
CALL PROSTR ;调用子程序求解
MOV AH , 4CH
INT 21H
PROSTR PROC
XOR AX , AX ;清零AX和DX寄存器
MOV DX , AX
NEXT1:MOV AL , PTR BYTE [SI] ;第一个主循环NEXT1,取出地址SI和DI存放的数
MOV DL , PTR BYTE [DI]
CMP AL , 0 ;如果SI存放的是0,则循环结束跳转到NEXT2
JE NEXT2
CMP AL , DL ;比较SI和DI处的值是否相等
JE NEXT3 ;如果相等,则跳转到NEXT3
INC SI ;SI <- SI + 1
JMP NEXT1
NEXT2:MOV FOUND , 00H ;遍历完整个STR后仍未匹配,则将found单元置为00H
RET
NEXT3:PUSH SI ;先将SI和DI压栈
PUSH DI
NEXT4:INC SI ;SI <- SI + 1
INC DI ;DI <- DI + 1
MOV AL , PTR BYTE [SI] ;取出地址SI和DI存放的数据
MOV DL , PTR BYTE [DI]
CMP DL , 0 ;如果DI存放的是0,则循环结束跳转到NEXT5
JE NEXT5
CMP AL , DL ;比较SI和DI中存放数据是否相等
JE NEXT4 ;如果相等,则继续循环
POP DI ;如果不相等,则将DI和SI弹栈,回到刚才的位置
POP SI
INC SI ;SI后移一位,再返回主循环进行匹配
JMP NEXT1
NEXT5:POP DI ;字符串匹配完成,将SI和DI弹栈,取出匹配的地址
POP SI
MOV FOUND , 0FFH ;将found单元置为FFH
MOV AX , SI
MOV POS , AX
RET
PROSTR ENDP
CODE ENDS
END START
本文作者:听风者628
本文链接:https://www.cnblogs.com/shuang-fan/p/16209033.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步