Посчитать сумму всех элементов двумерного массива и найти медиану (среднее арифметическое) - Assembler
Формулировка задачи:
Здравствуйте. Не получается вывод вывод для двухбайтового массива. Скажите, пожалуйста, где ошибка в коде.
Вот само задание:
Посчитать сумму всех элементов двумерного массива и найти медиану (среднее арифметическое)
а) элементы массива однобайтовые;
б) элементы массива двухбайтовые.
Листинг программы
- .model small
- .stack 100h
- .data
- Mas dw 1, 4, -6, 0 ;статический двумерный массив 4х4
- dw 0, -5, -11, 2 ;тогда длина массива = 16
- dw 32, 8, -2, 9 ;сумма 55
- dw 2, 17, 5, -1
- len db 16 ;счетчик кол-ва элементов массива
- med db 0
- msg db 'Mediana massiva: ',10,13, '$'
- .code
- main:
- mov ax, @data ;ds = сегмент .data
- mov ds, ax
- mov ah,9
- mov dx,OFFSET msg
- int 21h
- lea bx,mas
- mov cx, 16 ;сх = len mas
- xor ax,ax
- cycl:
- add ax,[bx]
- inc bx
- loop cycl
- div len
- mov ah,0 ;вывод целого числа
- aam
- add ax,3030h
- mov dl,ah
- mov dh,al
- mov ah,02
- int 21h
- mov dl,dh
- int 21h
- end main
Решение задачи: «Посчитать сумму всех элементов двумерного массива и найти медиану (среднее арифметическое)»
textual
Листинг программы
- .model small
- .stack 100h
- .data
- Mas dw 1, 4, -6, 0 ; массив 4х4
- dw 0, -5, -11, 2 ; длина массива = 16
- dw 32, 8, -2, 9 ;сумма 55
- dw 2, 17, 5, -1
- len db 16 ;счетчик кол-ва элементов массива
- med db 0
- msg db 'Mediana massiva: ',10,13, '$'
- .code
- ; выводит число из регистра AX на экран
- ; входные данные:
- ; ax - число для отображения
- Show_AX proc
- push ax
- push bx
- push cx
- push dx
- push di
- mov cx, 10
- xor di, di ; di - кол. цифр в числе
- ; если число в ax отрицательное, то
- ;1) напечатать '-'
- ;2) сделать ax положительным
- or ax, ax
- jns @@Conv
- push ax
- mov dx, '-'
- mov ah, 2 ; ah - функция вывода символа на экран
- int 21h
- pop ax
- neg ax
- @@Conv:
- xor dx, dx
- div cx ; dl = num mod 10
- add dl, '0' ; перевод в символьный формат
- inc di
- push dx ; складываем в стэк
- or ax, ax
- jnz @@Conv
- ; выводим из стэка на экран
- @@Show:
- pop dx ; dl = очередной символ
- mov ah, 2 ; ah - функция вывода символа на экран
- int 21h
- dec di ; повторяем пока di<>0
- jnz @@Show
- pop di
- pop dx
- pop cx
- pop bx
- pop ax
- ret
- Show_AX endp
- main:
- mov ax, @data ;ds = сегмент .data
- mov ds, ax
- mov ah,9
- mov dx,OFFSET msg
- int 21h
- lea bx,mas
- mov cl, len ;сх = len mas
- mov ch,0
- xor ax,ax
- cycl:
- add ax,[bx]
- add bx,2
- loop cycl
- idiv len
- mov ah,0
- cbw
- call Show_AX
- mov ax, 4C00h
- int 21h
- end main
Объяснение кода листинга программы
- В начале объявляется модель памяти, ее размер и начальный адрес, а также ранее обозначенные переменные:
.model small
- объявление модели памяти.stack 100h
- размер стекаMas dw 1, 4, -6, 0
- массив 4x4 с элементами 1, 4, -6, 0len db 16
- количество элементов массиваmed db 0
- переменная для хранения медианыmsg db 'Mediana massiva: ',10,13, '$'
- сообщение для вывода на экран
- Затем идет процедура вывода числа из регистра AX на экран:
- Show_AX proc - объявление процедуры
- Содержит логику для вывода числа в символьном формате
- Далее идет основная часть программы:
main:
- объявление метки для основной части программы- Загрузка сегментного регистра DS и адреса переменных
- Вывод сообщения
Mediana massiva:
на экран - Инициализация регистра BX для обращения к массиву
- Использование цикла для подсчета суммы всех элементов массива
- Деление суммы на количество элементов и вывод результата (медианы) на экран
- Завершение программы инструкцией
int 21h
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д