Функция
FindCharEx выполняет поиск символа в строке, завершающейся (\0) или 0. Если символ найден, возвращается указатель на его первое вхождение. Если символ не найден или указатель на строку равен 0, функция возвращает FFFF и устанавливает флаг CF = 1.
Функция
FindCharEx выравнивает стек на 4 байта и сохраняет указатель на первый найденный символ в строке на вершине стека и в регистре
AX при достижения конца строки или если символ не был найден. Это сделано для того чтобы иметь возможность вызвать функцию
WriteString или
WriteStringEx сразу после вызова функции
FindCharEx. Если после вызова функции
FindCharEx для вывода строки используется функция
WriteString, то выравнивание стека лежит на программисте. Для того чтобы выровнять стек на 4 байта, после вызова функции
WriteString нужно написать следующую команду: add sp, 4.
Параметры:- Указатель на строку, завершающуюся (\0) или 0.
- Символ для поиска.
Возвращаемое значение:____AX: Указатель на первое вхождение символа в строке.
____CF = 0.
____AX = 8000h.
____CF = 1.
Состояние флагов:- Функция влияет на флаги CF.
Особенности:- Поиск завершается при достижении конца строки (\0) или 0.
- Если символ не найден или указатель на строку = 0, функция возвращает 8000h и устанавливает флаг CF = 1.
- Функция не изменяет значения регистров, кроме AX и флагов.
ПРИМЕР 1:
- title Автор: Довгополов Евгений Сергеевич
- .286C
- .model small
- .stack 100h
- data segment public
- ____string db "Довгополов Евгений "
- ___________db "Сергеевич!\0"
- data ends
- code segment public
- ____assume _ds:data, cs:code
- ____include Handyfar.inc
- ____include Handymac.inc
- ____main proc
- ________call____SetDataSegment
- ________push____'Е'
- ________pushs___ds:[string]
- ________call____FindCharEx
- ________call____WriteString
- ________push____0
- ________call____ExitProcessEx
- ____main endp
- code ends
- end main
ПРИМЕР 2:
С помощью цикла можно вывести все вхождения определённого символа.
- title Автор: Довгополов Евгений Сергеевич
- .286C
- .model small
- .stack 100h
- data segment public
- ____string db "Ирис, словно небесный "
- ___________db "посланник, раскрывает "
- ___________db "свои бархатные "
- ___________db "лепестки.\0"
- data ends
- code segment public
- ____assume _ds:data, cs:code
- ____include Handyfar.inc
- ____include Handymac.inc
- ____main proc
- ________call____SetDataSegment
- ________push____'и'
- ________pushs___ds:[string]
- ____MainLoop:
- ________call____FindCharEx
- ________jc______Done
- ________call____WriteString
- ________call____PrintNewLine
- ________jmp_____MainLoop
- ____Done:
- ________push____0
- ________call____ExitProcessEx
- ____main endp
- code ends
- end main