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

沙尚克

到目前为止,这是我的代码。出于某种原因,我总是在跑步时收到 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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章