ХАНДЫФАР

Функция ArraySortEx выполняет сортировку массива по возрастанию или по убыванию в зависимости от значения второго параметра. ArraySortEx автоматически выравнивает стек на 6 байт.

Параметры:

  1. Указатель на массив.
  2. Длина массива (количество элементов).
  3. ASCENDING = массив сортируется по возрастанию, DESCENDING = массив сортируется по убыванию.

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

  • Функция не возвращает значение.

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

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

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

  • Функция сортирует массив на месте, используя алгоритм сортировки (например, пузырьковую сортировку).

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

  1. title Автор: Довгополов Евгений Сергеевич
  2. .286C
  3. .model small
  4. .stack 100h
  5. data segment public
  6. ____array _dw__5, 5, 2, 6, 5, 10, 4, 2
  7. ___________dw__10, 0, 0, 1, 8, 2, 3, 9
  8. ___________dw__0, 7
  9. ____arrlen equ_($-array) / 2
  10. ____arrbuf dw__arrlen dup(0)
  11. ____fmtout db__"[%d] \0"
  12. data ends
  13. code segment public
  14. ____assume _ds:data, cs:code
  15. ____include Handyfar.inc
  16. ____include Handymac.inc
  17. ____main proc
  18. ________call____SetDataSegment
  19. ________push____arrlen
  20. ________pushs___es:[arrbuf]
  21. ________pushs___ds:[array]
  22. ________call____ArrayMakeUniqueEx
  23. ________push____DESCENDING
  24. ________push____cx
  25. ________pushs___ds:[arrbuf]
  26. ________call____ArraySortEx
  27. ________leabx___ds:[arrbuf]
  28. ________xor_____si, si
  29. ____PrintArrayLoop:
  30. ________push____word ptr[bx+si]
  31. ________leaax___ds:[fmtout]
  32. ________call____PrintFormatString
  33. ________add_____sp, 2
  34. ________incw____si
  35. ________loop____PrintArrayLoop
  36. ________push____0
  37. ________call____ExitProcessEx
  38. ____main endp
  39. code ends
  40. end main
Функция ArraySortEx выполняет сортировку массива по возрастанию или по убыванию в зависимости от значения второго параметра. ArraySortEx автоматически выравнивает стек на 6 байт.

Параметры:

  1. Указатель на массив.
  2. Длина массива (количество элементов).
  3. ASCENDING = массив сортируется по возрастанию, DESCENDING = массив сортируется по убыванию.

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

  • Функция не возвращает значение.

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

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

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

  • Функция сортирует массив на месте, используя алгоритм сортировки (например, пузырьковую сортировку).

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

  1. title Автор: Довгополов Евгений Сергеевич
  2. .286C
  3. .model small
  4. .stack 100h
  5. data segment public
  6. ____array _dw__5, 5, 2, 6, 5, 10, 4, 2, 10, 0, 0, 1, 8, 2, 3, 9, 0, 7
  7. ____arrlen equ_($-array) / 2
  8. ____arrbuf 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_____; Вызываем процедуру SetDataSegment
  17. ________push____arrlen_____________; 3-й: Ложим на вершину стека длину массива
  18. ________pushs___es:[arrbuf]________; 2-й: Ложим на вершину стека длину массива arrbuf
  19. ________pushs___ds:[array]_________; 1-й: Ложим на вершину стека адрес массива array
  20. ________call____ArrayMakeUniqueEx__; Вызываем процедуру ArrayMakeUniqueEx(array, arrbuf, 18) := CX
  21. ________push____DESCENDING_________; 3-й: Сортируем по убыванию
  22. ________push____cx_________________; 2-й: Ложим на вершину стека длину массива
  23. ________pushs___ds:[arrbuf]________; 1-й: Ложим на вершину стека длину массива arrbuf
  24. ________call____ArraySortEx________; Вызываем процедуру ArraySortEx(arrbuf, cx, DESCENDING)
  25. ________leabx___ds:[arrbuf]________; Загружаем адрес массива arrbuf в регистр ds:bx
  26. ________xor_____si, si_____________; Обнуляем регистр-индекс
  27. ____PrintArrayLoop:
  28. ________push____word ptr[bx+si]____; 2-й: Ложим на вершину стека значение в bx под индексом si
  29. ________leaax___ds:[fmtout]________; 1-й: Загружаем адрес строки формата fmtout в регистр ds:ax
  30. ________call____PrintFormatString__; Вызываем процедуру PrintFormatString(ax:fmtout, bx)
  31. ________add_____sp, 2______________; Выравниваем стек
  32. ________incw____si_________________; Увеличиваем индекс si на 2
  33. ________loop____PrintArrayLoop_____; Выполняем цикл пока регистр cx не равен 0
  34. ________push____0__________________; Ложим на вершину стека байтовое значение кода возврата
  35. ________call____ExitProcessEx______; Вызываем процедуру ExitProcess(0)
  36. ____main endp
  37. code ends
  38. end main
Made on
Tilda