Не выполняется вычисление суммы ряда - 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
Объяснение кода листинга программы
- mov ax, 4c00h - в данной инструкции происходит копирование значения 4c00h в регистр ax
- int 21h - здесь происходит ввод значения регистра ax в диапазон от 0 до 4c00h (включая границы), после чего управление передаётся следующему байту кода
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д