777777 0 6 июля, 2011 Опубликовано 6 июля, 2011 · Жалоба В мегах есть команды, которые после умножения сдвигают результат влево. Фича полезная для дробных вычислений с фиксированной точкой, но обычно прихрдится иметь дело с как минимум двухбайтовыми данными. Можно ли эти команды приспособить для умножения двухбайтовых чисел? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexeyv 0 7 июля, 2011 Опубликовано 7 июля, 2011 · Жалоба Ты наверное ищешь Это: ;********************************************************************** ******** ;* ;* FUNCTION ;* fmuls16x16_32 ;* DECRIPTION ;* Signed fractional multiply of two 16bits numbers with 32bits result. ;* USAGE ;* r19:r18:r17:r16 = ( r23:r22 * r21:r20 ) << 1 ;* STATISTICS ;* Cycles : 20 + ret ;* Words : 16 + ret ;* Register usage: r0 to r2 and r16 to r23 (11 registers) ;* NOTE ;* The routine is non-destructive to the operands. ;* ;****************************************************************************** fmuls16x16_32: clr r2 fmuls r23, r21 ; ( (signed)ah * (signed)bh ) << 1 movw r19:r18, r1:r0 fmul r22, r20 ; ( al * bl ) << 1 adc r18, r2 movw r17:r16, r1:r0 fmulsu r23, r20 ; ( (signed)ah * bl ) << 1 sbc r19, r2 add r17, r0 adc r18, r1 adc r19, r2 fmulsu r21, r22 ; ( (signed)bh * al ) << 1 sbc r19, r2 add r17, r0 adc r18, r1 adc r19, r2 ret Более подробную информацию можно прочитать в Application Note AVR201: Using the AVR® Hardware Multiplier Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
777777 0 7 июля, 2011 Опубликовано 7 июля, 2011 · Жалоба Ты наверное ищешь Это: Да, точняк! Более подробную информацию можно прочитать в Application Note AVR201: Using the AVR® Hardware Multiplier По аппнотам лазил, а эта как-то прошла мимо :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться