|
カテゴリ:カテゴリ未分類
AVRでは8bit同士の掛け算は普通に命令が用意されてますが16bit×8bitができなかった・・
というわけでつくりました。といっても簡単にするために16bit×0~10までです。 2倍4倍などはLSLやROLで処理できるので組み合わせることで好きな整数倍が利用できます。 ;整数倍を処理するr29:r28に掛けられる方 r16に0x0Aまでの倍数 ;r19;r31:r30に答えが返る 24bitリターン go_mul: cpi r16,0x0B ;被乗算回数が10以下か? brcc mulloopout ; push r0 push r1 push r16 push r17 push r18 ldi r17,0xff ;定数 ldi r18,0x00 ;定数 mul r28,r16 ;xl*a=b movw r30,r0 ;r31:r30<r1:r0 mul r29,r16 ;xh*a=c mulloopin: add r30,r0 ; adc r31,r1 ;b+c adc r19,r18 ; mov r16,r1 ;r16=ch mul r0,r17 ;cl*0xff=dl add r30,r0 ; adc r31,r1 ;解+dl adc r19,r18 ; mul r16,r17 ;ch*0xff=dh brne mulloopin ; mulloopout: pop r18 pop r17 pop r16 pop r1 pop r0 ret お気に入りの記事を「いいね!」で応援しよう
Last updated
Mar 18, 2011 06:29:47 PM
コメント(0) | コメントを書く |