Не выполняется вычисление суммы ряда - Assembler

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

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

Условие задачи: по заданным числам найти сумму ряда, где i = 1;5. Сам ряд: Значение переменных: a = 25, b = 24, o = 26, d = 25, e = 29. Результатом суммы должно быть S = 1 859 390 Всё компилится, но почему-то вычисление не заканчивается, мб зацикливается, не знаю. Вопрос такой: что я делаю не так?
; =======================================
.Model Small    ; Малая модель памяти
.Stack 100h     ; Для стека выделяется 100h байт
.Data           ; начало сегмента данных
N dw 5      ; Определение перменной N, начальное значение 5
a dw 25     ; Определение перменной a, начальное значение 25
b dw 24     ; Определение перменной b, начальное значение 24
o dw 26     ; Определение перменной o(c), начальное значение 26
d dw 25     ; Определение перменной d, начальное значение 25
e dw 29     ; Определение перменной e, начальное значение 29
S dw 0      ; Определение перменной S, начальное значение 0
f dw 0      ; Определение перменной f, начальное значение 0
 
.Code           ; начало сегмента кода
begin:
mov ax,@Data    ; загрузка в регистр ax адреса сегмента данных
mov ds,ax   ; загрузка в регистр ds адреса сегмента данных
mov cx,N    ;cx: = N - начальный параметр цикла (=5)
 
lab1:
call Proced1    ;вычислить Proced1 для cx = i
mov bx,f
add S,bx    ;S: = S + f - прибавление к сумме текущего значения слагаемого
loop lab1   ;cx: = cx - 1(текущий параметр цикла i=i-1)
        ; пока cx>0, то на lab1:
 
nop     ; команда «нет операции»: удобно использовать 
        ;в качестве конца программы при запуске в DEBUG 
 
Proced1 proc    ;подпрограмма Proced1 - вычисления f(i)=i+(c*b-e)*a*d
        ;параметр i передается через регистр cx
 
mov ax,o    ;ax: = c
imul b      ;ax: = c*b
sub ax,e    ;ax: = (c*b-e)
imul a      ;ax: = (c*b-e)*a
imul d      ;ax: = (c*b-e)*a*d
add cx,ax   ;ax: = f(i)
mov f,ax    ;результат передается в основную программу через f
ret     ;возврат в основную программу
Proced1 endp
 
end begin   ; конец сегмента кода

Решение задачи: «Не выполняется вычисление суммы ряда»

textual
Листинг программы
    mov    ax, 4c00h
    int 21h

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

  1. mov ax, 4c00h - в данной инструкции происходит копирование значения 4c00h в регистр ax
  2. int 21h - здесь происходит ввод значения регистра ax в диапазон от 0 до 4c00h (включая границы), после чего управление передаётся следующему байту кода

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

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