ХАНДЫФАР

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

Параметры:

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

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

  • CX: Общее количество элементов в первом массиве после копирования.

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

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

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

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

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____array1__dw__1111h, 2222h, 3333h, 4444h
  6. ____arrlen1 equ ($-array1) / 2
  7. ____________dw__10 dup(0)
  8. ____array2__dw__5555h, 6666h, 7777h
  9. ____________dw__8888h, 9999h
  10. ____arrlen2 equ ($-array2) / 2
  11. ____output__db__"Массив: \0"
  12. ____fmtout _db__"[%h] \0"
  13. data ends
  14. code segment public
  15. ____assume _ds:data, cs:code
  16. ____include Handyfar.inc
  17. ____include Handymac.inc
  18. ____main proc
  19. ________call____SetDataSegment
  20. ________mov_____dx, arrlen2
  21. ________mov_____cx, arrlen1
  22. ________lea_____bx, es:[array2]
  23. ________lea_____ax, ds:[array1]
  24. ________call____ArrayConcatenate
  25. ________lea_____ax, ds:[output]
  26. ________call____WriteString
  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
Функция ArrayConcatenate копирует элементы второго массива в конец первого массива.

Параметры:

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

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

  • CX: Общее количество элементов в первом массиве после копирования.

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

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

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

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

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____array1__dw__1111h, 2222h, 3333h, 4444h
  6. ____arrlen1 equ ($-array1) / 2
  7. ____________dw__10 dup(0)
  8. ____array2__dw__5555h, 6666h, 7777h, 8888h, 9999h
  9. ____arrlen2 equ ($-array2) / 2
  10. ____output__db__"Массив: \0"
  11. ____fmtout _db__"[%h] \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 _____________________; Начало процедуры main
  18. ________call____SetDataSegment_____; Вызываем процедуру SetDataSegment
  19. ________mov_____dx, arrlen2________; Копируем значение переменной arrlen2 в регистр dx
  20. ________mov_____cx, arrlen1________; Копируем значение переменной arrlen1 в регистр cx
  21. ________lea_____bx, es:[array2]____; Загружаем адрес переменной array2 в регистр es:bx
  22. ________lea_____ax, ds:[array1]____; Загружаем адрес переменной array1 в регистр ds:ax
  23. ________call____ArrayConcatenate___; Вызываем процедуру ArrayConcatenate(ds:ax, es:bx, cx, dx) := CX
  24. ________lea_____ax, ds:[output]____; Загружаем адрес переменной output в регистр ds:ax
  25. ________call____WriteString________; Вызываем процедуру WriteString(ax:output)
  26. ____PrintArrayLoop:
  27. ________push____word ptr[si]_______; 2-й: Сохраняем значение регистра si в стеке
  28. ________lea_____ax, ds:[fmtout]____; 1-й: Загружаем адрес строки формата fmtout в регистр ds:ax
  29. ________call____PrintFormatString__; Вызываем процедуру PrintFormatString(ax:fmtout, si)
  30. ________add_____sp, 2______________; Выравниваем стек
  31. ________incw____si_________________; Вызываем макрос incw. Увеличиваем индекс si на 2
  32. ________loop____PrintArrayLoop_____; Выполняем цикл пока CX≠0
  33. ________xor_____al, al_____________; Обнуляем регистр al
  34. ________call____ExitProcess________; Вызываем процедуру ExitProcess
  35. ____main endp _____________________; Конец процедуры main
  36. code ends _________________________; Конец сегмента кода
  37. end main __________________________; Конец файла. Точкой входа указывается процедура main
Made on
Tilda