16 Bit / 16 Bit Integerdivision mit PIC16XXX Befehlssatz
|
|
Dieser Code ist mit der Entwicklungsumgebung MPLAB IDE 7.20 von Microchip geschrieben.
LIST P=16F57
MDUCOUNT equ 0x18 ;Hilfszaehler bei der Division und Multiplikation
AL equ 0x19
AH equ 0x1A
BL equ 0x1B ;Divisor
BH equ 0x1C
RESTL equ 0x1D ;Divisionsrest
RESTH equ 0x1E
org 0
; ++++++++++++++++++++++++++++++++++++++++++++++++
; + Unterprogramm : 16 Bit / 16 Bit +
; + +
; + Parameter : +
; + AL : Dividend (LB) +
; + AH : Dividend (HB) +
; + BL : Divisor (LB) +
; + BH : Divisor (HB) +
; + +
; + Rueckgabe : +
; + AL : Ergebnis (LB) +
; + AH : Ergebnis (HB) +
; + RESTL : Rest (LB) +
; + RESTH : Rest (HB) +
; ++++++++++++++++++++++++++++++++++++++++++++++++
div1616 clrf RESTL ;Loesche alten Divisionsrest
clrf RESTH
movlw 10 ;Anzahl der schleifendurchlaeufe
movwf MDUCOUNT
;
loopdiv rlf AH,w
rlf RESTL,f
rlf RESTH,f
;
; Subtraktion ( REST = REST - B )
;
movf BL,w
subwf RESTL,f ;Durchfuehrung der Subtraktion (RESTL = RESTL - BL)
movf BH,w
btfss STATUS,C ;Fand ein Unterlauf von RESTL statt ?
incfsz BH,w ;Notiere Uebertrag
subwf RESTH,f ;Durchfuehrung der Subtraktion (RESTH = RESTH - BH)
;
btfsc STATUS,C ;Ist Subtraktion gueltig ?
goto divsubok
;
; Rueckaddition ( REST = REST + B )
;
movf BL,w ;Subtraktion war ungueltig (Unterlauf) !
addwf RESTL,f ;Durchfuehrung der Rueckaddition (RESTL)
movf BH,w
btfsc STATUS,C ;Fand ein Ueberlauf von RESTL statt ?
incfsz BH,w ;Es fand ein Uebertrag statt ! RESTH + 1
addwf RESTH,f
;
bcf STATUS,C
;
divsubok rlf AL,f
rlf AH,f
;
decfsz MDUCOUNT,f ;Sind alle 16 Bits bearbeitet worden ?
goto loopdiv
retlw 0