Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Bout de code posé là !

Modérateur : Jérémy

ASM: Division sur 16 bits
F6FCO
Avatar de l’utilisateur
Expert
Expert
Messages : 2846
Âge : 99
Enregistré en : décembre 2017
Localisation : Banlieue sud de Klyntar
Contact :

#1 Message par F6FCO » mar. 14 mai 2024 20:16

Division sur 16 bits.

Code : Tout sélectionner

;********************************************************************
;                
Division sur entiers 16bits _ F6FCO                  
;     Il faut préalablement déclarer les variables ci-dessous sur 16 bits         
dividende16diviseur16quotient16reste16valeur1 et valeur2 sur 16bits                
;                                                                
poids faible dans dividende16                                        
poids fort de la valeur à diviser dans dividende16+1,               
;                                                                
poids faible dans diviseur16                                        
poids fort du diviseur dans diviseur16+1                            
;                                                                
Le résultat sera dans quotient16 et quotient16+1                       
Le reste sera dans reste16 et reste16+1                                    
;                                                                
Cette division utilise la routine soustraction16                         
;                                        
;********************************************************************   
division16    
        
on vérifie si c'est une division par zéro, si c'est le cas on charge le dividende dans le quotient.
        ; 
dividende/0=dividendepas cohérent mathématiquement mais nécessaire dans le projet en cas de ligne
        
horizontale (Y=0ou verticale (X=0).
        
movf    diviseur16,diviseur16
        btfss    STATUS
,Z
        bra    div16
div_zero    movf    diviseur16
+1,diviseur16+1
        btfsc    STATUS
,Z
        bra    div_quot
div16        
on initialise quotient=0
        clrf    quotient16
        clrf    quotient16
+1
        
reste=dividende
        movff    dividende16
,reste16
        movff    dividende16
+1,reste16+1
div16_1        movf    reste16
+1,w
        subwf    diviseur16
+1,w
        
test si poids fort reste>diviseur ?
        
btfss    STATUS,C                    
        bra    div16_3
        
test si poids fort reste=diviseur sinon on sort
div16_4        bz    div16_2
findiv16    
return
div16_2        test si poids faible reste>=diviseur
        movff    reste16
,WREG
        subwf    diviseur16
,w
        btfss    STATUS
,C
        bra    div16_3
        bz    div16_3
        bra    findiv16
div16_3        
reste=dividende-diviseur
        nop
        movff    reste16
,valeur1
        movff    reste16
+1,valeur1+1
        movff    diviseur16
,valeur2
        movff    diviseur16
+1,valeur2+1
        call    soustraction16            
résultat dans valeur1valeur1+1
        movff    valeur1
+1,reste16+1
        movff    valeur1
,reste16
        
quotient +1
        bcf    STATUS
,C
        movlw    1
        addwf    quotient16
        
on additionne le carry dans le poids fort
        movf    STATUS
,C
        andlw    0x1
        addwf    quotient16
+1
        bra    div16_1
div_quot    
en cas de division par zéro on charge le dividende dans le quotient
        movff    dividende16
,quotient16
        movff    dividende16
+1,quotient16+1
        
return
            
 
Une porte nand prend 2 bits en entrée... :eek:

Retourner vers « Recueil de mini programmes »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité