Посчитать сумму всех элементов двумерного массива и найти медиану (среднее арифметическое) - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д