ХАНДЫФАР

Функция ArraySort выполняет сортировку массива по возрастанию или по убыванию в зависимости от значения параметра CL.

Параметры:

  • DS:AX: Указатель на массив.
  • BX: ___Длина массива (количество элементов). Если BX = 0, функция завершает работу.
  • CL:____Режим сортировки:

Если CL = ASCENDING, массив сортируется по возрастанию.
Если CL = DESCENDING, массив сортируется по убыванию

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

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

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

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

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

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

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

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____array__dw__5, 5, 2, 6, 5, 10, 4, 2
  6. ___________dw__10, 0, 0, 1, 8, 2, 3, 9
  7. ___________dw__0, 7
  8. ____arrlen equ ($-array) / 2
  9. ____arrbuf dw__arrlen dup(0)
  10. ____fmtout db__"[%d] \0"
  11. data ends
  12. code segment public
  13. ____assume _ds:data, cs:code
  14. ____include Handyfar.inc
  15. ____include Handymac.inc
  16. ____main proc
  17. ________call____SetDataSegment
  18. ________mov_____cx, arrlen
  19. ________lea_____bx, es:[arrbuf]
  20. ________lea_____ax, ds:[array]
  21. ________call____ArrayMakeUnique
  22. ________xchg____bx, cx
  23. ________mov_____cl, DESCENDING
  24. ________lea_____ax, ds:[arrbuf]
  25. ________call____ArraySort
  26. ________lea_____si, ds:[arrbuf]
  27. ____PrintArrayLoop:
  28. ________push____word ptr[si]
  29. ________lea_____ax, ds:[fmtout]
  30. ________call____PrintFormatString
  31. ________add_____sp, 2
  32. ________incw____si
  33. ________loop____PrintArrayLoop
  34. ________xor_____al, al
  35. ________call____ExitProcess
  36. ____main endp
  37. code ends
  38. end main
Функция ArraySort выполняет сортировку массива по возрастанию или по убыванию в зависимости от значения параметра CL.

Параметры:

  • AX: Указатель на массив.
  • BX:_Длина массива (количество элементов). Если BX = 0, функция завершает работу.
  • CL:_Режим сортировки:

_______Если CL = ASCENDING, массив сортируется по возрастанию.
_______Если CL = DESCENDING, массив сортируется по убыванию

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

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

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

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

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

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

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

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____array__dw__5, 5, 2, 6, 5, 10, 4, 2, 10, 0, 0, 1, 8, 2, 3, 9, 0, 7
  6. ____arrlen equ ($-array) / 2
  7. ____arrbuf 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_________; Копируем длину массива array в регистр cx
  17. ________lea_____bx, es:[arrbuf]____; Загружаем адрес переменной arrbuf в регистр es:bx
  18. ________lea_____ax, ds:[array]_____; Загружаем адрес переменной array в регистр ds:ax
  19. ________call____ArrayMakeUnique____; Вызываем процедуру ArrayMakeUnique(ds:ax, es:bx, cx) := CX
  20. ________xchg____bx, cx_____________; Выполняем обмен значениями регистра cx с регистром bx
  21. ________mov_____cl, DESCENDING_____; Копируем значение DESCENDING в регистр cl
  22. ________lea_____ax, ds:[arrbuf]____; Загружаем адрес переменной arrbuf в регистр ds:ax
  23. ________call____ArraySort__________; Вызываем процедуру ArraySort(ds:ax, bx, cl)
  24. ________lea_____si, ds:[arrbuf]____; Загружаем адрес переменной arrbuf в регистр ds:si
  25. ____PrintArrayLoop:
  26. ________push____word ptr[si]_______; 2-й: Сохраняем значение регистра si в стеке
  27. ________lea_____ax, ds:[fmtout]____; 1-й: Загружаем адрес строки формата fmtout в регистр ds:ax
  28. ________call____PrintFormatString__; Вызываем процедуру PrintFormatString(ax:fmtout, si)
  29. ________add_____sp, 2______________; Выравниваем стек
  30. ________incw____si_________________; Вызываем макрос incw. Увеличиваем индекс si на 2
  31. ________loop____PrintArrayLoop_____; Выполняем цикл пока CX≠0
  32. ________xor_____al, al_____________; Обнуляем регистр al
  33. ________call____ExitProcess________; Вызываем процедуру ExitProcess
  34. ____main endp _____________________; Конец процедуры main
  35. code ends _________________________; Конец сегмента кода
  36. end main __________________________; Конец файла. Точкой входа указывается процедура main
Made on
Tilda