00001 #include "p18cxxx.inc" 00002 ;--- Példaprogram az előjel nélküli számok osztására 00003 udata_acs 00004 p res 2 ; ez a 16 bites osztandó 00005 d res 1 ; ez a 8 bites osztó 00006 k res 1 ; ciklusszámláló 00007 RST CODE 00008 goto start 00009 ;--- Példa: p = 0x2EF0 (12016), d = 0x8D (141) 00010 ; A helyes eredmény: p/d hányadosa = 0x55 (85), a maradék = 0x1F (31) 00011 PGM CODE 00012 start: movlw 0xf0 00013 movwf p 00014 movlw 0x2e 00015 movwf p+1 00016 movlw 0x8d 00017 movwf d 00018 call div16_8 00019 nop 00020 goto $-2 00021 00022 ;--- div16_8: 16 bites szám osztása 8 bitessel ------ 00023 ; Belépéskor p az osztandó, d az osztó 00024 ; Kilépéskor p alsó bájtja a hányados, a felső bájt pedig a maradék 00025 ; Az esetleges osztási túlcsordulást kilépéskor a C=1 feltétel jelzi 00026 div16_8: movf d,W ;túlcsordulás vizsgálat 00027 subwf p+1,W ;pH >= d? 00028 bc kilep ;ha C=1, akkor osztási túlcsordulás hiba! 00029 movlw 8 00030 movwf k ;a ciklusszámláló 8 legyen 00031 ciklus: movf d,W ;osztó elővétele 00032 bcf STATUS,C 00033 rlcf p 00034 rlcf p+1 ;balraforgatja az osztandót 00035 bc kivonas ;ha C=1, pd > d, tehát kivonás következhet 00036 subwf p+1 ;a parciális osztandó előállítása kivonással 00037 bc bit_egy ;ha C=1, pd>=d, a hányados következő bitjébe 1-et írunk! 00038 addwf p+1 ;ha C=0, akkor vissza kell csinálni a kivonást és át kell 00039 bra szamlal ;ugrani a hányados következő bitjének 1-be állításását! 00040 kivonas: subwf p+1 ;a parciális osztandó előállítása kivonással 00041 bit_egy: bsf p,0 ;a hányados soron következő bitjét '1'-be állítjuk 00042 szamlal: decfsz k ;a ciklusok visszaszámlálása 00043 bra ciklus ;újabb iteráció, ha k <> 0 00044 bcf STATUS,C ;nincs túlcsordulás, Carry törlése 00045 kilep: return 00046 END