emu8086汇编——字符串匹配算法程序

一、实验内容

已知任意长度字符串str,以00h结束,长度小于200h,编写汇编程序,实现在该字符串中搜索匹配子串substr(以00h结束,长度小于80),若找到,则将found单元置为ffh,并将匹配位置(匹配位置以字符串str首地址为0参考点)存放在pos单元中;否则,将found单元置为00h。要求编写完整程序,并上机通过调式能运行。

二、算法思想

搜索查找采用了Brute-Force算法,一个简单而广泛使用的暴力搜索,它在文本中对可能匹配模式串的任何位置检查匹配是否存在。一个指针SI跟踪文本,另一个指针DI跟踪模式串。对于每一个SI都会启动一次匹配搜寻,若模式匹配则将found单元置为ffh,并将匹配位置存放于pos单元。否则重置DI为0并将SI移动到下一个位置进行下一次匹配。若最后未找到匹配,则found单元置为00h。
BF算法虽然在最坏情况下的运行时间与MN成正比,但在实际应用场景中,大部分情况它的运行时间一般与M+N成正比。它在一般情况下都工作良好(Java的String类型的indexOf()方法使用的就是BF算法)。

三、运行结果截图

  • 能找到匹配的情况:FOUND=FFH,POS存放匹配位置,如下图所示:
    在这里插入图片描述
  • 未能找到匹配的情况:FOUND=00H,如下图所示:
    在这里插入图片描述

四、程序源码

DATA SEGMENT
    STR DB "ACCCUB3121NA31CBB098621XXJDB"
        DB "SZ57BVVC3ACBBXXJDBSZ4329AX56"
        DB "SZACM34XAAB565757BVVC356CNKJ"
        DB "POACM8901AB565098HNKJD56CNK0"
        DB "I8930934MHBDV27839B4501B48YZ",00h
    SUBSTR DB "ACBBXXJDBSZ43S29AX",00h
    FOUND DB 0
    POS DW 0  
DATA ENDS

CODE SEGMENT
    ASSUME:CS:CODE,DS:DATA
START:MOV AX,DATA
      MOV DS,AX
      
      LEA SI,STR
      LEA DI,SUBSTR  
COMPARE:                     ;源串循环
      CMP BYTE PTR[SI],00h   ;检测源串是否结束
      JZ DONE1               ;若结束,则说明未找到匹配
      MOV DL,BYTE PTR[SI]
      CMP DL,BYTE PTR[DI] 
      JNZ L1
      INC DI         
      CMP BYTE PTR[DI],00h   ;检测匹配子串是否结束
      JZ DONE2               ;若结束,则说明找到了匹配
L1:   INC SI 
      JMP COMPARE
     
DONE1: MOV CL,00H
       MOV FOUND,CL
       JMP NEXT
DONE2: MOV CL,0FFH
       MOV FOUND,CL 
       LEA BX,SUBSTR  ;计算匹配位置
       SUB DI,BX
       SUB SI,DI
       ADD SI,1
       MOV POS,SI
NEXT:
      MOV AH,4CH
      INT 21H      
CODE ENDS
    END START
  • 7
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值