ХАНДЫФАР

Функция ArrayMakeUnique копирует уникальные элементы из первого массива во второй массив.

Параметры:

  • DS:AX: Указатель на первый массив (источник).
  • ES:BX: Указатель на второй массив (назначение).
  • CX:____Длина первого массива (количество элементов). Если CX = 0, функция завершает работу.

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

  • CX: Количество уникальных элементов, скопированных из первого массива во второй массив.

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

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

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

  • Если элемент уже присутствует во втором массиве, он не копируется повторно.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____origin dw _7, 5, 8, 3, 7, 5, 6, 3, 8
  6. ___________dw _1, 9, 5
  7. ____arrlen equ ($-origin) / 2
  8. ____unique dw _arrlen dup(0)
  9. ____fmtout db _"[%d] \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. ________mov_____cx, arrlen
  18. ________lea_____bx, es:[unique]
  19. ________lea_____ax, ds:[origin]
  20. ________call____ArrayMakeUnique
  21. ____PrintArrayLoop:
  22. ________push____word ptr[bx]
  23. ________lea_____ax, ds:[fmtout]
  24. ________call____PrintFormatString
  25. ________add_____sp, 2
  26. ________incw____bx
  27. ________loop____PrintArrayLoop
  28. ________xor_____al, al
  29. ________call____ExitProcess
  30. ____main endp
  31. code ends
  32. end main
Функция ArrayMakeUnique копирует уникальные элементы из первого массива во второй массив.

Параметры:

  • DS:AX: Указатель на первый массив (источник).
  • ES:BX: Указатель на второй массив (назначение).
  • CX:____Длина первого массива (количество элементов). Если CX = 0, функция завершает работу.

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

  • CX: Количество уникальных элементов, скопированных из первого массива во второй массив.

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

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

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

  • Если элемент уже присутствует во втором массиве, он не копируется повторно.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____origin dw _7, 5, 8, 3, 7, 5, 6, 3, 8, 1, 9, 5
  6. ____arrlen equ ($-origin) / 2
  7. ____unique dw _arrlen dup(0)
  8. ____fmtout db _"[%d] \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 _____________________; Начало процедуры main
  15. ________call____SetDataSegment_____; Вызываем процедуру SetDataSegment
  16. ________mov_____cx, arrlen_________; Копируем длину массива origin в регистр cx
  17. ________lea_____bx, es:[unique]____; Загружаем адрес переменной unique в регистр es:bx
  18. ________lea_____ax, ds:[origin]____; Загружаем адрес переменной origin в регистр ds:ax
  19. ________call____ArrayMakeUnique____; Вызываем процедуру ArrayMakeUnique(ds:ax, es:bx, cx) := CX
  20. ____PrintArrayLoop:
  21. ________push____word ptr[bx]_______; 2-й: Сохраняем значение регистра bx(unique) в стеке
  22. ________lea_____ax, ds:[fmtout]____; 1-й: Загружаем адрес строки формата fmtout в регистр ds:ax
  23. ________call____PrintFormatString__; Вызываем процедуру PrintFormatString(ax:fmtout, bx)
  24. ________add_____sp, 2______________; Выравниваем стек
  25. ________incw____bx_________________; Вызываем макрос incw. Увеличиваем индекс bx на 2
  26. ________loop____PrintArrayLoop_____; Выполняем цикл пока CX≠0
  27. ________xor_____al, al_____________; Обнуляем регистр al
  28. ________call____ExitProcess________; Вызываем процедуру ExitProcess
  29. ____main endp _____________________; Конец процедуры main
  30. code ends _________________________; Конец сегмента кода
  31. end main __________________________; Конец файла. Точкой входа указывается процедура main
Made on
Tilda