ХАНДЫФАР

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

Функция FindCharEx выравнивает стек на 4 байта и сохраняет указатель на первый найденный символ в строке на вершине стека и в регистре AX при достижения конца строки или если символ не был найден. Это сделано для того чтобы иметь возможность вызвать функцию WriteString или WriteStringEx сразу после вызова функции FindCharEx. Если после вызова функции FindCharEx для вывода строки используется функция WriteString, то выравнивание стека лежит на программисте. Для того чтобы выровнять стек на 4 байта, после вызова функции WriteString нужно написать следующую команду: add sp, 4.

Параметры:

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

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

  • Если символ найден:

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

  • Если символ не найден:

____AX = 8000h.
____CF = 1.

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

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

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

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

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

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

ПРИМЕР 1:

  1. title Автор: Довгополов Евгений Сергеевич
  2. .286C
  3. .model small
  4. .stack 100h
  5. data segment public
  6. ____string db "Довгополов Евгений "
  7. ___________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. ________push____'Е'
  16. ________pushs___ds:[string]
  17. ________call____FindCharEx
  18. ________call____WriteString
  19. ________push____0
  20. ________call____ExitProcessEx
  21. ____main endp
  22. code ends
  23. end main

ПРИМЕР 2:

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

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

Функция FindCharEx выравнивает стек на 4 байта и сохраняет указатель на первый найденный символ в строке на вершине стека и в регистре AX при достижения конца строки или если символ не был найден. Это сделано для того чтобы иметь возможность вызвать функцию WriteString или WriteStringEx сразу после вызова функции FindCharEx. Если после вызова функции FindCharEx для вывода строки используется функция WriteString, то выравнивание стека лежит на программисте. Для того чтобы выровнять стек на 4 байта, после вызова функции WriteString нужно написать следующую команду: add sp, 4.

Параметры:

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

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

  • Если символ найден:

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

  • Если символ не найден:

____AX = 8000h.
____CF = 1.

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

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

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

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

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

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

ПРИМЕР 1:

  1. title Автор: Довгополов Евгений Сергеевич
  2. .286C
  3. .model small
  4. .stack 100h
  5. data segment public
  6. ____string db "Довгополов Евгений Сергеевич!\0"
  7. data ends
  8. code segment public
  9. ____assume _ds:data, cs:code
  10. ____include Handyfar.inc________; Подключаем файл с функциями
  11. ____include Handymac.inc________; Подключаем файл с макросами
  12. ____main proc
  13. ________call____SetDataSegment__; Вызываем процедуру SetDataSegment
  14. ________push____'Е'_____________; Ложим на вершину стека символ 'Е'
  15. ________pushs___ds:[string]_____; Ложим на вершину стека адрес переменной string
  16. ________call____FindCharEx______; Вызываем процедуру FindCharEx(string, 'Е')
  17. ________call____WriteString_____; Вызываем процедуру WriteString(ax:string)
  18. ________push____0_______________; Ложим на вершину стека байтовое значение кода возврата
  19. ________call____ExitProcessEx___; Вызываем процедуру ExitProcess(0)
  20. ____main endp
  21. code ends
  22. end main

ПРИМЕР 2:

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

  1. title Автор: Довгополов Евгений Сергеевич
  2. .286C
  3. .model small
  4. .stack 100h
  5. data segment public
  6. ____string db "Ирис, словно небесный посланник, раскрывает свои бархатные лепестки.\0"
  7. data ends
  8. code segment public
  9. ____assume _ds:data, cs:code
  10. ____include Handyfar.inc________; Подключаем файл с функциями
  11. ____include Handymac.inc________; Подключаем файл с макросами
  12. ____main proc
  13. ________call____SetDataSegment__; Вызываем процедуру SetDataSegment
  14. ________push____'и'_____________; Ложим на вершину стека символ 'и'
  15. ________pushs___ds:[string]_____; Ложим на вершину стека адрес переменной string
  16. ____MainLoop:
  17. ________call____FindCharEx______; Вызываем процедуру FindCharEx(string, 'и')
  18. ________jc______Done____________; Если CF=1, то прыгаем на метку Done
  19. ________call____WriteString_____; Вызываем процедуру WriteString(ax)
  20. ________call____PrintNewLine____; Вызываем процедуру PrintNewLine
  21. ________jmp_____MainLoop________; Выполняем безусловный переход на метку MainLoop
  22. ____Done:
  23. ________push____0_______________; Ложим на вершину стека байтовое значение кода возврата
  24. ________call____ExitProcessEx___; Вызываем процедуру ExitProcess(0)
  25. ____main endp
  26. code ends
  27. end main
Made on
Tilda