ХАНДЫФАР

Функция FindSubStringEx выполняет поиск подстроки в строке, завершающейся (\0) или 0. Если подстрока найдена, возвращается указатель на её первое вхождение в строке. Если подстрока не найдена или один из указателей равен 0, функция возвращает 8000 и устанавливает флаг CF = 1

Функция FindSubStringEx выравнивает стек на 4 байта при достижения конца строки или если подстрока не была найдена. Если подстрока найдена, то сохраняет указатель на первую подстроку в строке в регистре AX.

Параметры:

  1. Указатель на строку, завершающуюся (\0) или 0.
  2. Указатель на подстроку, завершающуюся (\0) или 0.

Возвращаемое значение:

  • Если подстрока найдена:

____AX: Указатель на первое вхождение подстроки в строке.
____CF = 0.

  • Если подстрока не найдена или один из указателей равен 0:

____AX = 8000h.
____CF = 1.

Состояние флагов:

  • Функция влияет на флаг CF.

Особенности:

  • Поиск завершается при достижении конца строки (\0) или 0.

  • Если подстрока не найдена или один из указателей равен 0, функция возвращает 8000h и устанавливает CF = 1.

  • Функция не изменяет значения регистров, кроме AX и флага CF.

ПРИМЕР 1:

  1. title Автор: Довгополов Евгений Сергеевич
  2. .286C
  3. .model small
  4. .stack 100h
  5. data segment public
  6. ____string db "Привет, мой мир!\0"
  7. ____substr db "мой\0"
  8. data ends
  9. code segment public
  10. ____assume _ds:data, cs:code
  11. ____include Handyfar.inc
  12. ____include Handymac.inc
  13. ____main proc
  14. ________call____SetDataSegment
  15. ________pushs___es:[substr]
  16. ________pushs___ds:[string]
  17. ________call____FindSubStringEx
  18. ________push____ax
  19. ________call____WriteStringEx
  20. ________push____0
  21. ________call____ExitProcessEx
  22. ____main endp
  23. code ends
  24. end main

ПРИМЕР 2:

С помощью цикла можно вывести все вхождения определённой подстроки.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .286C
  3. .model small
  4. .stack 100h
  5. data segment public
  6. ____string db "Привет, мой мир, мой "
  7. ___________db "рай!\0"
  8. ____substr db "мой\0"
  9. data ends
  10. code segment public
  11. ____assume _ds:data, cs:code
  12. ____include Handyfar.inc
  13. ____include Handymac.inc
  14. ____main proc
  15. ________call____SetDataSegment
  16. ________pushs___es:[substr]
  17. ________pushs___ds:[string]
  18. ____MainLoop:
  19. ________call____FindSubStringEx
  20. ________jc______Done
  21. ________call____WriteString
  22. ________call____PrintNewLine
  23. ________jmp_____MainLoop
  24. ____Done:
  25. ________push____0
  26. ________call____ExitProcessEx
  27. ____main endp
  28. code ends
  29. end main
Функция FindSubStringEx выполняет поиск подстроки в строке, завершающейся (\0) или 0. Если подстрока найдена, возвращается указатель на её первое вхождение в строке. Если подстрока не найдена или один из указателей равен 0, функция возвращает 8000 и устанавливает флаг CF = 1

Функция FindSubStringEx выравнивает стек на 4 байта при достижения конца строки или если подстрока не была найдена. Если подстрока найдена, то сохраняет указатель на первую подстроку в строке в регистре AX.

Параметры:

  1. Указатель на строку, завершающуюся (\0) или 0.
  2. Указатель на подстроку, завершающуюся (\0) или 0.

Возвращаемое значение:

  • Если подстрока найдена:

____AX: Указатель на первое вхождение подстроки в строке.
____CF = 0.

  • Если подстрока не найдена или один из указателей равен 0:

____AX = 8000h.
____CF = 1.

Состояние флагов:

  • Функция влияет на флаг CF.

Особенности:

  • Поиск завершается при достижении конца строки (\0) или 0.

  • Если подстрока не найдена или один из указателей равен 0, функция возвращает 8000h и устанавливает CF = 1.

  • Функция не изменяет значения регистров, кроме AX и флага CF.

ПРИМЕР 1:

  1. title Автор: Довгополов Евгений Сергеевич
  2. .286C
  3. .model small
  4. .stack 100h
  5. data segment public
  6. ____string db "Привет, мой мир!\0"
  7. ____substr db "мой\0"
  8. data ends
  9. code segment public
  10. ____assume _ds:data, cs:code
  11. ____include Handyfar.inc_________; Подключаем файл с функциями
  12. ____include Handymac.inc_________; Подключаем файл с макросами
  13. ____main proc
  14. ________call____SetDataSegment___; Вызываем процедуру SetDataSegment
  15. ________pushs___es:[substr]______; Ложим на вершину стека адрес переменной substr
  16. ________pushs___ds:[string]______; Ложим на вершину стека адрес переменной string
  17. ________call____FindSubStringEx__; Вызываем процедуру FindSubStringEx(string, substr)
  18. ________push____ax_______________; Ложим на вершину стека значение регистра ax
  19. ________call____WriteStringEx____; Вызываем процедуру WriteStringEx(значение из стека)
  20. ________push____0________________; Ложим на вершину стека байтовое значение кода возврата
  21. ________call____ExitProcessEx____; Вызываем процедуру ExitProcess(0)
  22. ____main endp
  23. code ends
  24. end main

ПРИМЕР 2:

С помощью цикла можно вывести все вхождения определённой подстроки.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .286C
  3. .model small
  4. .stack 100h
  5. data segment public
  6. ____string db "Привет, мой мир, мой рай!\0"
  7. ____substr db "мой\0"
  8. data ends
  9. code segment public
  10. ____assume _ds:data, cs:code
  11. ____include Handyfar.inc_________; Подключаем файл с функциями
  12. ____include Handymac.inc_________; Подключаем файл с макросами
  13. ____main proc
  14. ________call____SetDataSegment___; Вызываем процедуру SetDataSegment
  15. ________pushs___es:[substr]______; Ложим на вершину стека адрес переменной substr
  16. ________pushs___ds:[string]______; Ложим на вершину стека адрес переменной string
  17. ____MainLoop:
  18. ________call____FindSubStringEx__; Вызываем процедуру FindSubStringEx(string, substr)
  19. ________jc______Done_____________; Если CF=1, то прыгаем на метку Done
  20. ________call____WriteString______; Вызываем процедуру WriteString(ax)
  21. ________call____PrintNewLine_____; Вызываем процедуру PrintNewLine
  22. ________jmp_____MainLoop_________; Выполняем безусловный переход на метку MainLoop
  23. ____Done:
  24. ________push____0________________; Ложим на вершину стека байтовое значение кода возврата
  25. ________call____ExitProcessEx____; Вызываем процедуру ExitProcess(0)
  26. ____main endp
  27. code ends
  28. end main
Made on
Tilda