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

verschiedne Subtraktionsroutinen mit PIC16XXX Befehlssatz

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

B_AL    equ 0x72
B_AH    equ 0x73
B_AUL   equ 0x74
B_BL    equ 0x75
B_BH    equ 0x76
B_BUL   equ 0x77

                    ; Subtraktion mit addwf (8Bit)
                    ; W=B_AL-B_BL, Vorsicht: B_BL wird veraendert
sub8_addwf          movlw     h'FF'
                    xorwf     B_BL,f
                    incf      B_BL,w
                    addwf     B_AL,w
                    btfsc     STATUS,C
                    goto      positiv
                    goto      negativ


                    ; Subtraktion  mit addwf   (24Bit)
                    ; A=A-B, Vorsicht: B_BL, B_BH, und B_BUL werden veraendert
                    ;
sub24_addwfb        ; B=NOT(B)
                    movlw     h'FF'
                    xorwf     B_BL,f
                    xorwf     B_BH,f
                    xorwf     B_BUL,f
                    ;
                    ; B=B+1
                    incf      B_BL,f
                    btfsc     STATUS,Z
                    incf      B_BH,f
                    btfsc     STATUS,Z
                    incf      B_BUL,f
                    ;
                    ; Addition mit aadwf (24Bit)
                    ; A=A+B
                    movf      B_BL,w
                    addwf     B_AL,f      ; Addition Bits  0-7
                    ;
                    movf      B_BH,w
                    btfsc     STATUS,C    ; fand ein Uebertrag statt ?
                    incfsz    B_BH,w      ; Uebertrag notieren (zaehlen). Verursacht Uebertrag einen
                    ;                       weiteren Uebertrag, so bleibt B_AH unveraendert.
                    addwf     B_AH,f      ; Addition Bits 8-15
                    ;
                    movf      B_BUL,w
                    btfsc     STATUS,C    ; fand ein Uebertrag statt ?
                    incfsz    B_BUL,w     ; Uebertrag notieren (zaehlen). Verursacht Uebertrag einen
                    ;                       weiteren Uebertrag, so bleibt B_AUL unveraendert.
                    addwf     B_AUL,f     ; Addition Bits 16-23
                    ;
                    btfsc     STATUS,C    ; Bei Ueberlauf Ergebnis positiv
                    goto      positiv
                    goto      negativ


                    ; Subtraktion  mit subwf (24Bit)
                    ; A=A-B
                    ;
sub24_subwfb        movf     B_BL,w
                    subwf    B_AL,f      ; Subtraktion Bits 0-7
                    ;
                    movf     B_BH,w
                    btfss    STATUS,C    ; fand ein Uebertrag statt ?
                    incfsz   B_BH,w      ; Uebertrag B_BH notieren (zaehlen). Verursacht Uebertrag einen
                    ;                         weiteren Uebertrag, so bleibt B_AH unveraendert.
                    subwf    B_AH,f      ; Subtraktion Bits 8-15 (wenn B_BH <> 0)
                    ;
                    movf     B_BUL,w
                    btfss    STATUS,C    ; fand ein Uebertrag statt ?
                    incfsz   B_BUL,w     ; Uebertrag B_BUL notieren (zaehlen). Verursacht Uebertrag einen
                    ;                         weiteren Uebertrag, so bleibt B_AUL unveraendert.
                    subwf    B_AUL,f     ; Subtraktion Bits 16-23 (wenn B_BUL <> 0)
                    ;
                    btfsc    STATUS,C    ; Ergebnis positiv oder negativ
                    goto     positiv
                    goto     negativ


positiv             nop
                    nop

negativ             nop
                    nop