Посчитать сумму всех элементов двумерного массива и найти медиану (среднее арифметическое) - Assembler

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

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

Здравствуйте. Не получается вывод вывод для двухбайтового массива. Скажите, пожалуйста, где ошибка в коде. Вот само задание: Посчитать сумму всех элементов двумерного массива и найти медиану (среднее арифметическое) а) элементы массива однобайтовые; б) элементы массива двухбайтовые.
Листинг программы
  1. .model small
  2. .stack 100h
  3. .data
  4. Mas dw 1, 4, -6, 0 ;статический двумерный массив 4х4
  5. dw 0, -5, -11, 2 ;тогда длина массива = 16
  6. dw 32, 8, -2, 9 ;сумма 55
  7. dw 2, 17, 5, -1
  8. len db 16 ;счетчик кол-ва элементов массива
  9. med db 0
  10. msg db 'Mediana massiva: ',10,13, '$'
  11. .code
  12. main:
  13. mov ax, @data ;ds = сегмент .data
  14. mov ds, ax
  15. mov ah,9
  16. mov dx,OFFSET msg
  17. int 21h
  18. lea bx,mas
  19. mov cx, 16 ;сх = len mas
  20. xor ax,ax
  21. cycl:
  22. add ax,[bx]
  23. inc bx
  24. loop cycl
  25. div len
  26. mov ah,0 ;вывод целого числа
  27. aam
  28. add ax,3030h
  29. mov dl,ah
  30. mov dh,al
  31. mov ah,02
  32. int 21h
  33. mov dl,dh
  34. int 21h
  35. end main

Решение задачи: «Посчитать сумму всех элементов двумерного массива и найти медиану (среднее арифметическое)»

textual
Листинг программы
  1. .model small
  2. .stack 100h
  3. .data
  4.  
  5. Mas dw 1, 4, -6, 0    ; массив 4х4
  6.     dw 0, -5, -11, 2  ; длина массива = 16
  7.     dw 32, 8, -2, 9   ;сумма 55
  8.     dw 2, 17, 5, -1
  9. len db 16 ;счетчик кол-ва элементов массива
  10. med db 0
  11. msg db 'Mediana massiva: ',10,13, '$'
  12.  
  13. .code
  14. ; выводит число из регистра AX на экран
  15. ; входные данные:
  16. ; ax - число для отображения
  17. Show_AX proc
  18.         push    ax
  19.         push    bx
  20.         push    cx
  21.         push    dx
  22.         push    di
  23.  
  24.         mov     cx, 10
  25.         xor     di, di          ; di - кол. цифр в числе
  26.  
  27.         ; если число в ax отрицательное, то
  28.         ;1) напечатать '-'
  29.         ;2) сделать ax положительным
  30.         or      ax, ax
  31.         jns     @@Conv
  32.         push    ax
  33.         mov     dx, '-'
  34.         mov     ah, 2           ; ah - функция вывода символа на экран
  35.         int     21h
  36.         pop     ax
  37.  
  38.         neg     ax
  39.  
  40. @@Conv:
  41.         xor     dx, dx
  42.         div     cx              ; dl = num mod 10
  43.         add     dl, '0'         ; перевод в символьный формат
  44.         inc     di
  45.         push    dx              ; складываем в стэк
  46.         or      ax, ax
  47.         jnz     @@Conv
  48.         ; выводим из стэка на экран
  49. @@Show:
  50.         pop     dx              ; dl = очередной символ
  51.         mov     ah, 2           ; ah - функция вывода символа на экран
  52.         int     21h
  53.         dec     di              ; повторяем пока di<>0
  54.         jnz     @@Show
  55.  
  56.         pop     di
  57.         pop     dx
  58.         pop     cx
  59.         pop     bx
  60.         pop     ax
  61.         ret
  62. Show_AX endp
  63.  
  64. main:
  65.     mov ax, @data ;ds = сегмент .data
  66.     mov ds, ax
  67.  
  68.     mov ah,9
  69.     mov dx,OFFSET msg
  70.     int 21h
  71.  
  72.     lea bx,mas
  73.     mov cl, len ;сх = len mas
  74.     mov ch,0
  75.     xor ax,ax
  76. cycl:
  77.     add ax,[bx]
  78.     add bx,2
  79.     loop cycl
  80.  
  81.     idiv    len
  82.     mov ah,0
  83.         cbw
  84.     call    Show_AX
  85.     mov ax, 4C00h
  86.     int 21h
  87. end main

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

  1. В начале объявляется модель памяти, ее размер и начальный адрес, а также ранее обозначенные переменные:
    • .model small - объявление модели памяти
    • .stack 100h - размер стека
    • Mas dw 1, 4, -6, 0 - массив 4x4 с элементами 1, 4, -6, 0
    • len db 16 - количество элементов массива
    • med db 0 - переменная для хранения медианы
    • msg db 'Mediana massiva: ',10,13, '$' - сообщение для вывода на экран
  2. Затем идет процедура вывода числа из регистра AX на экран:
    • Show_AX proc - объявление процедуры
    • Содержит логику для вывода числа в символьном формате
  3. Далее идет основная часть программы:
    • main: - объявление метки для основной части программы
    • Загрузка сегментного регистра DS и адреса переменных
    • Вывод сообщения Mediana massiva: на экран
    • Инициализация регистра BX для обращения к массиву
    • Использование цикла для подсчета суммы всех элементов массива
    • Деление суммы на количество элементов и вывод результата (медианы) на экран
    • Завершение программы инструкцией int 21h

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


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

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

14   голосов , оценка 3.857 из 5

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

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

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