Найти среднее значение элементов массива - Assembler

Узнай цену своей работы

Формулировка задачи:

Листинг программы
  1. .model small
  2. .stack 100h
  3. .data
  4. array db 65000 dup (200)
  5. mas_len EQU ($ - array)
  6. string1 db "Srednee znachenie el-ov massiva: $"
  7. .code ;начало сегмента кода
  8. start:
  9. mov ax, @data ;инициализация сегмента данных
  10. mov ds, ax ;сохраняем адрес @data в регистре сегмента данных
  11. mov ah, 09h
  12. lea dx, string1
  13. int 21h
  14. lea si, array ;помещаем адрес начала массива в si
  15. mov cx, mas_len ;поместили длину массива в cx
  16. m:
  17. xor ax, ax
  18. mov al, [si] ax поместили то что лежит по адресу si(первый элемент)
  19. cwd
  20. add bx, ax bx положили ax
  21. inc si ;переход к след э-ту
  22. loop m
  23.  
  24. mov ax, bx
  25. mov bx, mas_len
  26. div bx
  27. ; --- Чтобы вывести число из ax нам нужно перевести его в десятичную систему -------
  28. ; --- счисления. -------
  29. ; --- Для этого мы будем делить его на 10 и записывать остаток в стек -------
  30. ; --- таким образом в стеке окажутся все цифры числа в обратном порядке. -------
  31. ; --- В строке 162 операция cwd применена для расширения операции деления -------
  32. ; --- так после применения этой операции частное от деления будет храниться -------
  33. ; --- в ax, а остаток в dx -------
  34. ; ----------------------------------------------------------------------------------
  35. xor cx,cx
  36. mov bx,10
  37. m1:
  38. xor dx,dx
  39. div bx
  40. ; Делим число на основание сс. В остатке получается последняя цифра.
  41. ; Сразу выводить её нельзя, поэтому сохраним её в стэке.
  42. push dx
  43. inc cx
  44. ; А с частным повторяем то же самое, отделяя от него очередную
  45. ; цифру справа, пока не останется ноль, что значит, что дальше
  46. ; слева только нули.
  47. test ax, ax
  48. jnz m1
  49. mov ah,2
  50. EndGet:
  51. pop dx ; собственно сам вывод на экран. по очереди c конца
  52. add dl, '0'
  53. ; цифры из стека(старшие разряду в начале мл. в конце)
  54. int 21h
  55. loop EndGet ; повторяем пока цифры не кончаться
  56. ; возвращаем в bx то что забрали
  57. mov ax, 4c00h
  58. mov dl, 0ah
  59. int 21h
  60. end start
нужно расширить вместимость программы для работы с указанным количеством элементов.

Решение задачи: «Найти среднее значение элементов массива»

textual
Листинг программы
  1.     mov bx, 0 ;результат сумирования будет в регистровой паре (di:bx)
  2.     mov di, 0
  3.     lea si, array
  4.     mov cx, mas_len
  5. @@For:
  6.     mov al, [si]
  7.     add si, 1 ;на размер элемента массива в байтах
  8.     cbw ;преобразуем байт из al в двойное слово в регистровой паре (dx:ax)
  9.     cwd
  10.     add bx, ax ;суммируем регистровые пары
  11.     adc di, dx
  12.     loop @@For

Объяснение кода листинга программы

  1. Устанавливается начальное значение счетчика суммы в 0 с помощью команды mov bx, 0, а также устанавливается начальное значение регистра di в 0 с помощью команды mov di, 0.
  2. Вычисляется адрес начала массива и сохраняется в регистре si с помощью команды lea si, array.
  3. Загружается длина массива в регистр cx с помощью команды mov cx, mas_len.
  4. Начинается цикл обработки элементов массива с помощью метки @@For.
  5. Загружается значение текущего элемента массива в регистр al из ячейки, адрес которой находится в регистре si.
  6. Увеличивается адрес в регистре si на размер элемента массива в байтах с помощью команды add si, 1.
  7. Производится расширение байта из регистра al в двойное слово в регистровой паре (dx:ax) с помощью команды cbw.
  8. Производится расширение слова из регистра ax в двойное слово в регистровой паре (dx:ax) с помощью команды cwd.
  9. Вычисляется сумма текущего элемента массива с текущим значением в регистровой паре (di:bx) и сохраняется в регистре bx с помощью команды add bx, ax, а также производится перенос в регистр di с помощью команды adc di, dx.
  10. Выполняется повторение цикла, уменьшая значение счетчика цикла в регистре cx с помощью команды loop @@For. Данный код вычисляет сумму элементов массива и сохраняет её в регистровой паре (di:bx) при условии, что элементы массива представляют собой 16-битные целые числа.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.333 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы