.:: 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