[an error occurred while processing this directive]
|
Обычьный вариант от Атымеля, расширеный и углубленный: 32/16=32
.def drem16uL=r12 ;remainder
.def drem16uM=r13.def dres16uL=r8 ;result
.def dres16uM=r9
.def dres16uH=r10
.def dres16HH=r11.def dd16uL =r8 ;divident
.def dd16uM =r9
.def dd16uH =r10
.def dd16uHH =r11.def dv16uL =r16 ;divisor
.def dv16uH =r17.def dcnt16u =r20
.def zero_reg=r2div16u: clr drem16uL ;clear remainder Low byte
sub drem16uM,drem16uM;clear remainder High byte and carry
ldi dcnt16u,32 ;init loop counter
rol dd16uL ;shift left dividend
rol dd16uM
rol dd16uH
rol dd16uHHd16u_2: rol drem16uL ;shift dividend into remainder
rol drem16uM
brcs d16u_31sub drem16uL,dv16uL ;remainder = remainder - divisor
sbc drem16uM,dv16uH ;brcc d16u_3 ;if result negative
add drem16uL,dv16uL ; restore remainder
adc drem16uM,dv16uHlsl dd16uL ;shift left dividend
rol dd16uM
rol dd16uH
rol dd16uHHdec dcnt16u ;decrement counter
brne d16u_2 ;if done
retd16u_31:
sub drem16uL,dv16uL ;remainder = remainder - divisor
sbc drem16uM,dv16uH ;d16u_3: sec ; set carry to be shifted into result
rol dd16uL ;shift left dividend
rol dd16uM
rol dd16uH
rol dd16uHHdec dcnt16u ;decrement counter
brne d16u_2 ;if done
ret ; return
E-mail: info@telesys.ru