Найти среднее значение элементов массива - Assembler
Формулировка задачи:
Листинг программы
- .model small
- .stack 100h
- .data
- array db 65000 dup (200)
- mas_len EQU ($ - array)
- string1 db "Srednee znachenie el-ov massiva: $"
- .code ;начало сегмента кода
- start:
- mov ax, @data ;инициализация сегмента данных
- mov ds, ax ;сохраняем адрес @data в регистре сегмента данных
- mov ah, 09h
- lea dx, string1
- int 21h
- lea si, array ;помещаем адрес начала массива в si
- mov cx, mas_len ;поместили длину массива в cx
- m:
- xor ax, ax
- mov al, [si] ;в ax поместили то что лежит по адресу si(первый элемент)
- cwd
- add bx, ax ;в bx положили ax
- inc si ;переход к след э-ту
- loop m
- mov ax, bx
- mov bx, mas_len
- div bx
- ; --- Чтобы вывести число из ax нам нужно перевести его в десятичную систему -------
- ; --- счисления. -------
- ; --- Для этого мы будем делить его на 10 и записывать остаток в стек -------
- ; --- таким образом в стеке окажутся все цифры числа в обратном порядке. -------
- ; --- В строке 162 операция cwd применена для расширения операции деления -------
- ; --- так после применения этой операции частное от деления будет храниться -------
- ; --- в ax, а остаток в dx -------
- ; ----------------------------------------------------------------------------------
- xor cx,cx
- mov bx,10
- m1:
- xor dx,dx
- div bx
- ; Делим число на основание сс. В остатке получается последняя цифра.
- ; Сразу выводить её нельзя, поэтому сохраним её в стэке.
- push dx
- inc cx
- ; А с частным повторяем то же самое, отделяя от него очередную
- ; цифру справа, пока не останется ноль, что значит, что дальше
- ; слева только нули.
- test ax, ax
- jnz m1
- mov ah,2
- EndGet:
- pop dx ; собственно сам вывод на экран. по очереди c конца
- add dl, '0'
- ; цифры из стека(старшие разряду в начале мл. в конце)
- int 21h
- loop EndGet ; повторяем пока цифры не кончаться
- ; возвращаем в bx то что забрали
- mov ax, 4c00h
- mov dl, 0ah
- int 21h
- end start
Решение задачи: «Найти среднее значение элементов массива»
textual
Листинг программы
- mov bx, 0 ;результат сумирования будет в регистровой паре (di:bx)
- mov di, 0
- lea si, array
- mov cx, mas_len
- @@For:
- mov al, [si]
- add si, 1 ;на размер элемента массива в байтах
- cbw ;преобразуем байт из al в двойное слово в регистровой паре (dx:ax)
- cwd
- add bx, ax ;суммируем регистровые пары
- adc di, dx
- loop @@For
Объяснение кода листинга программы
- Устанавливается начальное значение счетчика суммы в
0
с помощью командыmov bx, 0
, а также устанавливается начальное значение регистраdi
в0
с помощью командыmov di, 0
. - Вычисляется адрес начала массива и сохраняется в регистре
si
с помощью командыlea si, array
. - Загружается длина массива в регистр
cx
с помощью командыmov cx, mas_len
. - Начинается цикл обработки элементов массива с помощью метки
@@For
. - Загружается значение текущего элемента массива в регистр
al
из ячейки, адрес которой находится в регистреsi
. - Увеличивается адрес в регистре
si
на размер элемента массива в байтах с помощью командыadd si, 1
. - Производится расширение байта из регистра
al
в двойное слово в регистровой паре (dx:ax) с помощью командыcbw
. - Производится расширение слова из регистра
ax
в двойное слово в регистровой паре (dx:ax) с помощью командыcwd
. - Вычисляется сумма текущего элемента массива с текущим значением в регистровой паре (di:bx) и сохраняется в регистре
bx
с помощью командыadd bx, ax
, а также производится перенос в регистрdi
с помощью командыadc di, dx
. - Выполняется повторение цикла, уменьшая значение счетчика цикла в регистре
cx
с помощью командыloop @@For
. Данный код вычисляет сумму элементов массива и сохраняет её в регистровой паре (di:bx) при условии, что элементы массива представляют собой 16-битные целые числа.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д