T
T
Timebird2017-01-14 19:10:15
Programming
Timebird, 2017-01-14 19:10:15

Check out the program for calculating the arithmetic mean in Assembler?

It is necessary to calculate the arithmetic mean of four integer one-byte unsigned numbers that are in the data memory. The result is stored in the buffer located in the data memory. Here is my code. Yes, yes, I understand that he is very miserable, ugly and generally terrible. But doing it right is important. Is he faithful?

.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

Answer the question

In order to leave comments, you need to log in

1 answer(s)
R
Rsa97, 2017-01-14
@Timebird

If the carry flag turns out to be non-zero, then the addition is not performed further.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question