Как мне в сборке искать символ из одной строки в другой строке?

#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 ?