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