MULTIPLICATION POUR FAMILLE PIC 16F

 


C'est un segment de programme qui permet de réaliser une multiplication simple ou double pour un PIC des familles 16F, 12F et 10F.
N est le multiplicande, D le multiplicateur, R le résultat..
L'opération est effectuée comme suit : N x D -> R

 

Multiplication simple précision : N (8 bits) x D (8 bits) = R (16 bits)






La convention de notation pour définir le nombre R est la suivante :
pour le nombre R ( 16bits ), l'octet de poids fort est R1, l'octet de poids faible est R0.

L'algorithme est classique pour une multiplication binaire.
La seule difficulté de compréhension réside dans le traitement de l'addition.

Supposons qu'en base binaire D0 = 1111 1111

Repère lettre A :
L'octet D0 est décalé à droite.
Le bit de poids faible de D0 est injecté dans le bit Carry du registre d'état.

Repère lettre B :
On teste le bit de Carry.
Si il est à 1, on part effectuer la première addition.

Repère lettre C :
C'est là que réside la difficulté.
On additionne W (donc D0) à l'octet de poids fort du nombre R.
R1 + D0 -> R1
En fait, ce résultat va être décalé huit fois vers la droite.
Ceci revient au bout du compte à additionner D0 avec R0,
Comme si on réalisait l'opération binaire à la main.

Repère lettre D :
On décale le nombre R (16 bits) vers la droite.

Le programme
Le programme source en assembleur Microchip pour une multiplication 8 bits x 8 bits, clic droit et enregistrer la cible sous ...
Le programme inclut un exemple de calcul pour vérification.
A remarquer que le contenu du multiplicateur D0 est perdu lors de la multiplication.
Il faudra donc le sauvegarder avant de réaliser l'opération s'il y en a besoin ultérieurement.

Multiplication double précision : N (16 bits) x D (16 bits) = R (32 bits)
Tirée de la documentation Microchip.
La convention de notation pour définir les nombres est la suivante :
pour le multiplicande N ( 16bits ), l'octet de poids fort est N1, l'octet de poids faible est N0,
pour le multiplicateur D ( 16bits ), l'octet de poids fort est D1, l'octet de poids faible est D0,
pour le résultat R ( 32 bits ), l'octet de poids fort est R3, l'octet de poids faible est R0,.

L'algorithme est identique à celui de la multiplication simple précision,
L'addition s'exécutant sur 16 bits et le décalage sur 32 bits.
 

Ligne 72

Ligne 73
Ligne 76

Il faut créer une variable supplémentaire, dont on utilisera un bit, afin de mémoriser une retenue temporaire.
Si le résultat de l'incrémentation de R3 , ligne 71, est 00 alors il existe une retenue.
Cette retenue sera perdue lors de l'addition, ligne 75.
Il est donc nécessaire de la mémoriser dans une variable temporaire Flag.
On teste si la retenue temporaire existe; si oui, elle est restituée ligne 77 et utilisée ligne 79 lors du décalage.

Le programme source en assembleur Microchip pour une multiplication 16 bits x 16 bits, clic droit et enregistrer la cible sous ...
Le programme inclut un exemple de calcul pour vérification.
A remarquer que le contenu du multiplicateur D est perdu lors de la multiplication.
Il faudra donc le sauvegarder avant de réaliser l'opération s'il y en a besoin ultérieurement.

Multiplication : N (16 bits) x D (8 bits) = R (24 bits)

Dans la même optique, une multiplication d'un nombre de 16 bits par un nombre de 8 bits, lorsqu'il est nécessaire d'optimiser le code.
Le programme source en assembleur Microchip pour une multiplication 16 bits x 8 bits, clic droit et enregistrer la cible sous ...
Le programme inclut un exemple de calcul pour vérification.
A remarquer que le contenu du multiplicateur D est perdu lors de la multiplication.
Il faudra donc le sauvegarder avant de réaliser l'opération s'il y en a besoin ultérieurement.

Les programmes ont étés réalisés à coup de copier / coller. Il se peut qu'une erreur se soit glissée dans les commentaires.

Mise à jour : 01 Juin 2008
Accueil