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

32 Bit / 32 Bit Integerdivision mit PIC18XXX Befehlssatz

Dieser Code ist mit der Entwicklungsumgebung MPLAB IDE 7.20 von Microchip geschrieben.
include             prozessortype.inc

Temp_math_Var  UDATA_ACS

A_L       RES 1
A_H       RES 1
A_UL      RES 1
A_UH      RES 1
B_L       RES 1
B_H       RES 1
B_UL      RES 1
B_UH      RES 1
REST_L    RES 1
REST_H    RES 1
REST_UL   RES 1
REST_UH   RES 1
MDUCount  RES 1     ; Bitzaehler

math1                CODE

                      ;  +++++++++++++++++++++++++++++++++++++++
                      ;  +  Unterprogramm : 32 Bit / 32 Bit    +
                      ;  +                                     +
                      ;  +    Parameter :                      +
                      ;  +     A_L : Dividend (LB)             +
                      ;  +     A_H : Dividend (HB)             +
                      ;  +     A_UL: Dividend (ULB)            +
                      ;  +     A_UH: Dividend (UHB)            +
                      ;  +     B_L : Divisor  (LB)             +
                      ;  +     B_H : Divisor  (HB)             +
                      ;  +     B_UL: Divisor  (ULB)            +
                      ;  +     B_UH: Divisor  (UHB)            +
                      ;  +                                     +
                      ;  +    Rueckgabe :                      +
                      ;  +     A_L    : Ergebnis (LB)          +
                      ;  +     A_H    : Ergebnis (HB)          +
                      ;  +     A_UL  : Ergebnis (ULB)          +
                      ;  +     A_UH   : Ergebnis (UHB)         +
                      ;  +     REST_L : Rest (LB)              +
                      ;  +     REST_H : Rest (HB)              +
                      ;  +     REST_UL: Rest (ULB)             +
                      ;  +     REST_UH: Rest (UHB)             +
                      ;  +++++++++++++++++++++++++++++++++++++++
math_div3232:
                      clrf    REST_L             ;Loesche alten Divisionsrest
                      clrf    REST_H
                      clrf    REST_UL
                      clrf    REST_UH
                      movlw   d'32'             ;Anzahl der Schleifendurchlaeufe
                      movwf   MDUCount
                      bcf     STATUS,C
                      ;
loopdiv3232:          rlcf    A_UH,w
                      rlcf    REST_L,f
                      rlcf    REST_H,f
                      rlcf    REST_UL,f
                      rlcf    REST_UH,f
                      ;
                      ;  Subtraktion ( REST = REST - B )
                      ;
                      movf    B_L,w
                      subwf   REST_L,f        ;Durchfuehrung der Subtraktion (REST_L = REST_L - B_L)
                      movf    B_H,w
                      subwfB  REST_H,f        ;Durchfuehrung der Subtraktion (REST_H = REST_H - B_H -C)
                      movf    B_UL,w
                      subwfB  REST_UL,f       ;Durchfuehrung der Subtraktion (REST_UL = REST_UL - B_UL -C)
                      movf    B_UH,w
                      subwfB  REST_UH,f       ;Durchfuehrung der Subtraktion (REST_UH = REST_UH - B_UH -C)
                      ;
                      bc      divsubok3232             ;Ist Subtraktion gueltig ?
                      ;
                      ;  Rueckaddition ( REST = REST + B )
                      ;
                      movf    B_L,w      ;Subtraktion war ungueltig (Unterlauf) !
                      addwf   REST_L,f   ;Durchfuehrung der Rueckaddition (REST_LB)
                      movf    B_H,w
                      addwfc  REST_H,f   ;Durchfuehrung der Rueckaddition (REST_HB)
                      movf    B_UL,w
                      addwfc  REST_UL,f  ;Durchfuehrung der Rueckaddition (REST_UL)
                      movf    B_UH,w
                      addwfc  REST_UH,f  ;Durchfuehrung der Rueckaddition (REST_UH)
                      bcf     STATUS,C
                      ;
divsubok3232:         rlcf    A_L,f
                      rlcf    A_H,f
                      rlcf    A_UL,f
                      rlcf    A_UH,f
                      ;
                      decfsz  MDUCount,f     ;Sind alle 32 Bits bearbeitet worden ?
                      goto    loopdiv3232
                      return