ХАНДЫФАР

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

Параметры:

  • DS:AX: Указатель на строку, завершающуюся (\0) или 0.
  • ES:BX: Указатель на подстроку, завершающуюся (\0).

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

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

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

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

____AX = 8000h.
____CF = 1.

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

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

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

  • Функция выполняет поиск подстроки в строке, начиная с указателя AX.

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

  • Если подстрока найдена, возвращается указатель на её первое вхождение.

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

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

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____string_db "Привет, мой мир!\0"
  6. ____substr_db "мой\0"
  7. data ends
  8. code segment public
  9. ____assume _ds:data, cs:code
  10. ____include Handyfar.inc
  11. ____main proc
  12. ________call____SetDataSegment
  13. ________lea_____bx, es:[substr]
  14. ________lea_____ax, ds:[string]
  15. ________call____FindSubString
  16. ________call____WriteString
  17. ________xor_____al, al
  18. ________call____ExitProcess
  19. ____main endp
  20. code ends
  21. end main

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

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____string_db "Привет, мой мир, мой "
  6. ___________db "рай!\0"
  7. ____substr_db "мой\0"
  8. data ends
  9. code segment public
  10. ____assume _ds:data, cs:code
  11. ____include Handyfar.inc
  12. ____main proc
  13. ________call____SetDataSegment
  14. ________lea_____ax, ds:[substr]
  15. ________call____StringLength
  16. ________mov_____cx, ax
  17. ________lea_____bx, es:[substr]
  18. ________lea_____ax, ds:[string]
  19. ____MainLoop:
  20. ________call____FindSubString
  21. ________jc______Done
  22. ________call____WriteString
  23. ________call____PrintNewLine
  24. ________add_____ax, cx
  25. ________jmp_____MainLoop
  26. ____Done:
  27. ________xor_____al, al
  28. ________call____ExitProcess
  29. ____main endp
  30. code ends
  31. end main
Функция FindSubString выполняет поиск подстроки в строке, завершающейся (\0) или 0. Если подстрока найдена, возвращается указатель на её первое вхождение в строке. Если подстрока не найдена или один из указателей равен 0, функция возвращает 0 и устанавливает флаг CF = 1.

Параметры:

  • DS:AX: Указатель на строку, завершающуюся (\0) или 0.
  • ES:BX: Указатель на подстроку, завершающуюся (\0).

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

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

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

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

____AX = 8000h.
____CF = 1.

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

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

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

  • Функция выполняет поиск подстроки в строке, начиная с указателя AX.

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

  • Если подстрока найдена, возвращается указатель на её первое вхождение.

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

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

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____string_db "Привет, мой мир!\0"
  6. ____substr_db "мой\0"
  7. data ends
  8. code segment public _____________; Начало сегмента кода
  9. ____assume _ds:data, cs:code
  10. ____include Handyfar.inc_________; Подключаем файл с функциями
  11. ____main proc ___________________; Начало процедуры main
  12. ________call____SetDataSegment___; Вызываем процедуру SetDataSegment
  13. ________lea_____bx, es:[substr]__; Загружаем адрес переменной substr в регистр es:bx
  14. ________lea_____ax, ds:[string]__; Загружаем адрес переменной string в регистр ds:ax
  15. ________call____FindSubString____; Вызываем процедуру FindSubString(ax:string, bx:substr)
  16. ________call____WriteString______; Вызываем процедуру WriteString(ax)
  17. ________xor_____al, al___________; Обнуляем регистр al
  18. ________call____ExitProcess______; Вызываем процедуру ExitProcess
  19. ____main endp ___________________; Конец процедуры main
  20. code ends _______________________; Конец сегмента кода
  21. end main ________________________; Конец файла. Точкой входа указывается процедура main

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

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____string_db "Привет, мой мир, мой рай!\0"
  6. ____substr_db "мой\0"
  7. data ends
  8. code segment public _____________; Начало сегмента кода
  9. ____assume _ds:data, cs:code
  10. ____include Handyfar.inc_________; Подключаем файл с функциями
  11. ____main proc ___________________; Начало процедуры main
  12. ________call____SetDataSegment___; Вызываем процедуру SetDataSegment
  13. ________lea_____ax, ds:[substr]__; Загружаем адрес переменной substr в регистр ds:ax
  14. ________call____StringLength_____; Вызываем процедуру StringLength(ax:substr) := AX
  15. ________mov_____cx, ax___________; Сохраняем значение регистра ax в регистре cx
  16. ________lea_____bx, es:[substr]__; Загружаем адрес переменной substr в регистр es:bx
  17. ________lea_____ax, ds:[string]__; Загружаем адрес переменной string в регистр ds:ax
  18. ____MainLoop:
  19. ________call____FindSubString____; Вызываем процедуру FindSubString(ax:string, bx:substr) := CF
  20. ________jc______Done_____________; Если CF=1, то прыгаем на метку Done
  21. ________call____WriteString______; Вызываем процедуру WriteString(ax)
  22. ________call____PrintNewLine_____; Вызываем процедуру PrintNewLine
  23. ________add_____ax, cx___________; Увеличиваем указатель на длину подстроки substr
  24. ________jmp_____MainLoop_________; Выполняем безусловный переход на метку MainLoop
  25. ____Done:
  26. ________xor_____al, al___________; Обнуляем регистр al
  27. ________call____ExitProcess______; Вызываем процедуру ExitProcess
  28. ____main endp ___________________; Конец процедуры main
  29. code ends _______________________; Конец сегмента кода
  30. end main ________________________; Конец файла. Точкой входа указывается процедура main
Made on
Tilda