#assembly #x86 #fasm
#сборка #x86 #fasm
Вопрос:
Мне нужно создать и собрать программу, которая ищет повторяющиеся подстроки в строке, но моя программа просто просматривает всю строку, не находя совпадения. Как это исправить?
Сам код (не обращайте внимания на комментарии на кириллице):
section '.data' data readable writable ;секция данных
string db 'Hello world',0 ;исходная строка
substring db 'orl',0 ;искомая строка
output db "The substring was encountered %d times", 0 ;текст сообщения
section '.code' code readable writable executable ;секция кода
start:
cld ;очищаем флаг направления DF
xor ebx, ebx ;очищаем EBX как счётчик подстрок
mov esi, string ;перемещаем строку в ESI
mov edx, substring ;перемещаем искомую подстроку в EDX
mov ecx, 11 ;перемещаем длину строки в ECX
cmp byte [esi],0 ;если строка закончилась, переходим на FINISH
je FINISH
cmp byte [edi],0 ;если подстрока закончилась, переходим на FINISH
je FINISH
SEARCH:
mov al, [edx] ;перемещаем первый символ искомой подстроки в AL
repnz scasb ;пока символы строки не совпадают с данным символом подстроки, проходим
jcxz FINISH ;если строка закончилась, переходим на FINISH
CHECK:
inc edx ;переходим на следующий символ подстроки
cmp byte [edx], 0 ;проверяем, закончилась ли искомая подстрока
jz FOUND ;если конец искомой подстроки, переходим на FOUND
inc esi ;переходим на следующий символ строки
dec ecx ;уменьшаем ECX на 1
jcxz FINISH ;если строка закончилась, переходим на FINISH
mov al, [edx] ;перемещаем следующий символ искомой подстроки в AL
cmp byte [esi], al ;проверяем текущий символ строки
jne SEARCH ;если символы не равны, переходим на SEARCH
jmp CHECK ;если символы равны, переходим на CHECK
FOUND:
inc ebx ;увеличиваем EBX
inc esi ;переходим на следующий символ строки
dec ecx ;уменьшаем ECX на 1
jcxz FINISH ;если строка закончилась, переходим на FINISH
jmp SEARCH ;переходим на SEARCH
FINISH:
ccall [printf], output, ebx
ccall [getchar]
stdcall [ExitProcess],0
Комментарии:
1. Вы пробовали одноступенчатый переход? Подсказка: проверить
edi
?2. @ErikEidt Но я использую
edi
. Кроме того, что вы имеете в виду под «проверкой»?3. Он имеет в виду, что у вас опечатка,
mov edx, substring
потому что в вашем комментарии сказано, что так и должно бытьedi
.4. Тогда вам также нужно изменить
cmp byte [edi],0
наedx
, потомуedi
что ничего не установлено.5. Как насчет
scasb
?