Функция
ArrayCopyIf копирует элементы из первого массива во второй массив на основании условия, заданного пользовательской функцией, переданной через указатель. Если размер массива DX = 0, функция завершает работу без изменений. Пользовательская функция обязана сохранять регистры AX, BX, DX, SI и DI в стеке.
Параметры:- DS:AX: Указатель на первый массив (источник).
- ES:BX: Указатель на второй массив (назначение).
- CX: ___Указатель на пользовательскую функцию, которая определяет, должен ли элемент быть скопирован.
- DX: ___Размер массива (количество элементов). Если DX = 0, функция завершает работу.
Возвращаемое значение:- CX: Количество скопированных элементов во втором массиве.
Состояние флагов:- Функция не изменяет состояние флагов.
Особенности:- Функция проходит по первому массиву и копирует элементы во второй массив, если они удовлетворяют условию, заданному пользовательской функцией.
- Пользовательская функция должна возвращать ZF=1, если элемент должен быть скопирован, и ZF=0, если нет.
- Если размер массива DX = 0, функция завершает работу и возвращает CX = 0.
- Функция не изменяет значения регистров, кроме CX.
- title Автор: Довгополов Евгений Сергеевич
- .model small
- .stack 100h
- data segment public
- ____array__dw _1, 2, 3, 4, 5, 7, 8, 9, 10
- ____arrlen equ ($-array) / 2
- ____buffer_dw _arrlen dup(?)
- ____fmtout db__"[%d] \0"
- data ends
- code segment public
- ____assume _ds:data, cs:code
- ____include Handyfar.inc
- ____include Handymac.inc
- ____main proc
- ________call____SetDataSegment
- ________mov_____dx, arrlen
- ________lea_____cx, IsDivBy2
- ________lea_____bx, es:[buffer]
- ________lea_____ax, ds:[array]
- ________call____ArrayCopyIf
- ________lea_____bx, ds:[buffer]
- ________xor_____si, si
- ____PrintArrayLoop:
- ________push____word ptr[bx+si]
- ________lea_____ax, ds:[fmtout]
- ________call____PrintFormatString
- ________add_____sp, 2
- ________incw____si
- ________loop____PrintArrayLoop
- ________xor_____al, al
- ________call____ExitProcess
- ____main endp
- ____IsDivBy2 proc
- ________push____ax
- ________push____bx
- ________push____dx
- ________mov_____bx, 2
- ________cwd
- ________idiv____bx
- ________test____dl, dl
- ________pop____dx
- ________pop____bx
- ________pop____ax
- ________ret
- ____IsDivBy2 endp
- code ends
- end main