Найти среднее значение элементов массива - 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

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

  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
Похожие ответы