.:: Rubrique Arithmétique >> Addition ::.
Maintenant passons aux choses sérieuses... l'addition ! vous êtes prêt? c'est
parti
Etudions d'abord la méthode de résolution d'une addition qu'on
apprend en primaire: un petit exemple pour commencer? oui mais en
héxadécimal:
|
1 |
1 |
1 |
|
|
|
|
|
|
|
E |
5 |
h |
|
+ |
F |
F |
4 |
3 |
h |
|
| |||||
|
1 |
0 |
0 |
2 |
8 |
h |
|=> 0xE5+0xFF43=0x10028
ça parait tout simple comme ça? et bien on va voir... il suffit de traduire cet algorithme en assembleur:
Déjà on définit nos deux nombres _NOMBRE1 et _NOMBRE2:
_NOMBRE1 =
0xE5
_NOMBRE2 = 0xFF43
On considère pour simplifier les choses que _NOMBRE2 est le nombre le plus grand.
De plus, il va falloir enregistrer le résultat dans une variable on va choisir la variable _NOMBRE2 car c'est celle qui nécessite le plus de mémoire. Le résultat va donc écraser la valeur initiale de _NOMBRE2 et pour ne pas avoir de problème de conflit (car le résultat sera d'au maximum un quartet plus long que _NOMBRE2) on alloue à _NOMBRE2 un octet suplémentaire.
Mais que se PASTIS? je RICARD KRONENBOURG LABEL...

Ce qui nous donne en assembleur:
Maintenant passons a l'algorithme:
| |- * On initialise p à 0 (ce sera notre compteur); |
| |- * On initialise r à 0 (ce sera notre retenu); |
| |- * On boucle tant que p < min(_NBR1.LONG, _NBR2.LONG) |
| ____|- * s = ((BYTE)_NBR1.DATA[p]) + ((BYTE)_NBR2.DATA[p]) + r; |
| ____|- * r = octet de poids fort de s; |
| ____|- * On incrémente p; |
| |- * On ajuste la somme si _NBR1.LONG != _NBR2.LONG; | |- * On ajoute le reste final; |
Ce qui donne... traduit en asm:
Et maintenant un petit test pour vérifier: (je n'ai pas pris les mêmes nombres que l'exemple pour vous montrer que ça marche très bien pour des grands nombres)
_NOMBRE1 = 0123456789ABCDEF (16 chiffres)
et
_NOMBRE2 = 0FEDCBA9876543210FEDCBA987654321 (32 chiffres)
Amusez-vous à calculer ça avec la calculette de WINDOWS
... on peut pas.

Le compte est bon !!!!
Et voilà c'est terminé pour l'addition... demain, la multiplication ?... non?
Voici les différentes rubriques:
Daemonium Albus,
blaizard@caramail.com