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

8 Bit / 8 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     ; Dividend
B_L       RES 1     ; Divisor
REST_L    RES 1     ; Rest
MDUCount  RES 1     ; Bitzaehler


math1                CODE

                      ;  ++++++++++++++++++++++++++++++++++++++++++++++++
                      ;  +  Unterprogramm : 8 Bit / 8 Bit               +
                      ;  +                                              +
                      ;  +    Parameter :                               +
                      ;  +     A_L : Dividend                            +
                      ;  +     B_L : Divisor                             +
                      ;  +                                              +
                      ;  +    Rueckgabe :                               +
                      ;  +     A_L    : Ergebnis                         +
                      ;  +     REST_L : Rest                             +
                      ;  ++++++++++++++++++++++++++++++++++++++++++++++++
math_div88:
                      clrf    REST_L         ;Loesche alten Divisionsrest
                      movlw   8              ;Anzahl der Schleifendurchlaeufe
                      movwf   MDUCount
                      bcf     STATUS,C
                      ;
loopdiv88             rlcf    A_L,w
                      rlcf    REST_L,f
                      ;
                      ;  Subtraktion ( REST = REST - B )
                      ;
                      movf    B_L,w
                      subwf   REST_L,f     ;Durchfuehrung der Subtraktion (REST_L = REST_L - B_L)
                      ;
                      bc      divsubok88   ;Ist Subtraktion gueltig ?
                      ;
                      ;  Rueckaddition ( REST = REST + B )
                      ;
                      movf    B_L,w        ;Subtraktion war ungueltig (Unterlauf) !
                      addwf   REST_L,f     ;Durchfuehrung der Rueckaddition (REST_L)
                      bcf     STATUS,C
                      ;
divsubok88            rlcf    A_L,f
                      ;
                      decfsz  MDUCount,f   ;Sind alle 8 Bits bearbeitet worden ?
                      goto    loopdiv88
                      return