Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Поиск подстроки в строке с заданной позиции

Delphi , Синтаксис , Текст и Строки



Автор: Romkin
WEB-сайт: http://delphibase.endimus.com

{ **** UBPFD *********** by delphibase.endimus.com ****
>> 
S - строка, в которой искать
SubStr - образец
fromPos - с какой позиции
Все на асемблере, принцип простой - ищется первый символ, затем часть строки
сравнивается с образцом начиная с этого символа
Если образец не найден, возвращает 0
Если найден - номер первого символа вхождения

Зависимости: Нету их!
Автор:       Romkin, romkin@pochtamt.ru, Москва
Copyright:   Модернизированная функция из SysUtils
Дата:        18 июля 2002 г.
***************************************************** }

function TailPos(const S, SubStr: AnsiString; fromPos: integer): integer;
asm
        PUSH EDI
        PUSH ESI
        PUSH EBX
        PUSH EAX
        OR EAX,EAX
        JE @@2
        OR EDX,EDX
        JE @@2
        DEC ECX
        JS @@2

        MOV EBX,[EAX-4]
        SUB EBX,ECX
        JLE @@2
        SUB EBX,[EDX-4]
        JL @@2
        INC EBX

        ADD EAX,ECX
        MOV ECX,EBX
        MOV EBX,[EDX-4]
        DEC EBX
        MOV EDI,EAX
@@1: MOV ESI,EDX
        LODSB
        REPNE SCASB
        JNE @@2
        MOV EAX,ECX
        PUSH EDI
        MOV ECX,EBX
        REPE CMPSB
        POP EDI
        MOV ECX,EAX
        JNE @@1
        LEA EAX,[EDI-1]
        POP EDX
        SUB EAX,EDX
        INC EAX
        JMP @@3
@@2: POP EAX
        XOR EAX,EAX
@@3: POP EBX
        POP ESI
        POP EDI
end;

Перевод контента на русский язык:

Дана функция TailPos в ассемблерном языке Delphi, которая ищет подстроку в строке, начиная с указанной позиции. Функция принимает три параметра:

  • S: исходная строка для поиска
  • SubStr: подстрока для поиска
  • fromPos: начальная позиция поиска

Функция возвращает целочисленное значение, представляющее собой позицию первого вхождения подстроки в исходную строку, или 0, если подстрока не найдена.

Вот разбивка кода:

  1. Код ассемблера начинает с того, что кладет несколько регистров на стек: EDI, ESI, EBX и EAX. Это делается для сохранения их значений во время выполнения функции.
  2. Первая часть кода проверяет, является ли ни одна из строк S или SubStr пустой. Если это так, она возвращает 0 немедленно с помощью инструкции JE (прыжок если равен).
  3. Следующая секция кода calculates длина обеих строк и сравнивает их, чтобы определить, хватает ли места для поиска подстроки, начиная с указанной позиции (fromPos). Если не хватает, она прыгает к метке @@2.
  4. После расчета длин код настраивает регистры для хранения указателей на начало каждой строки.
  5. Основной цикл поиска начинается с метки @@1. Он загружает байт из исходной строки в регистр ESI и затем использует инструкцию REPNE SCASB (повторять, пока не равно, сканировать строку) для сравнения его с подстрокой, начиная с текущей позиции в EDI.
  6. Если сравнение провалилось, она прыгает к метке @@2. Иначе, она переходит к следующему циклу.
  7. Когда подстрока найдена, код настраивает регистры для хранения указателей на начало и конец совпадения. Затем он входит во второй цикл (REPE CMPSB), сравнивая совпавшую подстроку с исходной строкой байт за байтом до тех пор, пока они не перестанут совпадать или до конца совпадения.
  8. После обнаружения совпадения функция возвращает позицию первого вхождения подстроки.

Пример использования:

var
  S: ANSIString;
begin
  S := 'Hello World!';
  Result := TailPos(S, 'World', 1); // Возвращает 6
end.

В этом примере функция TailPos вызывается с строкой S, установленной на 'Hello World!', и подстрокой 'World'. Поиск начинается с позиции 1 (первого символа исходной строки). Функция возвращает целочисленное значение, представляющее собой позицию первого вхождения подстроки в исходную строку, которая в этом случае равна 6.

Обратите внимание, что предоставленный код - это реализация Delphi ассемблерного языка и может не быть совместимым с другими программными языками или средами.

В статье описана функция TailPos, которая ищет подстроку в строке с заданной позиции на ассемблере.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Текст и Строки ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-29 02:16:14/0.0035340785980225/0