Проверите программу вычисления среднего арифметического на 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

21 Авг 2019 в 06:33
313 +1
0
Ответы
1

К сожалению, ваш код содержит ошибки. Вот исправленная версия программы для вычисления среднего арифметического четырёх чисел:

.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

Этот код должен правильно выполнять вычисление среднего арифметического четырёх чисел и сохранять результат в буфере. Не забудьте загрузить значения чисел в буферы перед запуском программы.

20 Апр 2024 в 13:16
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир