字符串匹配

题目:

  已知一任意长度字符串str,以00h结束,长度小于200h,编写汇编程序实现在该字符串中搜索匹配子串substr(以00h结束,长度小于80),若找到,则将found单元置为ffh,并将匹配位置(匹配位置以字符串str首地址为0参考点)存放在pos单元中;否则,将found单元置为00H。(禁止使用串操作指令)

解答:

BF算法

  1. 首先需要取两个字符串的地址,取两个空间SI,DI分别保存两个字符串的地址
  2. 取出地址SI和DI处的值,进行比较
  3. 若两个字符不同,则SI和DI都后移一个字节(假定字符串中的字符以字节形式存储),返回第二步
  4. 若SI为0,则将found单元值00H并退出程序
  5. 若两个字符相同,则先将地址SI,DI的值保存(进行压栈,后面再弹栈时,SI和DI的值会保留现在的值)
  6. 将SI和DI后移一位
  7. 若DI为0(考虑子串substr只有一个字符的情况),则将found单元置FFH,并将SI的地址减1放到pos单元中
  8. 若DI不为0,比较地址SI和DI处的值
  9. 若不同,则弹栈返回第二步处,即将压栈前SI和DI的值向后移动一位继续比较
  10. 若相同,则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 中国大陆许可协议进行许可。

posted @   听风者628  阅读(219)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.