MBedder, терминатор (03.08.2014 11:12, просмотров: 114) ответил 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
;-----------------------------------------------------------------------------