Задать вопрос
@Timebird

Проверите программу вычисления среднего арифметического на 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
  • Вопрос задан
  • 1110 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
У вас если флаг переноса окажется не нулевым, то дальше сложение не производится.
Ответ написан
Комментировать
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
чисел, которые находятся в памяти данных.

Где загрузка данных и памяти в регистры?
Почему все brcc переходят на add_8?
Почему в следующем фрагменте и из младшего и из старшего байта суммы вычитается counter?
sub sum_l,counter
    sbc sum_h,counter

Почему из цикла деления выход только при переносе в минус? Что если разделится нацело?
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы