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 |
Script interessante, una simile analogia potrebbe essere utilizzata per la divisione (con le sottrazioni).