Çà ne casse pas trois pattes à un canard mais çà peut être pratique, comme tout bon bricoleur j'aime bien avoir des outils et j'ai commencé à remplir ma caisse en codant des routines d'addition et soustraction sur 16 et 32bits.
Çà m'évitera de réinventer la roue à chaque fois que j'en aurai besoin.
Si çà peut servir...
Code : Tout sélectionner
;**********************************************************************
;
; NOM: Caisse à outils
; Date: 05/04/2018
; Auteur: F6FCO JC Buisson
; xtal: 4Mhz
;
; Routines d'addition et soustraction 16 et 32bits
;
;
;
;**********************************************************************
List p=16F88
#include <p16F88.inc>
__CONFIG _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_OFF & _WDT_OFF & _XT_OSC
__CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF
OPTIONVAL EQU H'0008'
;*********************************************************************
CBLOCK 0x020
valeur1:4 ; déclarée en 32bits
valeur2:4 ; déclarée en 32bits
ENDC
;**********************************************************************
org 0x0000 ; Adresse de départ après reset
init
bsf STATUS,RP0 ; bank1
clrf ANSEL ; broches du CAN en I/O
movlw OPTIONVAL ; charger masque
movwf OPTION_REG ; initialiser registre option
clrf TRISB ; PORTB en sortie
bcf STATUS,5 ; bank0
main
; cette partie est un exemple d'utilisation, on va soustraire 16C3284E-324AFF12, le résultat sera E478293C stocké dans valeur2
; raz des variables
clrf valeur1
clrf valeur1+1
clrf valeur1+2
clrf valeur1+3
clrf valeur2
clrf valeur2+1
clrf valeur2+2
clrf valeur2+3
; Stockage des valeurs dans les variables, on place la première valeur dans valeur1
movlw 0x4e
movwf valeur1
movlw 0x28
movwf valeur1+1
movlw 0xC3
movwf valeur1+2
movlw 0x16
movwf valeur1+3
; on place la valeur à soustraire dans valeur2
movlw 0x12
movwf valeur2
movlw 0xff
movwf valeur2+1
movlw 0x4A
movwf valeur2+2
movlw 0x32
movwf valeur2+3
;call addition16 ; appel de la routine d'addition sur 16bits, résultat dans valeur2 et valeur2+1
;call addition32 ; appel de la routine d'addition sur 32bits, résultat dans valeur2 et valeur2+1, valeur2+2 valeur2+3
;call soustraction16 ; appel de la routine de soustraction sur 16bits, résultat dans valeur2 et valeur2+1
call soustraction32 ; appel de la routine de soustraction sur 32bits, résultat dans valeur2, valeur2+1, valeur2+2 et valeur2+3
goto main
;********************************************************************
; Addition sur 16bits *
; Il faut préalablement déclarer des variables sur 16 bits *
; valeur1:2 et valeur2:2 *
; *
; Placer le poids faible de la première valeur dans valeur1 *
; et le poids fort dans valeur1+1 *
; Placer le poids faible de la valeur à additionner dans valeur2 *
; et le poids fort dans valeur2+1 *
; *
; Appeler la procédure addition16 et le résultat de *
; valeur1+valeur2 sur 16bits sera dans les 2 octets de valeur2 *
;********************************************************************
addition16
movf valeur1,W
addwf valeur2
; on additionne le carry dans le poids fort
movf STATUS,W
andlw 0x1
addwf valeur2+1
movf valeur1+1,W
addwf valeur2+1
return
;********************************************************************
; Addition sur 32bits *
; Il faut préalablement déclarer des variables sur 16 bits *
; valeur1:4 et valeur2:4 *
; *
; Placer le poids faible de la première valeur dans valeur1 *
; et les poids forts dans valeur1+1, valeur1+2, valeur1+3. *
; Placer le poids faible de la valeur à additionner dans valeur2 *
; et les poids forts dans valeur2+1, valeur2+2, valeur2+3 *
; *
; Appeler la procédure addition32 et le résultat de *
; valeur1+valeur2 sur 32bits sera dans les 4 octets de valeur2 *
;********************************************************************
addition32
; addition poids faibles
movf valeur1,W
addwf valeur2
movf STATUS,W ; on additionne le carry
andlw 0x1
addwf valeur2+1
; addition poids+1
movf valeur1+1,W
addwf valeur2+1
movf STATUS,W
andlw 0x1
addwf valeur2+2
; addition poids+2
movf valeur1+2,W
addwf valeur2+2
movf STATUS,W
andlw 0x1
addwf valeur2+3
; addition poids+2
movf valeur1+3,W
addwf valeur2+3
return
;********************************************************************
; Soustraction sur 16bits *
; Il faut préalablement déclarer des variables sur 16 bits *
; valeur1:2 et valeur2:2 *
; *
; Placer le poids faible de la première valeur dans valeur1 *
; et le poids fort dans valeur1+1 *
; Placer le poids faible de la valeur à soustraire dans valeur2 *
; et le poids fort dans valeur2+1 *
; *
; Appeler la procédure soustraction16 et le résultat de *
; valeur1-valeur2 sur 16bits sera dans les 2 octets de valeur2 *
;********************************************************************
soustraction16
; on fait le complément à 2 de valeur2 et valeur2+1
movf valeur2,W
xorlw 0xFF
addlw 0x1
movwf valeur2
movf valeur2+1,w
xorlw 0xFF
movwf valeur2+1
; addition des poids faibles
movf valeur1,W
addwf valeur2
; addition du carry
movf STATUS,W
andlw 0x1
addwf valeur2+1
; addition des poids forts, résultat dans valeur2/valeur2+1
movf valeur1+1,W
addwf valeur2+1
return
;********************************************************************
; Soustraction sur 32bits *
; Il faut prélablement déclarer les variables sur 32bits *
; valeur1:4 et valeur2:4 *
; *
; Placer le poids faible de la première valeur dans valeur1 *
; et les poids forts dans valeur1+1, valeur+2, valeur+3 *
; Placer le poids faible de la valeur à soustraire dans valeur2 *
; et les poids forts dans valeur2+1, valeur2+2, valeur2+3 *
; *
; Appeler la procédure soustraction16 et le résultat de *
; valeur1-valeur2 sur 32bits sera dans les 4 octets de valeur2 *
;********************************************************************
soustraction32
; on fait le complément à 2 de tous les octets de valeur2
movf valeur2,W
xorlw 0xFF
addlw 0x1
movwf valeur2
movf valeur2+1,w
xorlw 0xFF
movwf valeur2+1
movf valeur2+2,w
xorlw 0xFF
movwf valeur2+2
movf valeur2+3,w
xorlw 0xFF
movwf valeur2+3
; addition des octets faibles
movf valeur1,W
addwf valeur2
; addition du carry
movf STATUS,W
andlw 0x1
addwf valeur2+1
; addition des octets+1, résultat dans valeur2+1
movf valeur1+1,W
addwf valeur2+1
; addition du carry
movf STATUS,W
andlw 0x1
addwf valeur2+2
; addition des octets+2, résultat dans valeur2+2
movf valeur1+2,W
addwf valeur2+2
; addition du carry
movf STATUS,W
andlw 0x1
addwf valeur2+3
; addition des octets+3, résultat dans valeur2+3
movf valeur1+3,W
addwf valeur2+3
return
END


Si on continu comme ça, on va réécrire 