Архитектура ЭВМ. Подпрограммы и стек. Даны три массива чисел - Assembler

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

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

Архитектура ЭВМ. Подпрограммы и стек. Даны три массива чисел. Требуется вычислить среднее арифметическое их отношения сумм четных и нечетных элементов

Решение задачи: «Архитектура ЭВМ. Подпрограммы и стек. Даны три массива чисел»

textual
Листинг программы
LOCALS
 
.model small
 
.stack 100h
 
.data
        A       dw      1, 3, 5, 7 , 8, 10
        LenA    dw      ($-A)/2
        B       dw      16, 30, 55, 7 , 8, 10, 17, 22, 70
        LenB    dw      ($-A)/2
        C       dw      15, 23, 52, 17 , 81, 10
        LenC    dw      ($-A)/2
 
        Result  dw      ?
 
.code
 
main    proc
        mov     ax,     @data
        mov     ds,     ax
 
        mov     bx,     0       ;сумма отношений
 
        lea     si,     A
        mov     cx,     LenA
        call    Ratio
 
        add     bx,     ax
 
        lea     si,     B
        mov     cx,     LenB
        call    Ratio
 
        add     bx,     ax
 
        lea     si,     C
        mov     cx,     LenC
        call    Ratio
 
        add     bx,     ax
 
        ;вычисление среднего арифметического отношений
        mov     ax,     bx
        mov     dx,     0
        mov     bx,     3
        div     bx
        ;сохранение результата
        mov     Result, ax
 
        mov     ax,     4C00h
        int     21h
main    endp
 
Ratio   proc
        push    bx
        push    cx
        push    dx
        push    si
 
        ;вычисление сумм чётных и нечётных элементов массива
        mov     bx,     0       ;сумма чётных элементов
        mov     dx,     0       ;сумма нечётных элементов
@@For:
        lodsw
        test    ax,     1
        jnz     @@Odd
        add     bx,     ax
        jmp     @@Next
@@Odd:
        add     dx,     ax
@@Next:
        add     si,     2
        loop    @@For
        ;вычисление отношения
        mov     ax,     bx
        mov     bx,     dx
        mov     dx,     0
        div     bx
 
        pop     si
        pop     dx
        pop     cx
        pop     bx
        ret
Ratio   endp
 
end     main

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

  1. Задание локальных переменных: LOCALS
  2. Определение модели памяти: .model small
  3. Определение размера стека: .stack 100h
  4. Определение массивов A, B, C и их длин (LenA, LenB, LenC)
  5. Объявление переменной Result
  6. Начало кода исполняемой программы: main proc
  7. Загрузка базового адреса сегмента данных в регистр ax и затем в регистр ds
  8. Инициализация регистра bx (переменной для суммы отношений)
  9. Вызов подпрограммы Ratio для массива A и добавление результата к переменной bx
  10. Вызов подпрограммы Ratio для массива B и добавление результата к переменной bx
  11. Вызов подпрограммы Ratio для массива C и добавление результата к переменной bx
  12. Вычисление среднего арифметического отношений и сохранение результата в переменной Result
  13. Завершение программы и освобождение памяти Подпрограмма Ratio:
  14. Сохранение регистров bx, cx, dx, si на стеке
  15. Вычисление суммы четных и нечетных элементов массива
  16. Вычисление отношения суммы четных элементов к нечетным
  17. Восстановление регистров и возврат из подпрограммы Замечание: В строках, где используется команда рет означает, что происходит возврат из подпрограммы и восстановление значений регистров.

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

10   голосов , оценка 4.1 из 5
Похожие ответы