[an error occurred while processing this directive]
|
... в этом аппноте ошибку ( на то и аппноты, что-бы инженерная мысль не дремала ):
"Я по поводу аппноты 200. Признаюсь, мне пришлось около двух часов возиться, затем вспоминать полузабытую с институтских времен двоичную
арифметику, чтобы найти ошибку в умножении (столь долгое время потому, что я ВЕРИЛ авторитету уважаемой ATMEL и первоначально не допускал мысли о том, что у них ошибки).
В процедуре умножения 16х16 метка возврата стоит не там (ихняя метка
оставлена в скобках), недаром коммент к этим строкам опущен:
mpy16u: clr m16u3 ;clear 2 highest bytes of result
clr m16u2
ldi mcnt16u,16 ;init loop counter
m16u_1: lsr mp16uH
ror mp16uL(m16u_1:) brcc noad8 ;if bit 0 of multiplier set
add m16u2,mc16uL ;add multiplicand Low to byte 2 of res
adc m16u3,mc16uH ;add multiplicand high to byte 3 of res
noad8: ror m16u3 ;shift right result byte 3
ror m16u2 ;rotate right result byte 2
ror m16u1 ;rotate result byte 1 and multiplier High
ror m16u0 ;rotate result byte 0 and multiplier Low
dec mcnt16u ;decrement loop counter
brne m16u_1 ;if not done, loop more
ret
.def mp16uL =r18 ;multiplier low byte
.def mp16uH =r19 ;multiplier high byte
.def m16u0 =r18 ;result byte 0 (LSB)
.def m16u1 =r19 ;result byte 1
E-mail: info@telesys.ru