在 8086 汇编语言中搜索子字符串的程序不起作用

Program to search for substring in 8086 assembly language does not work

到目前为止,这是我的代码。出于某种原因,我总是在 运行.
上收到 NOT FOUND 消息 我必须检查主字符串 (HELLO) 中是否存在某个子字符串 (HELL)。如何修复我的代码?

.model small

COMPARE MACRO
LEA DI,SUBSTR
MOV CL,LENSUB
CLD
REPE CMPSB
JZ FOUND
ENDM

.data
STR DB "HELLO"
LENSTR DB $-STR
SUBSTR DB "HELL"
LENSUB DB $-SUBSTR
MSG1 DB "FOUND$"
MSG2 DB "NOT FOUND$"

.code
MOV AX,@Data
MOV DS,AX
MOV CL,LENSTR
LEA SI,STR
UP:
PUSH SI
PUSH CX
COMPARE
POP CX
POP SI
INC SI
LOOP UP

LEA DX,MSG2
UP1:
MOV AH,09H
INT 21H
JMP LAST

FOUND:
LEA DX,MSG1
JMP UP1

LAST:
MOV AH,4CH
INT 21H
END

由于程序中的一些错误,您的 COMPARE 宏代码永远不会(?)跳转到 FOUND:

  1. 您已经设置了 DS 段寄存器,但是由于 REPE CMPSB 指令还使用了 ES 段寄存器,您还需要设置那个。

    MOV AX, @Data
    MOV DS, AX
    MOV ES, AX
    
  2. REPE 前缀希望在 CX 寄存器中找到重复计数,但您只将计数存储在 CL 寄存器中。

    LEA DI, SUBSTR
    MOV CL, LENSUB
    MOV CH, 0
    ...
    ...
    ...
    MOV CL, LENSTR
    MOV CH, 0
    LEA SI, STR
    

关于LOOP UP指令!
由于子字符串在较大的字符串中只能出现有限的次数,因此您不能只循环获取较大字符串的总长度。正确的计数是 LENSTR-LENSUB+1。这里有 5-4+1 给出 2 作为存储在 CX 中的正确值。

HELLO

HELL            1st is correct
 ELLO           2nd is correct
  LLO?          3rd is wrong
   LO??         4th is wrong
    O???        5th is wrong