Программа для поиска подстроки на 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 из-за нескольких ошибок в вашей программе:
Вы настроили регистр сегмента DS, но так как
REPE CMPSB
Инструкция также использует регистр сегмента ES, вам все еще нужно его настроить.MOV AX, @Data MOV DS, AX MOV ES, AX
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