Необходимо вычислить среднее арифметическое четырёх целых однобайтовых беззнаковых чисел, которые находятся в памяти данных. Результат занести в буфер, находящийся в памяти данных. Вот мой код. Да-да, я понимаю, что он очень убог, некрасив и вообще ужасен. Но важна правильность работы. Верен ли он?
.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