00001 #include "p18cxxx.inc"
00002 ;--- 16 bites előjel nélküli számok szorzása ------
00003 ;--- p = a * b kiszámítása
00004 udata_acs
00005 a res 2 ; a: szorzandó
00006 b res 2 ; b: szorzó
00007 p res 4 ; p: szorzat
00008 RST CODE
00009 goto start
00010 ;--- Példa: p = 0x12ff * 0x25ff
00011 ;--- (a helyes eredmény = 0x02d1c701)
00012 PGM CODE
00013 start: movlw 0xff
00014 movwf a ; a=0x122ff
00015 movlw 0x12
00016 movwf a+1
00017 movlw 0xff
00018 movwf b ; b=0x25ff
00019 movlw 0x25
00020 movwf b+1
00021 call mult16u ; p = a*b
00022 nop
00023 goto $-2
00024 ;--- mult16u a szozást végző eljárás
00025 mult16u:
00026 movf b,w
00027 mulwf a ;aL*bL
00028 movff PRODL,p ;az eredmény elmentése
00029 movff PRODH,p+1 ;p0 és p1-be
00030 ;-----------------------------------------------
00031 movf b+1,w
00032 mulwf a+1 ;aH*bH
00033 movff PRODL,p+2 ;az eredmény elmentése
00034 movff PRODH,p+3 ;p2 és p3-ba
00035 ;-----------------------------------------------
00036 movf b,w
00037 mulwf a+1 ;aH*bL
00038 movf PRODL,w
00039 addwf p+1,f ;p1 = p1+Lo(aH*bL)
00040 movf PRODH,w
00041 addwfc p+2,f ;p2=p2+Hi(aH*bL)+Carry
00042 clrf WREG
00043 addwfc p+3,f ;p3=p3+Carry
00044 ;-----------------------------------------------
00045 movf b+1,w
00046 mulwf a ;aL*bH
00047 movf PRODL,w
00048 addwf p+1,f ;p1 = p1+Lo(aL*bH)
00049 movf PRODH,w
00050 addwfc p+2,f ;p2=p2+Hi(aL*bH)+Carry
00051 clrf WREG
00052 addwfc p+3,f ;p3=p3+Carry
00053 return
00054 END