Moltiplicazione tra interi a 32 bit su microcontrollori Atmel AVR

Moltiplicazione tra interi a 32 bit su microcontrollori AVR

Nel listato seguente una soluzione in assembler per eseguire il prodotto tra due interi a 32 bit su microcontrollori AVR. La variabile var1[3:0] contiene il moltiplicando (32 bit), var2[3:0] contiene il moltiplicatore  (32 bit), mentre il risultato viene allocato in var1[7:0]. Al termine dell’operazione viene restituito 0 nel registro lc. La routine occupa 21 words e non coinvolge alcun livello dello stack.

mul32u:    sub      var17,var17
            sub     var16,var16
            sub     var15,var15
            sub     var14,var14
            ldi     lc,33           ;lc = 33;
            brcc    PC+5            ;ciclo di calcolo
            add     var14,var20
            adc     var15,var21
            adc     var16,var22
            adc     var17,var23
            ror     var17
            ror     var16
            ror     var15
            ror     var14
            ror     var13
            ror     var12
            ror     var11
            ror     var10
            dec     lc               ;se (--lc > 0)
            brne    PC-14            ;continua il ciclo;
            ret
mul32s:     clr     lc
            clr     var14
            tst     var13
            brpl    PC+10
            inc     var14
            com     var10
            com     var11
            com     var12
            com     var13
            adc     var10,lc
            adc     var11,lc
            adc     var12,lc
            adc     var13,lc
            tst     var21
            brpl    PC+10
            inc     var14
            com     var20
            com     var21
            com     var22
            com     var23
            adc     var20,lc
            adc     var21,lc
            adc     var22,lc
            adc     var23,lc
            bst     var14,0
            rcall   mul16u
            brtc    PC+17
            com     var10
            com     var11
            com     var12
            com     var13
            com     var14
            com     var15
            com     var16
            com     var17
            adc     var10,lc
            adc     var11,lc
            adc     var12,lc
            adc     var13,lc
            adc     var14,lc
            adc     var15,lc
            adc     var16,lc
            adc     var17,lc
            ret
Listato 5

Una risposta

  1. Maurizio Di Paolo Emilio Maurizio 9 gennaio 2016

Scrivi un commento

Send this to a friend