ХАНДЫФАР

Функция ArrayMergeSortEx объединяет два массива в третий массив и сортирует его в порядке возрастания. Функция ArrayMergeSortEx автоматически выравнивает стек на 12 байт.

Параметры:

  1. Указатель на первый массив.
  2. Указатель на второй массив.
  3. Указатель на третий массив, в который будут объединены первые два массива.
  4. Длина первого массива.
  5. Длина второго массива.
  6. ASCENDING = массив сортируется по возрастанию, DESCENDING = массив сортируется по убыванию

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

  • CX: Количество элементов в третьем массиве.

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

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

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

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

  1. title Автор: Довгополов Евгений Сергеевич
  2. .286C
  3. .model small
  4. .stack 100h
  5. data segment public
  6. ____arrayA__dw__4, 5, 2, 3
  7. ____arrAlen equ ($-arrayA) / 2
  8. ____arrayB__dw__2, 6, 3, 1, 7, 8
  9. ____arrBlen equ ($-arrayB) / 2
  10. ____arrayC__dw__arrAlen + arrBlen 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____DESCENDING
  20. ________push____arrBlen
  21. ________push____arrAlen
  22. ________pushs___ds:[arrayC]
  23. ________pushs___es:[arrayB]
  24. ________pushs___ds:[arrayA]
  25. ________call____ArrayMergeSortEx
  26. ________leabx___ds:[arrayC]
  27. ________xor_____si, si
  28. ____PrintArrayLoop:
  29. ________push____word ptr[bx+si]
  30. ________leaax___ds:[fmtout]
  31. ________call____PrintFormatString
  32. ________add_____sp, 2
  33. ________incw____si
  34. ________loop____PrintArrayLoop
  35. ________push____0
  36. ________call____ExitProcessEx
  37. ____main endp
  38. code ends
  39. end main
Функция ArrayMergeSortEx объединяет два массива в третий массив и сортирует его в порядке возрастания. Функция ArrayMergeSortEx автоматически выравнивает стек на 12 байт.

Параметры:

  1. Указатель на первый массив.
  2. Указатель на второй массив.
  3. Указатель на третий массив, в который будут объединены первые два массива.
  4. Длина первого массива.
  5. Длина второго массива.
  6. ASCENDING = массив сортируется по возрастанию, DESCENDING = массив сортируется по убыванию.

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

  • CX: Количество элементов в третьем массиве.

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

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

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

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

  1. title Автор: Довгополов Евгений Сергеевич
  2. .286C
  3. .model small
  4. .stack 100h
  5. data segment public
  6. ____arrayA__dw__4, 5, 2, 3
  7. ____arrAlen equ ($-arrayA) / 2
  8. ____arrayB__dw__2, 6, 3, 1, 7, 8
  9. ____arrBlen equ ($-arrayB) / 2
  10. ____arrayC__dw__arrAlen + arrBlen 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_____; Вызываем процедуру SetDataSegment
  19. ________push____DESCENDING_________; 6-й: Сортируем по убыванию
  20. ________push____arrBlen____________; 5-й: Ложим на вершину стека длину массива arrayB
  21. ________push____arrAlen____________; 4-й: Ложим на вершину стека длину массива arrayA
  22. ________pushs___ds:[arrayC]________; 3-й: Ложим на вершину стека адрес массива arrayC
  23. ________pushs___es:[arrayB]________; 2-й: Ложим на вершину стека адрес массива arrayB
  24. ________pushs___ds:[arrayA]________; 1-й: Ложим на вершину стека адрес массива arrayA
  25. ________call____ArrayMergeSortEx___; Вызываем процедуру ArrayMergeSortEx(aA, aB, aC, 4, 6, 1) := CX
  26. ________leabx___ds:[arrayC]________; Загружаем адрес массива arrayC в регистр ds:bx
  27. ________xor_____si, si_____________; Обнуляем регистр-индекс
  28. ____PrintArrayLoop:
  29. ________push____word ptr[bx+si]____; 2-й: Ложим на вершину стека значение в bx под индексом si
  30. ________leaax___ds:[fmtout]________; 1-й: Загружаем адрес строки формата fmtout в регистр ds:ax
  31. ________call____PrintFormatString__; Вызываем процедуру PrintFormatString(ax:fmtout, bx)
  32. ________add_____sp, 2______________; Выравниваем стек
  33. ________incw____si_________________; Увеличиваем индекс si на 2
  34. ________loop____PrintArrayLoop_____; Выполняем цикл пока регистр cx не равен 0
  35. ________push____0__________________; Ложим на вершину стека байтовое значение кода возврата
  36. ________call____ExitProcessEx______; Вызываем процедуру ExitProcess(0)
  37. ____main endp
  38. code ends
  39. end main
Made on
Tilda