Я не могу понять, как происходит бинарное умножение в avr-коде. Вот код от avr freaks. Что именно делают «ror» и «lsr»? Я думал, что для умножения в бинарном случае нам нужно lsl.Умножение в avr-сборке
.def mc8s =r16 ;multiplicand
.def mp8s =r17 ;multiplier
.def m8sL =r17 ;result Low byte
.def m8sH =r18 ;result High byte
.def mcnt8s =r19 ;loop counter
mpy8s: sub m8sH,m8sH ;clear result High byte and carry
ldi mcnt8s,8 ;init loop counter
m8s_1: brcc m8s_2 ;if carry (previous bit) set
add m8sH,mc8s ; add multiplicand to result High byte
m8s_2: sbrc mp8s,0 ;if current bit set
sub m8sH,mc8s ; subtract multiplicand from result High
asr m8sH ;shift right result High byte
ror m8sL ;shift right result L byte and multiplier
enter code here
dec mcnt8s ;decrement loop counter
enter code here
brne m8s_1 ;if not done, loop more
ret
_ «Что именно делают« ror »и« lsr »?» _ Http://www.atmel.com/webdoc/avrassembler/avrassembler.wb_ROR.html http://www.atmel.com/webdoc/avrassembler /avrassembler.wb_LSR.html – Michael
Вы всегда можете использовать ((a + b) ²- (ab) ²)/4. (Этот код напоминает мне об Atmel's [AVR200] (http://www.atmel.com/Images/AVR200.zip).) – greybeard