Программа для поиска подстроки на 8086 ассемблере не работает

Вот мой код до сих пор. По какой-то причине я всегда получаю сообщение NOT FOUND при запуске.
Я должен проверить, присутствует ли определенная подстрока (HELL) в основной строке (HELLO). Как мне исправить мой код?

.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 ответ

Решение

Ваш код макроса 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
Другие вопросы по тегам