Проверите программу вычисления среднего арифметического на Assembler? Необходимо вычислить среднее арифметическое четырёх целых однобайтовых беззнаковых чисел, которые находятся в памяти данных. Результат занести в буфер, находящийся в памяти данных. Вот мой код. Да-да, я понимаю, что он очень убог, некрасив и вообще ужасен. Но важна правильность работы. Верен ли он?.include "m16def.inc" .list .def number_one = R1 .def number_two = R2 .def number_three = R3 .def number_four = R4 .def sum_l = R5 ; сумма, младший разряд .def sum_h = R6 ; сумма, старший разряд .def counter = R20 ; счётчик чисел .def mean_l = R23 ; среднее, младший разряд .def mean_h = R24 ; среднее, старший разряд .dseg buf_one: .byte 1 buf_two: .byte 1 buf_three: .byte 1 buf_four: .byte 1 buf_sum: .byte 4 buf_counter: .byte 1 .cseg Init: clr sum_l clr sum_h clr counter clr mean_l clr mean_h Start: ; сначала производим суммирование и увеличение счётчика до четырех соответственно add sum_l, number_one ; сложить младшие разряды brcc add_8 ; если флаг переноса не нулевой... inc sum_h ; значение старшего разряда увеличить на 1 inc counter add sum_l, number_two brcc add_8 inc sum_h inc counter add sum_l, number_three brcc add_8 inc sum_h inc counter add sum_l, number_four brcc add_8 inc sum_h inc counter add_8: ; а иначе -- ничего не делать Divide: ; производим деление clr mean_l clr mean_h divsumxcounter: tst counter ; если counter = 0, выходим из подпрограммы breq dv3 ; с признаком ошибки С=1 (произошла ошибка) sub sum_l,counter sbc sum_h,counter brcs end_divsumcounter ; если перенос в минус -- то на выход inc mean_l ; иначе увеличиваем результат на 1 -- младший байт brne divsumxcounter ; если не было переноса -- то обратно inc mean_h ; иначе следующий байт на 1 rjmp divsumxcounter ; обратно end_divsumcounter: clc ; успешно выполнено ret dv3: sec ; выполнено с ошибкой ret
Этот код должен правильно выполнять вычисление среднего арифметического четырёх чисел и сохранять результат в буфере. Не забудьте загрузить значения чисел в буферы перед запуском программы.
К сожалению, ваш код содержит ошибки. Вот исправленная версия программы для вычисления среднего арифметического четырёх чисел:
.include "m16def.inc".list
.def number_one = R1
.def number_two = R2
.def number_three = R3
.def number_four = R4
.def sum_l = R5 ; сумма, младший разряд
.def sum_h = R6 ; сумма, старший разряд
.def counter = R7 ; счётчик чисел
.def mean_l = R23 ; среднее, младший разряд
.def mean_h = R24 ; среднее, старший разряд
.dseg
buf_one: .byte 1
buf_two: .byte 1
buf_three: .byte 1
buf_four: .byte 1
buf_sum: .byte 4
buf_counter: .byte 1
.cseg
Init:
ldi counter, 4 ; устанавливаем счётчик в 4
clr sum_l
clr sum_h
clr mean_l
clr mean_h
Start:
ld number_one, buf_one
ld number_two, buf_two
ld number_three, buf_three
ld number_four, buf_four
; сначала производим суммирование
add sum_l, number_one
brcc add_sum_h
inc sum_h
add_sum_h:
add sum_l, number_two
brcc add_sum_h2
inc sum_h
add_sum_h2:
add sum_l, number_three
brcc add_sum_h3
inc sum_h
add_sum_h3:
add sum_l, number_four
brcc divide
inc sum_h
divide:
clr R16 ; для хранения результат деления
ldi R17, 4 ; делитель (число 4)
div sum_h, R16 ; деление суммы на 4
mov mean_h, R16 ; сохранение старшего разряда результата деления
clr R16
clear_counter:
st buf_counter, R7
dec R7
breq end_divide
rjmp clear_counter
end_divide:
st buf_sum, mean_h ; сохраняем результат в буфер
.end
Этот код должен правильно выполнять вычисление среднего арифметического четырёх чисел и сохранять результат в буфере. Не забудьте загрузить значения чисел в буферы перед запуском программы.