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