ХАНДЫФАР

Функция ArrayConcatenateEx копирует элементы второго массива в конец первого массива. Функция ArrayConcatenateEx автоматически выравнивает стек на 8 байт.

Параметры:

  1. Указатель на первый массив.
  2. Указатель на второй массив.
  3. Размер первого массива (количество элементов).
  4. Размер второго массива (количество элементов).

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

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

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

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

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

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

  1. title Автор: Довгополов Евгений Сергеевич
  2. .286C
  3. .model small
  4. .stack 100h
  5. data segment public
  6. ____array1__dw__1, 2, 3, 4
  7. ____arrlen1 equ ($-array1) / 2
  8. ____________dw__10 dup(0)
  9. ____array2__dw__5, 6, 7, 8, 9
  10. ____arrlen2 equ ($-array2) / 2
  11. ____output _db _"Массив: \0"
  12. ____fmtout__db _"[%d] \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. ________push____arrlen2
  21. ________push____arrlen1
  22. ________pushs___es:[array2]
  23. ________pushs___ds:[array1]
  24. ________call____ArrayConcatenateEx
  25. ________pushs___ds:[output]
  26. ________call____WriteStringEx
  27. ________leabx___ds:[array1]
  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
Функция ArrayConcatenateEx копирует элементы второго массива в конец первого массива. Функция ArrayConcatenateEx автоматически выравнивает стек на 8 байт.

Параметры:

  1. Указатель на первый массив.
  2. Указатель на второй массив.
  3. Размер первого массива (количество элементов).
  4. Размер второго массива (количество элементов).

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

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

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

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

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

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

  1. title Автор: Довгополов Евгений Сергеевич
  2. .286C
  3. .model small
  4. .stack 100h
  5. data segment public
  6. ____array1__dw__1, 2, 3, 4
  7. ____arrlen1 equ ($-array1) / 2
  8. ____________dw__10 dup(0) ; Добавляем 10 слов что бы вместить array2
  9. ____array2__dw__5, 6, 7, 8, 9
  10. ____arrlen2 equ ($-array2) / 2
  11. ____output _db _"Массив: \0"
  12. ____fmtout__db _"[%d] \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______; Вызываем процедуру SetDataSegment
  20. ________push____arrlen2_____________; 4-й: Ложим на вершину стека длину массива array2
  21. ________push____arrlen1_____________; 3-й: Ложим на вершину стека длину массива array1
  22. ________pushs___es:[array2]_________; 2-й: Ложим на вершину стека адрес массива array2
  23. ________pushs___ds:[array1]_________; 1-й: Ложим на вершину стека адрес массива array1
  24. ________call____ArrayConcatenateEx__; Вызываем процедуру ArrayConcatenateEx(arr1, arr2, 4, 5) := CX
  25. ________pushs___ds:[output]_________; Ложим на вершину стека адрес переменной output
  26. ________call____WriteStringEx_______; Вызываем процедуру WriteStringEx(output)
  27. ________leabx___ds:[array1]_________; Загружаем адрес массива array1 в регистр ds:bx
  28. ________xor_____si, si______________; Обнуляем регистр-индекс
  29. ____PrintArrayLoop:
  30. ________push____word ptr[bx+si]_____; 2-й: Ложим на вершину стека значение в bx под индексом si
  31. ________leaax___ds:[fmtout]_________; 1-й: Загружаем адрес строки формата fmtout в регистр ds:ax
  32. ________call____PrintFormatString___; Вызываем процедуру PrintFormatString(ax:fmtout, bx)
  33. ________add_____sp, 2_______________; Выравниваем стек
  34. ________incw____si__________________; Увеличиваем индекс si на 2
  35. ________loop____PrintArrayLoop______; Выполняем цикл пока регистр cx не равен 0
  36. ________push____0___________________; Ложим на вершину стека байтовое значение кода возврата
  37. ________call____ExitProcessEx_______; Вызываем процедуру ExitProcess(0)
  38. ____main endp
  39. code ends
  40. end main
Made on
Tilda