Проверите программу вычисления среднего арифметического на 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
288 +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
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 95 454 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир