ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
28 ноября
536077 Топик полностью
MBedder, терминатор (03.08.2014 11:12, просмотров: 120) ответил vmp на Попробуйте тот вариант, что был приведен в письме от Alexandr A. Redchuck по ссылке выше
В dsPIC/PIC24 есть замечательные однотактные команды ff1l/ff1r (Find First "1" from Left/Right). Посредством ff1l вычисляется правильная начальная маска, что сокращает число итераций - чем меньше число, тем их будет меньше ;------------------------------------------------------------------------------ ; 16-bit integer square root ; ; Shift X to the rigtht a bit one field at a time, ; multiply the word by itself, ; if it's bigger than X then make the bit 0, ; otherwise, keep the one bit. ; Keep shifting/multiplying for 16 bits. ; Should be much less than 100 cycles. ; ; w4 = X ; w6 = result ; ; w0:w1 scratch ; w2 = bit pointer (mask) sqrt16a: clr w6 push.s ff1l w4,w2 ; Calculate effective number of bits (Nbits) subr w2,#16,w2 ; lsr w2,w2 ; bclr SR,#Z do w2,1f ; Repeat Nbits/2 times mov DCOUNT,w2 ; w2 = M = current rolling "1" bit number bsw.z w6,w2 mul.uu w6,w6,w0 cp w4,w0 ; CP sets CY if op1 > op2!!! bsw.c w6,w2 2: pop.s return ;-----------------------------------------------------------------------------