00001 #include "p18cxxx.inc" 00002 ;--- 16 bites előjeles 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 = 1450*4550 = 0x05aa*0xee3a 00011 ;--- (az eredmény = 0xff9b5484 = -6597500) 00012 PGM CODE 00013 start: movlw 0xaa 00014 movwf a ; a=0x05aa 00015 movlw 0x05 00016 movwf a+1 00017 movlw 0x3a 00018 movwf b ; b=0xee3a 00019 movlw 0xee 00020 movwf b+1 00021 call mult16s ; p = a*b 00022 nop 00023 goto $-2 00024 ;--- mult16s a szozást végző eljárás 00025 mult16s: 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 ;--- Előjevizsgálat és korrekció ---------------- 00054 avizsg: btfss a+1,7 ;a szorzandó negatív? 00055 bra bvizsg ;ugrás, ha a nem negatív 00056 movf b,W 00057 subwf p+2 ;p3:p2 = p3:p2 - bH:bL 00058 movf b+1,W 00059 subwfb p+3 00060 bvizsg: btfss b+1,7 ;a szorzó negatív? 00061 bra kilep ;kilépés, ha b nem negatív 00062 movf a,W 00063 subwf p+2 ;p3:p2 = p3:p2 - aH:aL 00064 movf a+1,W 00065 subwfb p+3 00066 kilep: return 00067 END