von Matthias Zizelmann - www.zizelmann.de
zurück

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