ХАНДЫФАР

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

Параметры:

  • DS:AX: Указатель на первый массив.
  • ES:BX: Указатель на второй массив.
  • DS:CX: Указатель на третий массив, в _______который будут объединены первые _______два массива.
  • SI: ___Длина первого массива. Если
_________SI = 0, функция завершает работу.
  • DI: ___Длина второго массива. Если
_________DI = 0, функция завершает работу.

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

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

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

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

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

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

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____arrayC _dw _4, 5, 2, 3
  6. ____arrClen equ ($-arrayC) / 2
  7. ____arrayD _dw _2, 6, 3, 1, 7, 8
  8. ____arrDlen equ ($-arrayD) / 2
  9. ____arrayB _dw__arrClen + arrDlen 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_____di, arrDlen
  19. ________mov_____si, arrClen
  20. ________lea_____cx, ds:[arrayB]
  21. ________lea_____bx, es:[arrayD]
  22. ________lea_____ax, ds:[arrayC]
  23. ________call____ArrayMergeSort
  24. ________lea_____si, ds:[arrayB]
  25. ____PrintArrayLoop:
  26. ________push____word ptr[si]
  27. ________lea_____ax, ds:[fmtout]
  28. ________call____PrintFormatString
  29. ________add_____sp, 2
  30. ________incw____si
  31. ________loop____PrintArrayLoop
  32. ________xor_____al, al
  33. ________call____ExitProcess
  34. ____main endp
  35. code ends
  36. end main
Функция ArrayMergeSort объединяет два массива в третий массив и сортирует его в порядке возрастания.

Параметры:

  • DS:AX: Указатель на первый массив.
  • ES:BX: Указатель на второй массив.
  • DS:CX: Указатель на третий массив, в который будут объединены первые два массива.
  • SI: ___Длина первого массива. Если SI = 0, функция завершает работу.
  • DI: ___Длина второго массива. Если DI = 0, функция завершает работу.

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

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

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

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

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

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

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____arrayC _dw _4, 5, 2, 3
  6. ____arrClen equ ($-arrayC) / 2
  7. ____arrayD _dw _2, 6, 3, 1, 7, 8
  8. ____arrDlen equ ($-arrayD) / 2
  9. ____arrayB _dw__arrClen + arrDlen 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 _____________________; Начало процедуры main
  17. ________call____SetDataSegment_____; Вызываем процедуру SetDataSegment
  18. ________mov_____di, arrDlen________; Копируем значение переменной arrDlen в регистр di
  19. ________mov_____si, arrClen________; Копируем значение переменной arrClen в регистр si
  20. ________lea_____cx, ds:[arrayB]____; Загружаем адрес переменной arrayB в регистр ds:cx
  21. ________lea_____bx, es:[arrayD]____; Загружаем адрес переменной arrayD в регистр es:bx
  22. ________lea_____ax, ds:[arrayC]____; Загружаем адрес переменной arrayC в регистр ds:ax
  23. ________call____ArrayMergeSort_____; Вызываем процедуру ArrayMergeSort(ax, bx, cx, si, di) := CX
  24. ________lea_____si, ds:[arrayB]____; Загружаем адрес переменной arrayB в регистр 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