Got this in a lecture
; 8x8 unsigned multiply routine.
; No checks made for M1 or M2 equal to zero
Clrf R_hi ; Clear result location
clrf R_lo
movlw 0x08 ; setup loop count
movwf cntr
movf M1,W ; initialize W with M1
Umul rrf M2,F ; rotate into carry to check bits
Btfsc STATUS,C ; if carry set i.e. bit was 1
addwf R_hi,F ; ... we add
rrf R_hi,F ; shift over for the next addition
rrf R_lo,F
decf cntr,F ; check the loop count
btfss STATUS,Z
goto Umul
...
Looks good i think. Right?