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

时间:2017-03-10 11:56:48

标签: assembly x86-16 emu8086

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

1 个答案:

答案 0 :(得分:1)

由于程序中存在一些错误,您的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
    
  3. 关于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