2016-02-03 3 views
1

Я не могу понять, как происходит бинарное умножение в 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 
+2

_ «Что именно делают« ror »и« lsr »?» _ Http://www.atmel.com/webdoc/avrassembler/avrassembler.wb_ROR.html http://www.atmel.com/webdoc/avrassembler /avrassembler.wb_LSR.html – Michael

+0

Вы всегда можете использовать ((a + b) ²- (ab) ²)/4. (Этот код напоминает мне об Atmel's [AVR200] (http://www.atmel.com/Images/AVR200.zip).) – greybeard

ответ

0

Как известно, умножение может быть выполнено с использованием сдвига и сложения, например.

101 
    101 
    === 
    101 
1 01 
= ==== 
1 1001 

Обратите внимание, что хотя цифры соответствуют 4 битам, мне нужно было использовать больше бит для добавления. Чтобы избежать этого, код, который вы указываете, сдвигает результат, а не число, которое нужно добавить.

101 
    --- - 
    10 1 
    -- -- 
    1 01 
    101 
    === 
    110 01 
    --- -- 
    11 001 
    -- ---- 
    1 0001 

Этот способ требует всего 4 бита.