Bonjour,
L'instruction CMP d'intel compare deux valeurs , ok ;
elle retourne son resultat dans le registre EFLAG.
j'aurais besoin de connaitre son algorithme , ou je pourrai le trouver ???
Merci.
Bonjour,
L'instruction CMP d'intel compare deux valeurs , ok ;
elle retourne son resultat dans le registre EFLAG.
j'aurais besoin de connaitre son algorithme , ou je pourrai le trouver ???
Merci.
Bonsoir,
Il faut savoir avant tout que lors des comparaisons et des sauts conditionnels, le micro-processeur effectue des opérations qui, dans tous les cas, mettraient à jour les flags. En fait, ces flags sont indépendants de l'opération effectuée, mais prennent automatiquement une valeur sur une condition donnée. C'est le cas de Z, par exemple, qui est l'indicateur de zéro, et qui passe donc à un si le résultat de la dernière opération effectuée, quelle qu'elle soit, est nul. Avec un bémol cependant : en fonction des opérations à mener, le micro-processeur peut décider d'inhiber la mise à jour des flags, mais pas de modifier leur comportement.
Ensuite, sur pratiquement tous les micro-processeurs, l'instruction de comparaison CMP procède en fait à une soustraction de l'opérande, mais sans mettre à jour l'accumulateur-cible.
Si le résultat est nul, les opérandes sont égales. C'est pour cela que les instructions conditionnelles de saut JE (Jump If Equal) et JZ (Jump if Zero) sont en fait les mêmes et partagent le même code opération.
Les flags de dépassement et autres permettent d'obtenir plus d'informations sur les opérandes initiales. S'il y a eu dépassement, c'est que le soustracteur était plus grand que l'opérande, d'où JG ou JGE.
J'essaye de faire exactement pareille que l'instruction CMP mais en programmation.
Je joint un projet et les resultats sont différents donc c'est pas bon et je ne sais pas comment faire.
Pour info : j'ai pris un extrait de code de l'émulateur Bochs.
Relis bien mon commentaire ! L'instruction CMP est une soustraction. Rien d'autre. La seule différence est que le résultat n'est pas stocké dans le registre de départ.
Les différents flags ne sont pas liés en soi à l'instruction CMP ou à une autre. Ils se mettent à jour automatiquement avec chaque nouveau résultat arithmétique. Par exemple, « Z » se met à un chaque fois que le résultat de la dernière opération est nul. Donc, dans le cas d'une soustraction en particulier, un résultat nul indique que les deux opérandes sont égales.
Les instructions de saut conditionnel, elles, ne s'appuient que sur l'état de ces flags et sont encore moins liées avec les opérations précédentes. « JZ » et « JE », par exemple, sauteront vers l'adresse de destination si et seulement si « Z » est à un, peu importe que ce flag soit passé à cette valeur du fait de la dernière opération arithmétique ou que tu l'aies artificiellement forcé en modifiant EFLAGS à la main.
Tu aurais pu chercher un peu, le détail de ces flags n'étant pas difficile à trouver : http://en.wikipedia.org/wiki/EFLAGS .
D'une manière générale, en essayant d'aborder l'assembleur de manière générale sur un grand panel de micro-processeurs et pas en se cantonnant au x86, et en essayant de faire un peu de logique combinatoire, avec de l'électronique. Si tu veux bien aborder l'assembleur, je te conseille d'explorer les micro-processeurs 8 bits tels que le 6809 ou le Z80, et les PIC contemporains. Le x86 est trop sophistiqué pour bien en percevoir le fonctionnement logique.
Pour répondre à ta question :
C = Carry = Retenue. C'est la retenue issue d'une opération arithmétique ou logique en binaire, qui fonctionne exactement de la même façon qu'une opération sur papier en décimal. Elle est extrêmement utilisée, même en tant que simple flag. Les x86 proposent même les instructions CLC et STC pour aller le modifier directement. Lors de décalages à gauche ou à droite, C récupère le bit sortant.
Mais j'insiste sur le fait que sa principale fonction sert de retenue. Par exemple, en binaire, 1b + 1b = 10b. Je pose donc « 0b » et je retiens « 1b », dans ce flag.
En outre, cette retenue est complémentée lors d'une soustraction : http://www.developpez.net/forums/d10...-cmp-derivees/
A = Adjust = Retenue intermédiaire. C'est l'état de la retenue après 4 bits. C'était utile lorsque les micro-processeurs étaient majoritairement huit bits, et pour faire de la conversion BCD.
S = Sign = Bit de signe. En binaire naturel, avec n bits, tu peux représenter une plage continue de 2^n nombres. Par défaut, ils sont tous positifs, comme les kilomètres sur le compteur kilométrique d'une automobile. Maintenant, si tu pars de zéro et que tu soustrait un, tu te retrouves avec 111111111b de la même façon que tu aurais 99999999 kilomètres sur une automobile. Par conséquent, tu divises ta plage en deux : le bas de la plage pour les nombres positifs et le haut de la plage pour les négatifs. Et comme, en binaire, il n'y a que deux chiffres, les nombres positifs commenceront donc forcément par 0 et les nombres négatifs par 1.
Le bit S est donc l'image exacte du bit de poids fort du résultat.
P = Parity = Bit de parité. Ça te dit si ton résultat est pair ou pas. Comme, en binaire, on travaille en base 2, un nombre pair finit forcément par 0, de la même façon qu'en décimal, un nombre multiple de dix finit forcément par 0 lui aussi. Comme ce bit fonctionne de manière similaire au bit Z et passe à un lorsque que ton nombre est pair, c'est donc l'image inversée du bit de poids faible du résultat.
La réponse est derrière les liens que je t'ai proposés.
Au travail, maintenant.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager