.:: Rubrique Arithmétique >> Soustraction ::.
Are you reeaady !!!
Bon la soustraction est quasiement pareille que
l'addition donc je vais aller très vite.
En gros au lieu d'additionner 2
nombres 2 à 2 comme dans l'algorithme de l'addition, on les soustrait.
Si on a compris l'addition, on comprend la sosutraction, sinon... heu... je
sais pas. Bon bref, changeons de sujet, je vais en profiter pour vous apprendre
à manipuler les variables, je vais vous montrer comment on passe des arguments
vers une fonction (exactement comme en c) parceque pour l'instant on ne peut que
additionner (ou soustraire) _NOMBRE1 avec _NOMBRE2.
En c on appelle une
fonction comme ça:
ma_fonction(arg1, arg2, arg3);En fait quand le compilateur c compile un appel de fonction, il met en premier les arguments sur la pile, il appelle la fonction via l'instruction call et enfin "supprime" les éléments sur la pile:
push arg3 push arg2 push arg1 call ma_fonction add sp, 6 ;6 car on a empilé 3 éléments de 2 octets chacun => 3*2Et au moment où l'on rentre dans la fonction, la pile est comme ça:
------------------------ sp -| adresse | | de retour | | pour 'ret' | ------------------------ sp+2 -| argument1 | | |_arg1 | | | ------------------------ sp+4 -| argument2 | | |_arg2 | | | ------------------------ sp+6 -| argument3 | | |_arg3 | | | ------------------------ || || \/ \/ Suite de la piledonc pour atteindre l'argument 2 par exemple il suffit de faire ça:
mov si, sp ;on pointe sur le haut de la pile add si, 4 ;fait sp<-sp+4 (cf le graph précédent) mov si, [ss:si] ;maintenant 'si' pointe sur arg2ensuite lorsqu'on sort de la fonction on restore sp pour qu'il ait la même valeur qu'avant l'appel de la fonction, donc comme le 'ret' s'est déjà chargé d'enlever l'adresse de retour qui se trouvait sur la pile, il suffit d'ajouter 6 à la pile pour pointer sur le haut de l'ancienne pile. d'où le:
add sp, 6Et voilà vous pouver faire une soustraction maintenant.
On teste:
Et voilà !! motivé pour la suite?
Voici les différentes rubriques:
Daemonium Albus,
blaizard@caramail.com